使用反射在COM对象上调用方法

7

我有一个COM对象实例...它是这样创建的:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application");
Object application = Activator.CreateInstance(type);

当我尝试调用一个方法时:

type.GetMethod("RefreshAll").Invoke(application, null);

-> type.GetMethod("RefreshAll") 返回null。当我尝试使用type.GetMethods()获取所有方法时,只有以下这些方法:

  1. GetLifetimeService
  2. InitializeLifetimeService
  3. CreateObjRef
  4. ToString
  5. Equals
  6. GetHashCode
  7. GetType

RefreshAll方法在哪里?我该如何调用它?

2个回答

13

你不能在COM对象上使用GetMethod,你必须使用不同的方法:

this.application.GetType().InvokeMember("RefreshAll", BindingFlags.InvokeMethod, null, this.application, null);

我在一个旧项目中使用这种方法,该项目使用COM,所以对您应该没问题。


1
虽然这是一个很好的答案,但是C# 4通过下面的“dynamic”关键字使得执行COM-interop变得更加容易。 - user585968
1
注意,我在我的工具https://github.com/awaescher/RepoZ中使用`dynamic`时发现了严重的内存泄漏问题。我转而采用了Nathan W的答案来解决这个问题!更多信息请参见:https://dev59.com/cVwY5IYBdhLWcg3wCUE7#34123315 - Waescher
请查看MickyD在回答中的其他评论,了解如何处理此问题... - Waescher

5
我知道这个答案有点晚,但是随着引入 dynamic 关键字,C# 4 对 COM-interop 进行了一些改变。

MSDN:

C# 团队在 C# 4 发布中专门针对 COM interop 场景进行了设计,其中包括与 Microsoft Office 应用程序(如 Word 和 Excel)的编程。其目的是使此任务在 C# 中像在 Visual Basic 中一样易于实现和自然。[1]

你的代码现在变成了:

Type type = TypeDelegator.GetTypeFromProgID("Broker.Application");
dynamic application = Activator.CreateInstance(type);
application.RefreshAll(); // <---- new in c# 4

现在在Visual Studio的语句完成中你将看不到RefreshAll(),但不必惊慌,它可以编译通过。
[1] 了解 C# 4 中的动态关键字

1
注意,我在我的工具https://github.com/awaescher/RepoZ中使用`dynamic`时发现了严重的内存泄漏问题。我转而采用了Nathan W的答案来解决这个问题!更多信息请参见:https://dev59.com/cVwY5IYBdhLWcg3wCUE7#34123315 - Waescher
@Waescher 奇怪的是微软最初是为 COM 制作的。我怀疑你只是没有正确发布事物,这与动态无关。 - user585968
@Waescher 哦,我刚做了一些谷歌搜索,看起来你是正确的。这真是个讨厌的小“动态”。干得好! - user585968
@Waescher 不,谢谢你。我想我没有注意到它在我的东西中,因为应用程序不会运行很长时间就退出了。希望微软能够纠正。 :) - user585968
我为我的项目编写了一个小助手类来处理COM对象,链接在这里:https://github.com/awaescher/RepoZ/blob/master/RepoZ.Api.Win/PInvoke/Combridge.cs。这个类确保COM对象被正确释放,并且可以访问方法和属性而不需要使用“dynamic”。以下是它的预期用法:https://github.com/awaescher/RepoZ/blob/master/RepoZ.Api.Win/PInvoke/Explorer/ExplorerWindowActor.cs - Waescher
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接