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

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

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

2 ответа

Решение

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

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

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

Я понимаю, что это поздний ответ, но 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

Другие вопросы по тегам