Вызвать метод, используя Reflection для COM-объекта - PullRequest
7 голосов
/ 05 мая 2010

У меня есть экземпляр 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. Равно
  6. GetHashCode
  7. GetType

Где находится метод RefreshAll? И как я могу вызвать это?

Ответы [ 2 ]

12 голосов
/ 08 июля 2010

Вы не можете использовать GetMethod для COM-объектов, вы должны использовать другой способ:

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

Я использую этот способ в старом проекте, который использует COM, поэтому он должен работать нормально для вас.

5 голосов
/ 07 февраля 2015

Я понимаю, что это поздний ответ, но c # 4 немного меняет ситуацию с введением ключевого слова dynamic, разработанного с учетом COM-взаимодействия.

MSDN:

Сценарий взаимодействия COM, который команда C # специально нацеливала в выпуске C # 4, программировал для приложений 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

Теперь вы не увидите RefreshAll() в завершении оператора Visual Studio, так что не пугайтесь. Он скомпилируется.

[1] Понимание динамического ключевого слова в C # 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...