Gewusst wie: Entfernen der Abhängigkeit von _vcclrit.h

Aktualisiert: November 2007

In Visual C++ .NET und Visual C++ 2003 kann beim Laden von mit der /clr-Compileroption kompilierten DLLs ein nicht deterministischer Deadlock auftreten. Dieses als Ladesperre bekannte Problem wird im Abschnitt Initialisierung gemischter Assemblys ausführlich beschrieben.

Zum Beheben dieses Problems wurde in Visual C++ 2003 _vcclrit.h eingeführt, um eine Initialisierung von DLLs zu unterstützen, bei der Ladesperren vermieden werden. Die Initialisierung wird mit Visual C++ 2005 auf völlig unterschiedliche Weise behandelt. Da die Wahrscheinlichkeit von Deadlocks hierdurch erheblich geringer ist, wird diese Headerdatei nicht mehr benötigt.

Um Rückwärtskompatibilität zu gewährleisten, ist _vcclrit.h auch weiterhin enthalten und der darauf bezogene Code ist funktionsfähig, die Inhalte von _vcclrit.h sind jedoch veraltet. In diesem Thema werden die empfohlenen Änderungen zum Entfernen der Abhängigkeit von dieser Headerdatei beschrieben.

Hinweis:

Auch wenn dies nicht die ideale Lösung ist, können die bei Verwendung von _vcclrit.h angezeigten Veraltungswarnungen unterdrückt werden, indem Sie _CRT_VCCLRIT_NO_DEPRECATE definieren, bevor Sie _vcclrit.h einfügen.

Änderung der Linkereinstellungen

Die folgenden Änderungen sollten vorgenommen werden, um _vcclrit.h aus Projekten zu entfernen, bei denen die empfohlene Ladesperrenlösung von Visual C++ 2003 angewendet wurde. Sie alle schließen Änderungen an den Linkereinstellungen ein. Anweisungen zum Ändern dieser Einstellungen über Visual Studio finden Sie unter Ändern von Projekteinstellungen.

  • Entfernen der /NOENTRY-Switch-Anweisung des Linkers. Bei Verwendung von _vcclrit.h musste der /NOENTRY (Kein Einstiegspunkt)-Switch für den Linker angegeben werden. Dies ist nicht mehr erforderlich.

  • Geben Sie MSVCRT.LIB nicht explizit als Eingabe für den Linker an. Da der /NOENTRY-Switch erforderlich war, musste eine explizite Verknüpfung mit der CRT-Bibliotheksdatei MSVCRT.LIB eingerichtet werden. Wenn /NOENTRY entfernt wird, wird diese Bibliothek bei der Kompilierung mit /clr standardmäßig eingebunden.

  • Entfernen von NOCHKCLR.OBJ aus der Linker-Eingabe. Diese Datei ist nicht mehr erforderlich.

  • Entfernen erzwungener Symbolverweise. Früher mussten die folgenden Symbole mit dem /INCLUDE-Switch erzwungen werden: __DllMainCRTStartup@12, __crt_dll_initialize und __crt_dll_terminate. Keines dieser Symbole ist in Visual C++ 2005 notwendig, daher können sie problemlos entfernt werden.

Codeänderungen

Neben dem Entfernen von #include <_vcclrit.h> aus dem Code können abhängig von der Art Ihres Codes einige weitere Änderungen erforderlich sein. Zumindest werden __crt_dll_initialize und __crt_dll_terminate nicht mehr aufgerufen und können daher entfernt werden.

Siehe auch

Konzepte

Gemischte (systemeigene und verwaltete) Assemblys