【发布时间】:2013-03-23 00:02:05
【问题描述】:
为了与另一个用 .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 行中进行转换。到目前为止,我在Invoke method using Reflection on COM Object找到了一个建议
但这对我不起作用,因为当我在 COMObject 类型的“myInstance”中获取对象的所有方法时,我只能看到该链接中提到的方法。我收到此错误:
未知名称。 (来自 HRESULT 的异常:0x80020006 (DISP_E_UNKNOWNNAME))
我想我应该以某种方式将COMObject 转换为接口,然后我才能访问这些方法?我不应该能够从COMObject 中提取接口,然后使用反射调用该方法吗?我从COMObject 尝试了GetInterfaces(),但没有返回任何内容。
【问题讨论】:
-
该代码是否可以在标题中使用
using system.Runttime.InteropServices..?这个Error最常见的问题是因为你有a Misspelling in the Assembly Name你正在尝试Invoke -
我不确定它是否会起作用,但我会试试这个
dynamic myInstance = Activator.CreateInstance(myClass); myInstance.CallMethod(); -
是的,这是我检查的第一件事。程序集名称应该是正确的,因为如果我将它转换为 IAssembly4 接口,我已经能够调用 CallMethod()。我还使用反射仔细检查了我正在调用的方法的名称(CallMethod()),这也是正确的。我也没有得到链接中提到的,为什么 InvokeMember 和 InvokeMethod 在这种情况下是不同的?
-
@I4V:不幸的是,拥有此代码的项目使用的是 .Net 2.0,因此没有动态。
标签: c# .net reflection com