2010-12-16 11 views
5

Czy istnieje sposób wywołania C# dll z niezarządzanej aplikacji C++ bez użycia COM?Wywołanie C# dll z niezarządzanej aplikacji C++ bez COM

+0

Zawsze można [osadzić Mono] (http://www.mono-project.com/Embedding_Mono) ... – cdhowie

+0

można to zrobić za pomocą biblioteki DLL trybu mieszanego. –

+0

możliwy duplikat [Wywołanie kodu C# z C++] (http://stackoverflow.com/questions/778590/calling-c-sharp-code-from-c) – cdiggins

Odpowiedz

5

Można to zrobić przy użyciu Reverse P/Invoke - przykład i dyskusji here.

+1

Dziękuję. To interesujące. –

2

W rzeczywistości możliwe jest dezasemblowanie, modyfikacja IL i ponowne złożenie go za pomocą wyeksportowanych funkcji. Zmywałem to kilka lat temu i stworzyłem aplikację, która zdemontował bibliotekę dll, dostarczył listę funkcji, które potencjalnie mogłyby zostać wyeksportowane - pozwalając użytkownikowi wybrać je, a następnie ponownie napisać IL i ponownie złożyć wszystko. Następnie mógłbym wywołać bezpośrednio do biblioteki dll z niezarządzanego kodu ... lub p-invoke do biblioteki dll z kodu zarządzanego (niezbyt praktyczne, ale interesujące).

Oczywiście istnieje powód, dla którego nie jest to obsługiwane w samych językach .net (nawet jeśli jest obsługiwane w MSIL). I nie byłoby to wykorzystać w produkcji:

http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

+1

Jest obsługiwany w C++/CLI, automatycznie tworzy thunk, który załaduje CLR, gdy funkcja __declspec (dllexport) będzie statyczną funkcją C++/CLI. To jest oczywiście Wielka Sztuczka, nie można uruchomić zarządzanego kodu bez ładowania CLR. –

+0

@Hans Gdy dodasz eksport do swojej IL, ILASM zrobi wszystko, co jest wymagane, aby twój zestaw był używany jak natywny. –

1

mogę być nieco późno, ale sprawdź this zewnątrz.

Za pomocą tego małego zadania msbuild można utworzyć bibliotekę C#, którą można wywołać tak, jakby była natywną biblioteką DLL. (np. wypisz wtyczki dla aplikacji, które wymagają, aby były rodzimymi bibliotekami dll)

Aha i nie zapomnij użyć project template, który ustawi wszystko dla ciebie.