.File con estensione netmodule come input del linker
link.exe accetta adesso come input i file con estensione obj e netmodule di MSIL. Il file di output generato dal linker sarà un assembly o un file con estensione netmodule senza alcuna dipendenza in fase di esecuzione da file con estensione obj o netmodule con estensione netmodule utilizzati come input per il linker.
. creati dal compilatore Visual C++ con /LN (Crea modulo MSIL) oppure dal linker con /NOASSEMBLY (Crea un modulo MSIL). I file obj vengono sempre creati in una compilazione Visual C++. Per altri compilatori di Visual Studio, utilizzare l'opzione del compilatore /target:module.
Nella maggior parte dei casi, sarà necessario passare al linker il file con estensione obj dalla compilazione Visual C++ che ha creato il file con estensione netmodule, almeno che quest'ultimo non sia stato creato con /clr (Compilazione Common Language Runtime). I file con estensione netmodule di MSIL utilizzati come input per il linker devono essere file MSIL pure, ovvero file che possono essere generati dal compilatore Visual C++ utilizzando /clr:safe. Altri compilatori di Visual Studio generano moduli pure di MSIL per impostazione predefinita.
Per informazioni su come richiamare il linker dalla riga di comando, vedere Sintassi della riga di comando del linker e Impostazione delle variabili di percorso e di ambiente per la compilazione dalla riga di comando.
Il passaggio di un file con estensione netmodule o dll al linker compilato dal compilatore Visual C++ con /clr o /clr:pure può comportare un errore del linker. Per ulteriori informazioni, vedere Scelta del formato dei file di input con estensione netmodule.
Il linker accetta file obj nativi e file obj di MSIL compilati con /clr, /clr:pure o /clr:safe. Quando nella stessa build vengono passati file obj misti, la verificabilità del file di output risultante sarà, per impostazione predefinita, uguale al livello minimo di verificabilità dei moduli di input. Se, ad esempio, si passa un file con estensione obj pure sicuro al linker, il file di output sarà pure. /CLRIMAGETYPE (Specifica il tipo di immagine CLR) consente di specificare un livello di verificabilità più basso, se necessario.
Se si dispone di un'applicazione composta da due o più assembly e si desidera che l'applicazione sia contenuta in uno solo, è necessario ricompilare gli assembly e collegare i file con estensione obj o netmodule per generare un singolo assembly.
Quando si crea un'immagine eseguibile, è necessario specificare un punto di ingresso utilizzando /ENTRY (Simbolo del punto di ingresso).
Quando si esegue un collegamento con un file con estensione obj o netmodule di MSIL, utilizzare l'opzione /LTCG (Generazione di codice in fase di collegamento), altrimenti quando il linker rileva il file con estensione obj o netmodule di MSIL, riavvierà il collegamento con l'opzione /LTCG.
I file con estensione obj o netmodule di MSIL possono essere passati anche a cl.exe.
I file con estensione obj o netmodule di input di MSIL non possono avere risorse incorporate. Una risorsa viene incorporata in un file di output (modulo o assembly) con l'opzione del linker /ASSEMBLYRESOURCE (Incorpora una risorsa gestita) o con l'opzione del compilatore /resource in altri compilatori di Visual Studio.
Quando si eseguono collegamenti MSIL, e non viene specificato anche /LTCG (Generazione di codice in fase di collegamento), viene visualizzato un messaggio in cui si segnala che il collegamento viene riavviato. Sebbene sia possibile ignorare il messaggio, per migliorare le prestazioni del linker con i collegamenti MSIL è opportuno specificare /LTCG in modo esplicito.
Esempio
Nel codice C++ verrà richiamato il blocco catch di un blocco try corrispondente per un'eccezione non di sistema. Tuttavia, per impostazione predefinita, CLR esegue il wrapping di eccezioni non di sistema con RuntimeWrappedException. Quando viene creato un assembly dai moduli Visual C++ e non Visual C++ e si desidera che un blocco catch nel codice C++ venga richiamato dalla clausola try corrispondente alla generazione di un'eccezione non di sistema da parte del blocco try, sarà necessario aggiungere
l'attributo [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] al codice sorgente per i moduli non C++.
// MSIL_linking.cpp
// compile with: /c /clr
value struct V {};
ref struct MCPP {
static void Test() {
try {
throw (gcnew V);
}
catch (V ^) {
System::Console::WriteLine("caught non System exception in C++ source code file");
}
}
};
/*
int main() {
MCPP::Test();
}
*/
Se si modifica il valore booleano dell'attributo WrapNonExceptionThrows, verrà modificata la capacità del codice Visual C++ di rilevare un'eccezione non di sistema.
// MSIL_linking_2.cs
// compile with: /target:module /addmodule:MSIL_linking.obj
// post-build command: link /LTCG MSIL_linking.obj MSIL_linking_2.netmodule /entry:MLinkTest.Main /out:MSIL_linking_2.exe /subsystem:console
using System.Runtime.CompilerServices;
// enable non System exceptions
[assembly:RuntimeCompatibility(WrapNonExceptionThrows=false)]
class MLinkTest {
public static void Main() {
try {
MCPP.Test();
}
catch (RuntimeWrappedException) {
System.Console.WriteLine("caught a wrapped exception in C#");
}
}
}