2

为了与另一个用 .Net 2.0 编写的项目兼容,我们不得不提出一个 COM 互操作(较新的应用程序在 .Net 4.0 中)。这会起作用,因为 2.0 进程将能够在 .Net 4.0 中使用 SxS 执行。为了根据我的理解进行 COM 互操作,我必须执行以下操作:

Type myClass = Type.GetTypeFromProgID("Net4Assembly.Assembly4");
object myInstance = Activator.CreateInstance(myClass);
IAssembly4 assembly4Interface = (IAssembly4)myInstance;
assembly4Interface.CallMethod();

我已经创建了 COM 组件并注册了它,这工作正常。但问题是,由于用 2.0 编写的项目在我们部门之外,我想找到一种方法来使用反射在上面的第 3 行中进行转换。到目前为止,我在使用 COM 对象上的反射的 Invoke 方法中找到了建议

但这对我不起作用,因为当我在 COMObject 类型的“myInstance”中获取对象的所有方法时,我只能看到该链接中提到的方法。我收到此错误:

未知名称。(来自 HRESULT 的异常:0x80020006 (DISP_E_UNKNOWNNAME))

我想我应该以某种方式将其COMObject转换为接口,然后我就可以访问这些方法了?我不应该能够从 中提取接口COMObject,然后使用反射调用该方法吗?我尝试GetInterfaces(了 )COMObject但没有返回任何内容。

4

1 回答 1

0

我不确定这是否可行,但假设您No Misspelled Assembly Name尝试过这样的事情

Type myClass  = Type.GetTypeFromProgID("Net4Assembly.Assembly4");
object myInstance = Activator.CreateInstance(myClass );
//object[] arguments = new object[] //add parameters if youre assembly expects them here
object result = myClass .InvokeMember("SubtractTwoNumbers", BindingFlags.InvokeMethod,
     null, myInstance, arguments);
于 2013-04-01T20:54:38.040 回答