/clr (Compilazione Common Language Runtime)
Consente ad applicazioni e componenti di utilizzare le funzionalità di Common Language Runtime (CLR).
/clr[:options]
Argomenti
options
Una o più opzioni tra quelle riportate di seguito, separate da una virgola./clr
Crea i metadati dell'applicazione.I metadati possono essere utilizzati da altre applicazioni CLR e consentono all'applicazione di utilizzare i tipi e i dati dei metadati di altri componenti CLR.Per ulteriori informazioni, vedere
/clr:pure
Produce un file di output contenente solo codice Microsoft Intermediate Language (MSIL) privo di codice eseguibile nativo.Tuttavia, può contenere tipi nativi compilati per MSIL.Per ulteriori informazioni, vedere Codice pure e verificabile (C++/CLI).
/clr:safe
Genera un file di output solo MSIL (senza codice eseguibile nativo) verificabile./clr:safe abilita la diagnostica della verifica (strumento PEVerify (Peverify.exe)).Per ulteriori informazioni, vedere Writing Verifiably Type-Safe Code.
/clr:oldSyntax
Abilita la sintassi di Estensioni gestite per C++, ossia la sintassi originale di Visual C++ per la programmazione CLR.La sintassi delle estensioni gestite di C++ è deprecata.Utilizzare /clr:oldSyntax solo se si utilizza un'applicazione che utilizza le estensioni gestite di C++.Se si sta sviluppando una nuova applicazione, utilizzare la sintassi aggiornata.Per ulteriori informazioni, vedere Estensioni componenti per le piattaforme runtime.
Se si dispone di un'applicazione con estensioni gestite per C++ è possibile aggiornare il progetto affinché utilizzi la nuova sintassi.Per ulteriori informazioni, vedere Porting e aggiornamento di programmi.
/clr:noAssembly
Specifica di non inserire un manifesto dell'assembly nel file di output.L'opzione noAssembly è disattiva per impostazione predefinita.L'opzione noAssembly è deprecata.In alternativa, utilizzare /LN (Crea modulo MSIL).Per ulteriori informazioni, vedere Deprecated Compiler Options.
Un programma gestito nel cui manifesto non sono presenti metadati dell'assembly viene definito modulo.L'opzione noAssembly può essere utilizzata solo per produrre un modulo.Se si esegue la compilazione tramite /c e /clr:noAssembly, specificare l'opzione /NOASSEMBLY nella fase di collegamento per creare un modulo.
Prima di Visual C++ 2005, /clr:noAssembly sottintendeva /clr.Tuttavia, poiché /clr ora supporta anche /clr:oldSyntax, è necessario specificare il formato /clr quando si specifica /clr:noAssembly.Ad esempio, /clr:noAssembly /clr crea un modulo utilizzando la nuova sintassi CLR di Visual C++ e /clr:noAssembly,oldSyntax crea un modulo utilizzando le Estensioni gestite per C++.
Prima di Visual C++ 2005, /clr:noAssembly richiedeva /LD.Ora /LD è implicita quando viene specificata l'opzione /clr:noAssembly.
/clr:initialAppDomain
Consente a un'applicazione Visual C++ di essere in esecuzione nella versione 1 di CLR.Se si utilizza initialAppDomain, alcuni dei problemi discussi sono trattati nella pagina BUG: eccezione AppDomainUnloaded quando si utilizzano estensioni gestite per componenti Visual C++ (la pagina potrebbe essere in inglese) nel sito Web del Supporto tecnico Microsoft.Un'applicazione compilata tramite initialAppDomain non deve essere utilizzata da un'applicazione che utilizza ASP.NET, poiché ciò non è supportato nella versione 1 di CLR.
/clr:nostdlib
Indica al compilatore di ignorare la directory \clr predefinita.Il compilatore produce errori se si includono più versioni di una DLL quale System.dll.L'utilizzo di questa opzione consente di specificare il framework specifico da utilizzare durante la compilazione.
Note
Per codice gestito si intende del codice che può essere verificato e gestito da CLR.Il codice gestito può accedere agli oggetti gestiti.Per ulteriori informazioni, vedere Limitazioni di /clr.
Per informazioni sullo sviluppo di applicazioni che definiscono e utilizzano i tipi gestiti, vedere Estensioni componenti per le piattaforme runtime.
Un'applicazione compilata con /clr può contenere o meno dati gestiti.
Per consentire l'esecuzione del debug nelle applicazioni gestite, vedere /ASSEMBLYDEBUG (Aggiunge DebuggableAttribute).
Nell'heap sottoposto a Garbage Collection verrà creata un'istanza solo dei tipi CLR.Per ulteriori informazioni, vedere Classi e struct (Estensioni del componente C++).Per compilare una funzione in codice nativo, utilizzare il pragma unmanaged.Per ulteriori informazioni, vedere managed, unmanaged.
Per impostazione predefinita, l'opzione /clr non è attiva.Quando /clr è attiva, lo è anche /MD.Per ulteriori informazioni, vedere /MD, /MT, /LD (Utilizza la libreria di runtime)./MD assicura che le versioni multithread collegate in modo dinamico delle routine di runtime vengano selezionate dai file di intestazione standard con estensione h.Il multithreading è necessario per la programmazione gestita perché il Garbage Collector CLR esegue i finalizzatori in un thread ausiliario.
Se si esegue la compilazione utilizzando /c, è possibile specificare il tipo CLR (IJW, safe o pure) del file di output ottenuto utilizzando /CLRIMAGETYPE.
/clr implica /EHa. Non sono supportate altre opzioni /EH per /clr.Per ulteriori informazioni, vedere /EH (Modello di gestione delle eccezioni).
Per informazioni sulla modalità di determinazione del tipo di immagine CLR di un file, vedere /CLRHEADER.
È necessario che tutti i moduli passati a una determinata chiamata del linker siano compilati con la stessa opzione del compilatore delle librerie di runtime (/MD o /LD).
Utilizzare l'opzione del linker /ASSEMBLYRESOURCE per incorporare una risorsa in un assembly.Anche le opzioni del linker /DELAYSIGN, /KEYCONTAINER e /KEYFILE consentono di personalizzare la modalità di creazione di un assembly.
Quando viene utilizzato /clr, il valore del simbolo _MANAGED è pari a 1.Per ulteriori informazioni, vedere Macro predefinite.
Vengono inizializzate prima le variabili globali nel file di un oggetto nativo (durante DllMain se l'eseguibile è una DLL), quindi le variabili globali della sezione gestita (prima dell'esecuzione del codice gestito).#pragmainit_seg influisce solo sull'ordine di inizializzazione nelle categorie gestite e non gestite.
Nei linguaggi quale C#, la compilazione tramite /clr:safe è analoga alla compilazione tramite /platform:anycpu.
Immagini di tipo safe e pure
In un'immagine di tipo pure viene utilizzata una versione CLR della libreria di runtime C (CRT).Tuttavia, poiché non è verificabile, la libreria CRT non può essere utilizzata quando si esegue la compilazione con l'opzione /clr:safe.Per ulteriori informazioni, vedere Funzionalità della libreria CRT.
Gli esempi di codice nativo che non è possibile inserire in un'immagine di tipo pure comprendono gli assembly inline, setjmp e longjmp.
Vengono gestiti tutti i punti di ingresso di un'immagine di tipo pure o safe.Quando si esegue la compilazione tramite /clr, il punto di ingresso è nativo.Per ulteriori informazioni, vedere __clrcall.
Quando si esegue la compilazione tramite /clr:safe, per impostazione predefinita le variabili sono appdomain e non possono essere specifiche del processo.Per /clr:pure, benché appdomain sia il valore predefinito, è possibile utilizzare le variabili di processo.
Quando viene eseguito un file exe a 32 bit compilato con /clr o /clr:pure in un sistema operativo a 64 bit, l'applicazione viene eseguita con WOW64, che consente l'esecuzione di un'applicazione a 32 bit in CLR a 32 bit in un sistema operativo a 64 bit.Per impostazione predefinita, un file exe compilato tramite /clr:safe verrà eseguito in CLR a 64 bit in un computer che esegue un sistema operativo a 64 bit.In un sistema operativo a 32 bit, lo stesso file exe verrebbe eseguito nel runtime CLR a 32 bit. Tuttavia, un'applicazione sicura potrebbe caricare un componente a 32 bit.In tal caso, l'esecuzione di un'immagine di tipo safe nel supporto per 64 bit del sistema operativo verrà interrotta al momento del caricamento dell'applicazione a 32 bit (BadFormatException).Per fare in modo che il caricamento di un'immagine a 32 bit in un ambiente operativo a 64 bit non comporti l'interruzione dell'esecuzione di un'immagine di tipo safe, è necessario utilizzare /CLRIMAGETYPE per modificare i metadati (.corflags) e specificare che l'immagine deve essere eseguita con WOW64.La riga di comando seguente è un esempio.Sostituire il simbolo del punto di ingresso.
cl /clr:safe t.cpp /link /clrimagetype:pure /entry:?main@@$$HYMHXZ /subsystem:console
Per informazioni su come ottenere un nome decorato, vedere Utilizzo di un listato per la visualizzazione dei nomi decorati.Per ulteriori informazioni sulla programmazione a 64 bit, vedere Programmi di configurazione per 64 bit (Visual C++).
Per esempi, procedure dettagliate e ulteriori informazioni, vedere:
Metadati e classi senza nome
Le classi senza nome vengono visualizzate nei metadati con il seguente nome: $UnnamedClass$crc-of-current-file-name$index$, dove index è un conteggio sequenziale delle classi senza nome nella compilazione.L'esempio di codice che segue genera una classe senza nome nei metadati.
// clr_unnamed_class.cpp
// compile by using: /clr /LD
class {} x;
Utilizzare ildasm.exe per visualizzare i metadati.
Per impostare questa opzione del compilatore in Visual Studio
In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, quindi selezionare Proprietà per aprire la finestra di dialogo Pagine delle proprietà del progetto.
Selezionare la cartella Proprietà di configurazione.
Nella pagina delle proprietà Generale, modificare la proprietà Supporto di Common Language Runtime.
[!NOTA]
Quando si abilita l'opzione /clr nella finestra di dialogo Pagine delle proprietà, se necessario, vengono modificate anche le proprietà delle opzioni del compilatore non compatibili con /clr.Se, ad esempio, viene impostata l'opzione /RTC e quindi viene attivata /clr, /RTC verrà disattivata.
Inoltre, quando si esegue il debug di un'applicazione /clr, impostare la proprietà Tipo debugger su Misto o Solo gestito.Per ulteriori informazioni, vedere Impostazioni di progetto per una configurazione di debug C++.
Per informazioni sulla creazione dei moduli, vedere /NOASSEMBLY (Crea un modulo MSIL).
Per impostare l'opzione del compilatore a livello di codice
- Vedere CompileAsManaged.