Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射从COM对象调用方法_C#_.net_Reflection_Com - Fatal编程技术网

C# 使用反射从COM对象调用方法

C# 使用反射从COM对象调用方法,c#,.net,reflection,com,C#,.net,Reflection,Com,为了允许与另一个用.NET2.0编写的项目兼容,我们必须提出一个COM互操作(较新的应用程序在.NET4.0中)。这将起作用,因为2.0进程将能够在.NET4.0中使用SxS执行。据我所知,为了实现COM互操作,我必须执行以下操作: Type myClass = Type.GetTypeFromProgID("Net4Assembly.Assembly4"); object myInstance = Activator.CreateInstance(myClass); IAssembly4 as

为了允许与另一个用.NET2.0编写的项目兼容,我们必须提出一个COM互操作(较新的应用程序在.NET4.0中)。这将起作用,因为2.0进程将能够在.NET4.0中使用SxS执行。据我所知,为了实现COM互操作,我必须执行以下操作:

Type myClass = Type.GetTypeFromProgID("Net4Assembly.Assembly4");
object myInstance = Activator.CreateInstance(myClass);
IAssembly4 assembly4Interface = (IAssembly4)myInstance;
assembly4Interface.CallMethod();
我已经创建了COM组件并注册了它,它工作得很好。但问题是,由于2.0中编写的项目不在我们部门的范围内,我想找到一种方法,使用反射在上面第3行中进行铸造。到目前为止,我发现了一个建议

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

未知的名字。(HRESULT的例外:0x80020006(DISP_E_UNKNOWNNAME))


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

我不确定这是否有效,但假设您没有拼写错误的程序集名称,请尝试类似的操作

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);

使用标头中的system.Runttime.InteropServices,该代码是否有效。。?此
错误最常见的问题是,您试图调用的程序集名称中有一个拼写错误,我不确定它是否有效,但我会尝试此
dynamic myInstance=Activator.CreateInstance(myClass);myInstance.CallMethod()是的,这是我检查的第一件事。程序集名称应该是正确的,因为如果我将其强制转换为IAssembly4接口,我已经能够调用CallMethod()。我还使用反射仔细检查了我正在调用的方法(CallMethod())的名称,这也是正确的。我也不明白链接中提到的,为什么在这种情况下InvokeMember和InvokeMethod是不同的?@I4V:不幸的是,包含此代码的项目使用的是.Net 2.0,因此没有动态代码。您是否验证了程序集名称是否正确确保大小写准确。。我不知道为什么它不起作用这只是另一种方式做你想做的事<代码>我会开始简单的
例如,如果你必须在文件名上点击F2
并复制粘贴到你的代码中,那么你不必担心打字错误,因为问题在于我在接口中定义方法的方式。我使用了显式实现,这会导致方法不公开?我也使用了BindingFlags.NonPublic,但仍然无法访问该方法!不管怎样,它现在正在工作。非常感谢你的帮助。太棒了。我非常高兴我能帮上忙我从我在
Delphi
的日子里做事情的方式来看这件事,并且做了尝试的
C#转换
太棒了我想我已经把你带到了
黄金之路
竖起两个大拇指
Farhad