Wie rufe ich C ++ / CLI (.NET) -DLLs von nicht verwalteten Standard-Nicht-.NET-Anwendungen auf?

8

In der nicht verwalteten Welt konnte ich eine __declspec (dllexport) schreiben oder alternativ eine .DEF-Datei verwenden, um eine Funktion verfügbar zu machen, um eine DLL aufrufen zu können. (Aufgrund des Namensmangels in C ++ für den __stdcall, habe ich Aliase in die .DEF-Datei geschrieben, so dass bestimmte Anwendungen bestimmte exportierte DLL-Funktionen wiederverwenden können.) Nun möchte ich eine einzelne Einstiegspunktfunktion von a .NET-Assembly in nicht verwalteter Form, aber mit .NET-Style-Funktionen innerhalb der DLL. Ist das möglich, einfach und unkompliziert?

Was ich habe, ist ein Programm von Drittanbietern, das ich durch DLLs (Plugins) erweitert habe, die eine komplexe Mathematik implementieren. Das Drittanbieter-Programm hat jedoch keine Möglichkeit, die Berechnungen zu visualisieren. Ich möchte diese vorgefertigten mathematischen Funktionen irgendwie übernehmen, sie in eine separate DLL kompilieren (aber C ++ / CLI in .NET verwenden), aber dann den Funktionen Hooks hinzufügen, damit ich in einem .NET unter der Haube rendern kann Nutzerkontrolle. Ich bin mir nicht sicher, wie man die .NET-Sachen mit den nicht verwalteten Sachen mischt oder was man zu Google macht, um diese Aufgabe zu erfüllen.

Spezifische Vorschläge in Bezug auf die verwaltete / nicht verwaltete Bridge oder alternative Methoden, um das Rendering in der beschriebenen Weise durchzuführen, wären hilfreich. Danke.

    
user343400 17.05.2010, 20:18
quelle

3 Antworten

4

Verwenden Sie C ++ / CLI, weil Sie möchten oder weil Sie glauben, dass Sie Funktionen exportieren müssen?

Im letzteren Fall sollten Sie sich meine nicht verwalteten Exporte ansehen, die Sie deklarieren können Unverwaltete Exporte in C # entsprechen der Funktionsweise von DllImport.

%Vor%     
Robert Giesecke 17.05.2010 20:33
quelle
4

Nun, der C ++ / CLI-Compiler macht es ziemlich einfach. Schreiben Sie einfach eine statische verwaltete Funktion und __declspec (dllexport). Der Compiler fügt einen Stub ein, der die CLR automatisch lädt, um den verwalteten Code auszuführen.

Das ist ein brauchbarer Ansatz, er ist nicht sehr erweiterbar und wird nicht sehr schnell sein. Der nächste Schritt besteht darin, dass Sie eine ref-Klasse mit dem Attribut [ComVisible (true)] schreiben. Nach der Registrierung mit Regasm.exe kann jeder nicht verwaltete COM-fähige Client diesen Server verwenden. Das Hosting der CLR selbst (CorBindToRuntimeEx) ist normalerweise die letzte Wahl, aber die universellste.

Beispielcode:

%Vor%     
Hans Passant 17.05.2010 21:41
quelle
3

Dieser CodeProject-Artikel erklärt den Prozess ziemlich gut.

Verwalteten Code in einer nicht verwalteten Anwendung verwenden
Ссылка

Siehe auch hier und hier .

    
Robert Harvey 17.05.2010 20:23
quelle