UPDATE FÜR .NET 4.0 UND MEHR LETZTE RAHMEN
Dies ist eine alte Frage, die zum Zeitpunkt von .Net 2.0 gestellt wurde, als die Unterstützung für DLLs im gemischten Modus schwerwiegende Initialisierungsprobleme aufwies, die zu zufälligen Deadlocks neigten. Ab .NET 4.0 hat sich die Initialisierung von DLLs im gemischten Modus geändert. Jetzt gibt es zwei separate Initialisierungsstufen:
- Native Initialisierung, die am Einstiegspunkt der DLL aufgerufen wird und die native C ++ - Laufzeiteinrichtung und Ausführung Ihrer DllMain-Methode umfasst.
- Verwaltete Initialisierung, automatisch vom Systemlader ausgeführt.
Da Schritt 2 außerhalb der Loader-Sperre ausgeführt wird, gibt es keine Deadlocks. Die Details werden unter Initialisierung gemischter Baugruppen beschrieben .
Um sicherzustellen, dass Ihre Assembly im gemischten Modus von einer nativen ausführbaren Datei geladen werden kann, müssen Sie nur überprüfen, ob die DllMain-Methode als nativer Code deklariert ist. #pragma unmanaged
könnte hier helfen:
#pragma unmanaged
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
... // your implementation here
}
Es ist auch wichtig, dass jeder Code, den DllMain direkt oder indirekt aufruft, ebenfalls nicht verwaltet wird. Es ist sinnvoll, die von DllMain verwendete Funktionalität einzuschränken, damit Sie den gesamten von DllMain erreichbaren Code verfolgen und sicherstellen können, dass alles mit kompiliert wird #pragma unmanaged
.
Der Compiler hilft ein wenig, indem er Ihnen C4747 warnt, wenn er feststellt, dass DllMain nicht als nicht verwaltet deklariert ist:
1> Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint
Der Compiler generiert jedoch keine Warnungen, wenn DllMain indirekt eine andere verwaltete Funktion aufruft. Sie müssen daher sicherstellen, dass dies niemals geschieht, da Ihre Anwendung sonst zufällig blockieren kann.