Was sind die Optionen, wenn es darum geht, eine .NET DLL aus einem Win32-Prozess zu verwenden? Ich muss im Grunde eine C # -DLL von einem Win32-Prozess verwenden.
Ich habe momentan eine mögliche Lösung, die das Hinzufügen der C # -DLL zum GAC (mit RegAsm.exe) und dann das Aufrufen der C # -DLL über COM-Wrapped-Aufrufe erfordert. Diese Lösung ist jedoch ziemlich schwer. Es erfordert, dass die .NET-DLL dem GAC auf allen Computern hinzugefügt wird, die ausgeführt werden sollen dieser Win32-Prozess.
Wäre es möglich, dies zu tun, ohne dass RegAsm
aufgerufen werden muss, bevor die C # -DLL verwendet werden kann?
Sie können registrierungsfreie COM mit .NET COM-Komponenten verwenden - siehe hier .
Eine weitere Option ist die Verwendung von C ++ / CLI als Bridge. Die Leute sind meist damit vertraut, nichtverwaltete APIs mit verwaltetem Code zu versehen, aber es funktioniert tatsächlich in beide Richtungen - es ist möglich, mit /clr
zu kompilieren und trotzdem eine .dll
-Assembly mit reinen nicht verwalteten Exporten zu erzeugen aus dem nicht verwalteten Code wie üblich aufgerufen. Hier ist ein sehr einfaches Beispiel, das System::String::ToUpper
auf diese Weise verfügbar macht:
Dies erzeugt wrapper.dll
- hybridverwaltete / nicht verwaltete Assembly - und eine Exportbibliothek wrapper.lib
. Letzteres kann in einer reinen nativen Anwendung wie folgt verwendet werden:
In der Praxis lädt es die CLR-Laufzeit in den aufrufenden Prozess (es sei denn, es ist bereits dort geladen) und verschicken von nativem Code zu verwaltetem Code transparent - all das geschieht durch den C ++ / CLI-Compiler.
Es gibt zwei Möglichkeiten.
Zuerst können Sie Kostenlose COM-Registrierung für die Registrierung verwenden.
Zweitens können Sie die CLR-Hosting-APIs verwenden, um die CLR direkt zu hosten und zu laden die Versammlung. Dies funktioniert ohne COM.
Tags und Links .net c# mixed-mode