在 C# 中,我有一个更新数据库的 OracleConnection,以及对 C# 调用以更新数据库的旧版 VB6 DLL 的引用(在 DLL 中,它使用 ADODB.Connection 对象)。
我需要将它们都包装在一个大事务中,以便托管和非托管更新一起回滚或提交。
我尝试切换 C# 类,使其继承自 System.EnterpriseServices.ServicedComponent 并用 [Transaction(TransactionOption.Required)] 装饰,然后在启动调用序列的方法上使用 [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)
我已经验证我的类是公共的、具体的,并且有一个无参数的构造函数。不过,它不会实例化。
我是否需要对我的程序集进行强类型化并将其放入 COM+ 包中,然后才能对其进行调试?我会假设,使用 VS2010,我可以直接进入 ServicedComponent 继承代码。
我使用 COM+ 已经 8 年了,这是我第一次尝试让它在 C# 中工作,所以任何帮助都将不胜感激!
另外,如果我在这里走的是一条愚蠢的道路,并且有一种更简单的方法可以将我的托管和非托管代码放入同一个事务中,请赐教!
在 Google 上呆了几个小时并没有多大帮助。
非常感谢!!