Scelta del formato dei file di input con estensione netmodule
Un file MSIL con estensione obj, compilato con l'opzione /clr, può essere utilizzato anche come file con estensione netmodule. Nei file obj sono presenti metadati e simboli nativi, . I file con estensione netmodule contengono solo metadati.
È possibile passare un file obj MISL a un qualsiasi altro compilatore Visual Studio tramite l'opzione del compilatore /addmodule, tenendo comunque presente che il file obj diventerà parte dell'assembly risultante e dovrà quindi essere distribuito con l'assembly. L'opzione del compilatore /addmodule è ad esempio disponibile in Visual C# e Visual Basic.
Nota
Nella maggior parte dei casi, sarà necessario passare al linker il file con estensione obj dalla compilazione che ha creato il modulo con estensione net, a meno che il file con estensione netmodule non sia stato creato con l'opzione /clr:pure. Il passaggio di un file di modulo MSIL con estensione dll o netmodule al linker può determinare l'errore LNK1107.
I file con estensione obj e i relativi file con estensione h associati, a cui si fa riferimento nell'origine tramite #include, consentono alle applicazioni C++ di utilizzare i tipi nativi nel modulo. Diversamente, in un file con estensione netmodule un'applicazione C++ può utilizzare solo i tipi gestiti. Se si tenta di passare un file obj a #using, le informazioni sui tipi nativi non risulteranno disponibili. Passare a #include il file con estensione h del file obj.
Gli altri compilatori Visual Studio possono utilizzare solo i tipi gestiti di un modulo.
Per determinare se deve essere utilizzato un file con estensione netmodule oppure obj come input di modulo del linker di Visual C++, attenersi alle seguenti indicazioni:
Se si esegue la compilazione con un compilatore Visual Studio diverso da Visual C++, creare un file con estensione netmodule e utilizzarlo come input del linker.
Se si utilizza il compilatore Visual C++ per creare moduli e questi ultimi verranno utilizzati per compilare un oggetto diverso da una libreria, utilizzare come input di modulo del linker i file con estensione obj creati dal compilatore e non il file con estensione netmodule.
Se i moduli verranno utilizzati per compilare una libreria nativa (non gestita), utilizzare come input di modulo del linker i file obj e creare un file di libreria lib.
Se i moduli verranno utilizzati per compilare una libreria gestita e ciascun input di modulo del linker sarà verificabile, ovvero creato con /clr:safe, utilizzare come input di modulo del linker i file con estensione obj e generare un file di libreria con estensione dll (assembly) o netmodule (modulo).
Se i moduli verranno utilizzati per compilare una libreria gestita e ciascun input di modulo del linker sarà creato con /clr:pure o /clr:safe, utilizzare come input di modulo del linker i file con estensione obj e generare un file con estensione dll (assembly) o netmodule (modulo) se si desidera esporre solo i tipi gestiti della libreria. Se si desidera che i tipi gestiti della libreria, oltre a essere esposti, vengano anche utilizzati dalle applicazioni C++, la libreria dovrà essere composta dai file obj relativi ai moduli componenti delle librerie. Poiché verranno distribuiti, è possibile fare riferimento ai file con estensione h per ciascun modulo dal codice sorgente con #include.
Se i moduli verranno utilizzati per compilare una libreria gestita e se uno o più input di modulo del linker verranno creati con /clr, utilizzare come input di modulo del linker i file obj e generare un file di libreria dll (assembly). Se si desidera che i tipi gestiti della libreria, oltre a essere esposti, vengano anche utilizzati dalle applicazioni C++, la libreria dovrà essere composta dai file obj relativi ai moduli componenti delle librerie. Poiché verranno distribuiti, è possibile fare riferimento ai file con estensione h per ciascun modulo dal codice sorgente con #include.