Вызвать метод, используя 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()
Мало есть только эти методы:
- GetLifetimeService
- InitializeLifetimeService
- CreateObjRef
- Нанизывать
- Равно
- GetHashCode
- 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 завершение оператора, так что не пугайтесь. Это скомпилирует.