Подтвердить что ты не робот

Получить имена свойств через отражение COM-объекта

Как я могу прочитать все имена свойств через отражение COM-объекта в С#? Я знаю, как получить свойство, если знаю имя.

comObject.GetType().InvokeMember("PropertyName", System.Reflection.BindingFlags.GetProperty, null, comObject, null);

но что такое, когда я хочу сбросить все свойства?

PropertyInfo[] properties = t.GetProperties();

Этот способ не работал с Com-объектами. Если я получаю GetMembers(), я получаю следующие члены:

Name: GetLifetimeService
Name: InitializeLifetimeService
Name: CreateObjRef
Name: ToString
Name: Equals
Name: GetHashCode
Name: GetType

считает Криса

4b9b3361

Ответ 1

У вас есть члены класса __ComObject, базового класса .NET для RCW.

COM имеет небольшую поддержку для отражения, если COM-класс реализует интерфейс IDispatch, интерфейс автоматизации. Нестандартно, это интерфейс, который используют языки сценариев для совершения вызовов. IDispatch.GetIDsOfNames() всегда реализуется, но вы должны знать имя элемента вверх. IDispatch.GetTypeInfo() предоставляет доступ к библиотеке типов для coclass, но не всегда реализуется. Перевод информации о библиотеке типов в метаданные - это несовершенное искусство, основная причина, по которой .NET хочет, чтобы вы сделали это с помощью Tlbimp.exe. Если вы хотите использовать подход времени исполнения, то вы, вероятно, извлечете выгоду из источника для управляемой версии Tlbimp, доступной здесь.

Выполнение этого фронта во время сборки всегда лучше, вы делаете это, добавляя ссылку на библиотеку типов (обычно встроенную в исполняемый файл) или запуская Tlbimp.exe самостоятельно. Теперь у вас есть класс оболочек .NET interop, в котором есть все члены базового COM-класса и интерфейсов. В этот момент вам, вероятно, больше не нужно отражать:)

Ответ 2

Я только что опубликовал статью CodeProject о том, как сделать Отражение с объектами COM на основе IDispatch. В статье представлен небольшой вспомогательный класс С# DispatchUtility, который легко включить в другие проекты. Внутри он использует настраиваемое объявление IDispatch и .NET TypeToTypeInfoMarshaler для преобразования IDispatch ITypeInfo в богатый экземпляр .NET.

В вашем примере вы можете вызвать DispatchUtility.GetType(comObject, true), чтобы вернуть экземпляр .NET Type, который вы могли бы затем вызвать GetProperties или GetMembers.

Я также предоставил версию исходного кода DispatchUtility на StackOverflow в ответ на Как перечислить членов COM-объекта в С#?