2012-05-16 18 views
14

Jak mogę odczytać wszystkie nazwy właściwości za pomocą odbicia obiektu COM w języku C#? Wiem, jak zdobyć nieruchomość, jeśli znam nazwę.Uzyskaj nazwy właściwości za pomocą odbicia obiektu COM

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

ale kiedy chcę zrzucić wszystkie właściwości?

PropertyInfo[] properties = t.GetProperties(); 

Ta metoda nie działa z obiektami Com-Object. Jeśli robię GetMembers() otrzymuję tych Członków:

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

chodzi Chris

+2

Nie jest jasne, o co prosicie, bo już jej udzielenia. 'GetProperties' zwróci wszystkie właściwości typu. –

+0

Cóż, 'PropertyInfo.Name'? –

+2

Ale nie z obiektu COM! –

Odpowiedz

12

Masz członków klasy __ComObject, podstawowe klasy NET z RCW.

COM ma niewielkie wsparcie dla refleksji, o ile kokos COM zawiera narzędzie IDispatch, interfejs automatyzacji. Nie jest to niezwykłe, jest to interfejs używany przez języki skryptowe do nawiązywania połączeń. IDispatch.GetIDsOfNames() jest zawsze zaimplementowany, ale musisz znać nazwę członka z góry. Funkcja IDispatch.GetTypeInfo() daje dostęp do biblioteki typów dla Coclass, ale nie zawsze jest zaimplementowana. Tłumaczenie informacji o bibliotekach typów na metadane jest niedoskonałą sztuką, główną przyczyną tego, że .NET chce, abyś zrobił to z góry za pomocą Tlbimp.exe. Jeśli chcesz zastosować podejście runtime, prawdopodobnie skorzystasz ze źródła zarządzanej wersji Tlbimp, available here.

Robiąc to z przodu w czasie kompilacji jest zawsze najlepszy, można to zrobić, dodając odwołanie do biblioteki typów (zwykle osadzone w pliku wykonywalnego) lub uruchamiając Tlbimp.exe samodzielnie. Teraz masz klasę wrapper .NET interop, który ma wszystkie elementy leżące u podstaw coclass COM i interfejsów. W tym momencie prawdopodobnie już nie potrzebujesz refleksji :)

10

Właśnie opublikowałem artykuł CodeProject o tym, jak wykonać Reflection with IDispatch-based COM objects. Artykuł zawiera małą pomocniczą klasę C# DispatchUtility, którą można łatwo dołączyć do innych projektów. Wewnętrznie używa niestandardowej deklaracji IDispatch i TypeToTypeInfoMarshaler .NET do konwersji ITypeInfo IDispatch do bogatej instancji typu .NET.

W tym przykładzie można zadzwonić pod numer DispatchUtility.GetType(comObject, true), aby uzyskać instancję .NET Type, którą można następnie nazwać GetProperties lub GetMembers.

Mam również wersję kodu źródłowego DispatchUtility na StackOverflow w odpowiedzi na How to enumerate members of COM object in C#?

+0

Dziękuję za wspaniały artykuł. Próbowałem go używać, ale napotkałem problem. Otrzymuję komunikat o błędzie: "biblioteka typów została wyeksportowana z zestawu clr i nie można jej ponownie zaimportować" Używam Activator.createInstance do utworzenia obiektu. Narzędzie, dla którego tworzę obiekt COM, to Tibco Spotfire v6.5.2 Proszę o pomoc. Dzięki – Prabhakar

+0

@ Bill Menees, czy Twoja klasa pomocnicza może być użyta w [PowerShell do utworzenia wystąpienia obiektu COM] (http://stackoverflow.com/questions/41945859/use-powershell-to-create-instance-of-com-object)? – craig

Powiązane problemy