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?
@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.
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