Kann eine verwaltete DLL von nicht verwaltetem C ++ aus aufgerufen werden?

8

Ist es möglich, CLR-DLL (eine, die zum Beispiel mit C # gemacht wird) von nicht verwaltetem C ++ - Code aufzurufen?

Ich brauche eine DLL, die nicht irgendwie verwaltet wird, vielleicht sogar über einen Proxy-C ++ - Prozess, der mit C ++ / CLI erstellt wird?

    
Net Citizen 16.06.2010, 14:56
quelle

3 Antworten

6

Die CLR-DLL müsste als eine sichtbare COM-Baugruppe erstellt werden. Wenn Sie die C # kontrollieren, ist es eine einfache Neuerstellung, ansonsten ist es praktisch unmöglich, sie direkt zu verwenden.

    
SWeko 16.06.2010, 14:59
quelle
5

@SWeko gab Ihnen die beste Antwort, wenn Sie die ursprüngliche DLL ändern können und Ihr nicht verwalteter Code auf den Zugriff auf eine COM-Wohnung zurückgreifen kann (entweder ein eigener Thread mit ::CoInitialize() oder der aufrufende Thread des nicht verwalteten Codes hat eine einheitliche Wohnung).

Wenn das nicht der Fall ist, ist es die beste Lösung, eine "verwaltete" C ++ - DLL als Wrapper für die verwaltete C # -Assembly zu erstellen. Es heißt C ++ / CLI. Sie können nicht verwaltete C-API-Operationen verfügbar machen und innerhalb der Implementierung diese an die verwalteten APIs delegieren. Es funktioniert ziemlich gut und anders als beim Aufruf von COM-APIs gibt es keine Thread-Affinitätsprobleme.

    
David Gladfelter 16.06.2010 15:07
quelle
4

Ich bin mir nicht sicher, ob es passt, aber vielleicht ist "Reverse PInvoke" eine Option.

Wenn Sie zuerst von Ihrem C # zu C ++ aufrufen können, können Sie dem C ++ einen .net-Delegaten zur Verfügung stellen, wo er als Funktionszeiger verwendet werden kann. Sie können dann von Ihrem C ++ mit diesem Funktionszeiger zu C # aufrufen.

%Vor%

Es kann einige Tricks geben, wenn der GC den Delegierten früh sammelt, egal welche Klasse der Delegat haben muss, wenn er nicht sofort in RegisterRead

verwendet wird     
Greg Domjan 16.06.2010 16:09
quelle

Tags und Links