【问题标题】:Calling method from COM Object using Reflection使用反射从 COM 对象调用方法
【发布时间】: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


【解决方案1】:

我不确定这是否可行,但假设你有 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);

【讨论】:

  • 您是否验证了程序集名称是否正确,确保大小写正确。我不确定为什么它不工作。这只是您想要完成的另一种方式。 .I would start simple 例如,如果您必须在文件名上使用Hit F2,请仔细检查assembly 的名称,然后将其复制粘贴到您的代码中,这样您就不必担心拼写错误
  • 事实证明问题出在我在界面中定义方法的方式上。我使用了显式实现,这会导致该方法不公开?我也使用了 BindingFlags.NonPublic ,但仍然无法达到该方法!无论如何......它现在正在工作。非常感谢您的帮助。
  • 太棒了。我非常高兴我能够帮助我从我在Delphi 的日子里如何做事和尝试C# conversion 真棒我想我已经把你带到了Golden Path 两个大拇指向上Farhad
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多