Самый быстрый способ вызвать метод COM-объектов без использования RCW

StackOverflow https://stackoverflow.com/questions/609054

  •  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 изменится, вам придется каждый раз использовать отражение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top