Condividi tramite


Procedura: rimuovere la dipendenza da _vcclrit.h

Aggiornamento: novembre 2007

In Visual C++ .NET e Visual C++ 2003 le DLL compilate con l'opzione /clr del compilatore possono creare, in modo non deterministico, un deadlock al momento del caricamento. Questo problema, spesso denominato blocco del caricatore, è illustrato in dettaglio in Inizializzazione di assembly misti.

Per risolvere questo problema, in Visual C++ 2003 è stato fornito il file _vcclrit.h, che consente di inizializzare le DLL in modo da evitare il blocco del caricatore. In Visual C++ 2005 l'inizializzazione viene gestita in modo completamente differente riducendo notevolmente le possibilità di deadlock. Di conseguenza, questo file di intestazione non è più necessario.

Tuttavia, per mantenere la compatibilità con le versioni precedenti, il file _vcclrit.h viene ancora fornito e il codice che lo utilizza continuerà a funzionare correttamente, anche se il contenuto di _vcclrit.h è obsoleto. In questo argomento vengono illustrate le modifiche consigliate necessarie per rimuovere la dipendenza da questo file di intestazione.

Nota:

Sebbene non sia una soluzione ideale, gli avvisi negativi generati dall'utilizzo di _vcclrit.h possono essere eliminati definendo _CRT_VCCLRIT_NO_DEPRECATE prima di includere _vcclrit.h.

Modifiche alle impostazioni del linker

Di seguito sono riportate le modifiche necessarie per la rimozione di _vcclrit.h dai progetti che utilizzavano la soluzione consigliata per evitare il blocco del caricatore in Visual C++ 2003. Queste operazioni comportano alcune modifiche alle impostazioni del linker. Per istruzioni sulla modifica di queste impostazioni tramite Visual Studio, vedere Modifica delle impostazioni di progetto.

  • Rimuovere l'opzione /NOENTRY del linker. L'opzione /NOENTRY (nessun punto di ingresso) era richiesta da _vcclrit.h e ora non è più necessaria.

  • Non fornire esplicitamente MSVCRT.LIB al linker. Poiché l'opzione /NOENTRY era obbligatoria, era necessario collegare esplicitamente a CRT il file di libreria MSVCRT.LIB. Una volta rimossa l'opzione /NOENTRY, questa libreria viene collegata automaticamente con la compilazione /clr.

  • Rimuovere NOCHKCLR.OBJ dall'input del linker. Questo file non è più necessario.

  • Rimuovere i riferimenti ai simboli imposti. In precedenza, era necessario utilizzare l'opzione /INCLUDE per imporre i simboli __DllMainCRTStartup@12, __crt_dll_initialize e __crt_dll_terminate. In Visual C++ 2005 questi simboli non sono più necessari e possono essere tranquillamente rimossi.

Modifiche al codice

Oltre a rimuovere l'istruzione #include <_vcclrit.h> dal codice, è possibile che sia necessario apportare alcune modifiche aggiuntive, a seconda del tipo di codice. Sicuramente i simboli __crt_dll_initialize e __crt_dll_terminate non verranno più richiamati e possono quindi essere rimossi.

Vedere anche

Concetti

Assembly misti (nativi e gestiti)