使用Reflection从COM对象调用方法

时间:2013-04-01 20:40:30

标签: c# .net reflection com

为了与.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

中找到了一个建议

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

  

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

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

1 个答案:

答案 0 :(得分: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);