2009-08-20 14 views
20

Mam interfejs zdefiniowany w pliku IDL, który chciałbym użyć w języku C#. Czy istnieje sposób przekonwertować IDL na coś użytecznego w C#?Konwertuj plik IDL interfejsu na C#

+0

Co to jest "coś do wykorzystania"? – Achim

+0

Coś użyteczne w języku C#. Coś, co się skompiluje. –

Odpowiedz

27

Jednym ze sposobów jest uruchomienie MIDL na IDL w celu utworzenia biblioteki typów (.tlb). Wymaga to bloku library w IDL. Gdy już posiadasz .tlb, możesz uruchomić na nim tlbimp.exe, aby uzyskać definicję C#/Interop DLL.

+0

, a następnie można użyć [JetBrains dotPeek] (https://www.jetbrains.com/decompiler/), aby wyświetlić definicję C# z wygenerowanej biblioteki Interop DLL. –

4

Jakie typy danych/struktury są używane w IDL? Najpierw należy zdefiniować typy danych w języku C#, jeśli nie ma już typu inbuild.

Możesz użyć następującego narzędzia do konwersji struktur, ale musisz ręcznie zweryfikować ouput.

Download: http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2008_01.exe

Narzędzie to jest opisane w Accessing Windows API Constants and Structs for P/Invoke.

Oryginalny artykuł z stycznia 2008 r. Jest teraz dostępny tylko jako .CHM help file download, połączony u dołu https://msdn.microsoft.com/magazine/msdn-magazine-issues. Na razie kod źródłowy można znaleźć pod adresem http://clrinterop.codeplex.com/.

+0

Gdzie znajduje się dokumentacja>? –

+1

@ ChrisEskay Ponieważ link do artykułu MSDN nie był już poprawny, skorzystałem z możliwości aktualizacji informacji o tym narzędziu. –

1

Na przykład ostatnio użyłem interfejsu API drukowania XPS i potrzebowałem interfejsów xpsobjectmodel.h. Windows SDK na szczęście ma xpsobjectmodel.idl.

Najpierw wygenerowałem plik TLB z MIDL i użyłem TLBIMP do wygenerowania odpowiedniego zestawu DLL gotowego do dodania w sekcji "References ..." w moim projekcie C#.

Należy używać narzędzi o poprawnej wersji dla swojego projektu. np. jeśli twoja struktura projektu opiera się na 3.5, użycie tlbimp z zestawu narzędzi 4.0 nie będzie działać.