2010-06-16 19 views
8

Czy można wywołać DLL CLR (jeden na przykład, który jest wykonany z C#) z niezarządzanego kodu C++?Możliwe wywołanie zarządzanej biblioteki DLL z niezarządzanego C++?

Potrzebuję biblioteki DLL, która nie jest w stanie w jakiś sposób do niej zadzwonić, może nawet poprzez proces proxy C++, który jest zbudowany z C++/CLI?

+2

Można owinąć że udało dll w produkt plik wykonywalny, który jest aplikacją konsolową i pobiera argumenty wiersza poleceń, a wyprowadza wynik do 'stdout'. Możesz wtedy nazwać to tak jak każdy inny exe. Nie idealny, ale może zadziałać. Mam nadzieję, że nie używasz wielu wątków, ponieważ nie wiem, czy to zadziała. –

+1

Sam podałeś odpowiedź. Napisz proxy w C++/CLI (lub C++ .Net lub zarządzanym C++ lub jak jest on dzisiaj wywoływany), a następnie wywołaj ten serwer proxy z niezarządzanego kodu C++. – Patrick

+0

może to pomaga: http://stackoverflow.com/questions/1058897/can-c-cli-be-used-to-call-net-code-from-native-c-applications – smerlin

Odpowiedz

6

Biblioteka DLL środowiska CLR musiałaby zostać zbudowana jako zespół widoczny dla COM. Jeśli masz kontrolę nad C#, jest to prosta przebudowa, w przeciwnym razie jest prawie niemożliwe, aby użyć go bezpośrednio.

+0

@Hamish, czy chcesz opracować? –

+0

Dodano "... aby użyć go bezpośrednio." W przeciwnym razie znaczenie było błędne, przepraszam. – SWeko

+0

@SWeko: Zawsze jest Reverse PInvoke. Więc nie jest to niemożliwe. – Aamir

5

@SWeko dał ci najlepszą odpowiedź, czy można zmodyfikować oryginalny DLL a niekontrolowana kod może polegać na uzyskaniu dostępu do mieszkania COM (zarówno własny wątek z ::CoInitialize() nazwie lub wywołującego wątku kodu niekontrolowana ma konsekwentna apartament).

Jeśli tak nie jest, najlepszym rozwiązaniem jest utworzenie "zarządzanej" biblioteki DLL C++ jako opakowania na zarządzanym zestawie C#. Nazywa się C++/CLI. Możesz ujawnić niezarządzane operacje interfejsu API C, a wewnątrz ich wdrażania delegować zarządzane interfejsy API. Działa całkiem nieźle iw przeciwieństwie do wywoływania COM API, nie ma problemów z powinowactwem do wątków.

4

Nie jestem pewien, czy pasuje, ale być może opcja "Reverse PInvoke" jest opcją.

Jeśli możesz najpierw zadzwonić z C# do C++, możesz przekazać delegata .net do C++, który może być używany jako wskaźnik funkcji. Następnie można wywołać z C++ do C# za pomocą tego wskaźnika funkcji.

public delegate int Read(int target); 
[DllImport("yourC++.dll")] 
static extern void RegisterRead(Read x); 
Read m_Read = new Read(yourClass.Read); 

RegisterRead(m_Read); 

Nie może być kilka sztuczek z GC odbierającej delegata wcześnie, co klasa pełnomocnik, konieczne może być przypięty, jeśli nie jest po prostu stosować natychmiast w RegisterRead

Powiązane problemy