为了与.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
},但没有返回任何内容。
答案 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);