2009-04-21 3 views
1

erforsche ich .net Methoden von nicht verwalteten C++ Code aufrufen und haben die Funktion unten in How To Inject a Managed .NET Assembly (DLL) Into Another ProcessWie Dot Net-Hosting-Funktion teilen, wenn sie über C++ dll Aufruf

void StartTheDotNetRuntime() 
{ 
    // Bind to the CLR runtime.. 
    ICLRRuntimeHost *pClrHost = NULL; 
    HRESULT hr = CorBindToRuntimeEx(
     NULL, L"wks", 0, CLSID_CLRRuntimeHost, 
     IID_ICLRRuntimeHost, (PVOID*)&pClrHost); 

    // Push the CLR start button 
    hr = pClrHost->Start(); 

    // Okay, the CLR is up and running in this (previously native) process. 
    // Now call a method on our managed class library. 
    DWORD dwRet = 0; 
    hr = pClrHost->ExecuteInDefaultAppDomain(
     L"c:\\PathToYourManagedAssembly\\MyManagedAssembly.dll", 
     L"MyNamespace.MyClass", L"MyMethod", L"MyParameter", &dwRet); 

    // Stop the CLR runtime 
    hr = pClrHost->Stop(); 

    // Don't forget to clean up. 
    pClrHost->Release(); 
} 

Dies funktioniert ohne Probleme, wenn sie aufgerufen einmal gefunden in eine Konsolenanwendung.

Ich möchte nun diese Funktion für die Verwendung in einer DLL spalten, sollte dies logisch in drei Teile

Method - DLLMain 
    DLL_PROCESS_ATTACH 
     Bind to the CLR runtime 
     Push the CLR start button 

    DLL_PROCESS_DETACH 
     Stop the CLR runtime 
     Do not forget to clean up. 

Method - CallDotNetToDoSomething 

Wie und wo erkläre ich die ICLRRuntimeHost pClrHost/HRESULT hr, um dies zu erreichen?

Antwort

1

Sie sollten wahrscheinlich globale (statische) Variablen oder in einem Singleton irgendeiner Art sein. Es gibt nur eine .NET-Laufzeit pro Prozess (zumindest in diesen Tagen), so dass es wenig Sinn macht, viel schlauer zu sein. Füllen Sie die Globals in DLL laden, entvölkern Sie sie dann während DLL entladen.

Für ein .NET/Mono-Einbettungsprojekt habe ich ein Objekt erstellt, dessen Konstruktor die Laufzeit hochgefahren hat (d. H. Bind/push start) und dessen Destruktor es herunterfährt (stop/release). Auf diese Weise könnte die Hauptanwendung wählen, wie sie zu arbeiten ist, d. H. Sie in main() auf den Stapel legen oder während des Ladens einer DLL eine neue() ausführen und in DLL entladen löschen. In diesem Fall wären die von Ihnen erwähnten Zeiger Instanzvariablen eines neuen Objekts, das Sie erstellen, z. ClrEmbedManager. Das ist Overkill, wenn Ihre Bibliothek nicht in verschiedenen Arten von Anwendungen mit unterschiedlichen Verhaltensweisen wiederverwendet werden muss.

+0

Es ist erwähnenswert, dass ab .NET 3.5 jetzt mehrere .NET-Laufzeiten in einem einzigen Prozess (nebeneinander) haben können. Ich bin mir nicht sicher, wie sich dies auf das Problem des ursprünglichen Posters auswirkt. –

Verwandte Themen