C# 内には、DB を更新する OracleConnection と、DB を更新するために C# が呼び出すレガシー VB6 DLL への参照があります (DLL 内では、ADODB.Connection オブジェクトを使用します)。
管理された更新と管理されていない更新の両方が一緒にロールバックまたはコミットされるように、両方を 1 つの大きなトランザクションにラップする必要があります。
System.EnterpriseServices.ServicedComponent から継承し、[Transaction(TransactionOption.Required)] で装飾されるように C# クラスを切り替えてから、呼び出しシーケンスを開始するメソッドで [AutoComplete] を使用して、最終的に OracleConnection と VB6 にヒットするようにしました。 DLL の呼び出し。
このような:
using System.EnterpriseServices;
{
[Transaction(TransactionOption.Required)]
public class MyClassTx: ServicedComponent
{
private MyClass1 _myClass1;
public MyClassTx()
{
}
// This method automatically commits the transaction if it succeeds.
[AutoComplete]
public void DoStuffTransactionally()
{
// Calls into different objects, doing some work that I'd like to have
// a big transaction around.
_MyClass1 = new MyClass1()
_MyClass1.DoSomeStuff();
}
}
}
ただし、テスト ハーネスが MyClassTx をインスタンス化しようとすると、次のエラーが発生します。
{System.EnterpriseServices.RegistrationException: Invalid ServicedComponent-derived classes were found in the assembly.
(Classes must be public, concrete, have a public default constructor, and meet all other ComVisibility requirements)
クラスが public で具象的で、パラメーターのないコンストラクターを持っていることを確認しました。それでも、インスタンス化されません。
デバッグする前に、アセンブリを厳密に型指定して COM+ パッケージに入れる必要がありますか? VS2010 を使用すれば、ServicedComponent を継承するコードにステップインできると思っていたでしょう。
COM+ を使用してから約 8 年になりますが、C# で動作させるのはこれが初めてです。
また、ここでばかげた道を進んでいて、マネージド コードとアンマネージド コードを同じトランザクションに入れる簡単な方法がある場合は、教えてください!
数時間 Google を使用しても、あまり役に立ちませんでした。
どうもありがとう!!