1

我正在尝试使用来自 C#(4.0) 服务的 COM 调用 C++ 和 C# DLL。DLL 已在同一服务器 (win2003) 上注册,并且当前正在使用 COM 从 C++ 服务调用而没有问题(超过 100k 次)。DLL 公开了一个接口“ExecuteTransaction”,它接受两个参数。

当我尝试从 C# 调用它们时,我看到了一系列不同的错误

COM DLL 启动但出错:

- 0x800706be;远程过程调用失败。;
8004d00a;[Microsoft][ODBC driver for Oracle]在资源管理器中登记失败

然后 C# 服务将出错:

System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.Runtime.InteropServices.COMException:操作中止(来自 HRESULT 的异常:0x80000007)
   --- 内部异常堆栈跟踪结束 ---
   在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags invokeAttr,对象目标,对象 [] 参数,布尔 [] byrefModifiers,Int32 文化,字符串 [] 命名参数)
   在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)

另一个 C++ DLL 将简单地挂起事件日志中的消息:

MS DTC 组件遇到内部错误。进程正在终止。错误细节:非 MS DTC XA 库在函数 oerhms ntdll!KiFastSystemCallRet + 0x0 + 0xb837ce8 中引发异常

代码是

using System;
using System.Collections.Generic;
using System.Reflection;
using System.EnterpriseServices;
using System.Data;
using System.Threading;
using System.Runtime.InteropServices;

....
int orderId = 65827;
int datasetId = 119849;
object objBM = null;
System.Guid bmGuid = new Guid("{43AFB035-9CFF-11D3-859D-0008C729AAEA}");

Type objBMType = Type.GetTypeFromCLSID(bmGuid);
objBM = Activator.CreateInstance(objBMType);
object[] args = {orderId,datasetId};
object c = objBMType.InvokeMember("ExecuteTransaction", System.Reflection.BindingFlags.InvokeMethod, null, objBM, args);

调用 C# COM+ dll 也会产生问题。该服务将出错

System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.Runtime.InteropServices.COMException:远程过程调用失败。(来自 HRESULT 的异常:0x800706BE)
   --- 内部异常堆栈跟踪结束 ---
   在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags invokeAttr,对象目标,对象 [] 参数,布尔 [] byrefModifiers,Int32 文化,字符串 [] 命名参数)
   在 System.RuntimeType.InvokeMember(字符串名称、BindingFlags bindingFlags、Binder binder、Object 目标、Object[] providedArgs、ParameterModifier[] 修饰符、CultureInfo 文化、String[] namedParams)

服务和 dll 都在同一台服务器上。我究竟做错了什么?我是否缺少 using 语句?我查看了 WEB 上的示例,然后尝试了但都给出了相同的错误?有趣的是,DLL 启动但内部失败,就像我调用它们的方式不正确一样

4

0 回答 0