2009-05-17 7 views
13

Potrzebuję zintegrować jakiś staroświecki 32-bitowy kod - dla którego nie mam kodu źródłowego - w projekcie w taki sposób, aby można go było wywołać z 64-bitowego zestawu .NET. Oryginalny kod jest zaimplementowany jako 32-bitowy obiekt COM w bibliotece DLL. System Windows nie zezwala na bezpośrednie połączenia z obiektów 64 do 32-bitowych, więc szukam inspiracji, jak sobie z tym poradzić.Od 64 do 32 bitów Interop - jak?

W jaki sposób można uzyskać dostęp do starego 32-bitowego obiektu COM z 64-bitowego zestawu .NET?

AKTUALIZACJA: Odkryliśmy, że komponent COM sam był opakowaniem wokół jakiegoś ANSI C, z którego pochodzi oryginalne źródło. Udało nam się skompilować to w Visual Studio jako natywną 64-bitową bibliotekę dll i zaimportować ją do .NET - przepraszam, aby przenieść bramki!

+0

Komentarz, ponieważ tego nie zrobiłem, ale musisz upewnić się, że uruchamiasz obiekt COM jako serwer poza procesem. Jeśli załadujesz go jako proces, będzie działał jako 64-bitowy, co nie powiedzie się. –

Odpowiedz

8

Najlepszym rozwiązaniem jest utworzenie serwera COM, który otoczy Twoją 32-bitową bibliotekę DLL. Możesz wtedy wywołać to z kodu 64-bitowego.

Here is an explanation podstawowych pojęć.

+0

Przesunąłem nieco bramki, ponieważ odkryliśmy kod źródłowy, który doprowadził nas do innego rozwiązania. Przyjmuję tę odpowiedź, ponieważ uważam, że najlepiej odpowiada na oryginalne pytanie i linki do przydatnych materiałów do czytania. –

3

Należy utworzyć dwa procesy komunikujące się z IPC. W ten sposób jeden może być 32-bitowy, a jeden może być 64-bitowy. Musisz stworzyć program 32, który łączy się z obiektem COM i udostępnia jego API poprzez jakiś mechanizm IPC, taki jak nazwany potok. W ten sposób twój program .NET może uzyskać do niego dostęp z innego procesu.

+0

To podejście działa, ale jeśli już używasz COM, dlaczego chcesz przejść do nazwanych potoków zamiast używać tylko współdziałania COM? –

+0

@Reed Copsey: Oh, tak, oczywiście możesz użyć tego dla COM. Ale moje podejście jest bardziej ogólne; może również działać w przypadku normalnych bibliotek. – Zifre

+0

Myślałem o użyciu WCF do IPC przy użyciu potoków nazwanych. Jedynym problemem jest to, że oba końce rury muszą mieć tę samą definicję interfejsu, która musi znajdować się w zespole 32-bitowym. Cała eksploduje, gdy spróbujesz go uruchomić. –

3

Sprawdź to blog post. Można odwołać się do 32-bitowego zestawu COM z 64-bitowej aplikacji .NET przy użyciu opakowania uruchamialnego przez środowisko wykonawcze. Krótka wersja jest następująca ...

  1. Zastosowanie TLBIMP.exe aby utworzyć 64-bitowy Runtime wywoływalnym Wrapper:

    tlbimp.exe foo.dll /machine:x64 /out:Interop.Foo.dll

  2. Rejestracja zespół COM (nie RCW), jeśli jeszcze nie.

    regsvr32.exe foo.dll

  3. referencyjne RCW (np Interop.Foo.dll) ze swojej aplikacji. Zmień konfigurację kompilacji na x64 i pozwól, aby gra była erotyczna.

+0

To nie jest rozwiązanie pierwotnego problemu. –