Самый быстрый способ вызвать метод COM-объектов без использования RCW
-
03-07-2019 - |
Вопрос
Я пытаюсь найти самый чистый и быстрый способ вызова методов COM-объектов.
Я использовал RCW для объекта, но каждый раз, когда выходит новая версия стороннего COM-объекта, его GUID меняется, что делает RCW бесполезным, поэтому мне пришлось изменить и начать использовать
Type mytype = Type.GetTypeFromProgID("MyCOMApp.Application");
так что каждый раз, когда выходит новая версия COM-объекта, мне не нужно перекомпилировать и повторно развертывать свое приложение.
На данный момент я использую отражение типа mytype.InvokeMemeber
но мне кажется, что это очень медленно по сравнению с простым вызовом RCW.
Как все остальные решают проблему изменения версий сторонних COM-объектов, сохраняя при этом скорость RCW?
Решение
Если вы хотите упростить вызовы при отражении, вы можете использовать VB.NET и выполнять поздние вызовы переменной, типизированной как Object.VB.NET поможет с призывами к размышлению.Вы также можете установить ссылку на Microsoft.VisualBasic.dll и выполнить вызов CallByName, чтобы помочь с вызовами отражения.
Однако меняется ли IID (GUID интерфейса) или GUID класса?Если изменяется GUID класса, то вы можете определить интерфейс один раз, а затем получить тип посредством вызова GetTypeFromProgID.Получив это, вы можете передать тип методу CreateInstance класса Activator, а затем привести его к интерфейсу, который не изменится.
Однако если IID изменится, вам придется каждый раз использовать отражение.