Scelta del formato dei file di input con estensione netmodule
Un file .obj MSIL (compilato con /clr) può essere usato anche come file .netmodule. .obj file contengono metadati e simboli nativi. I file con estensione netmodule contengono solo metadati.
È possibile passare un file .obj MSIL a qualsiasi altro compilatore di Visual Studio tramite l'opzione del compilatore /addmodule ( ma tenere presente che il file .obj diventa parte dell'assembly risultante e deve essere fornito con l'assembly). Ad esempio, Visual C# e Visual Basic hanno l'opzione del compilatore /addmodule.
Nota
Nella maggior parte dei casi, sarà necessario passare al linker il file con estensione obj dalla compilazione che ha creato il modulo .NET. Il passaggio di un file di modulo MSIL con estensione netmodule o dll al linker può causare l'errore LNK1107.
I file con estensione obj, con i file con estensione h associati, a cui si fa riferimento mediante #include nell'origine, consentono alle applicazioni C++ di utilizzare i tipi nativi nel modulo, mentre in un file con estensione netmodule, solo i tipi gestiti possono essere utilizzati da un'applicazione C++. Se si tenta di passare un file .obj a #using, le informazioni sui tipi nativi non saranno disponibili; #include invece il file h del file .obj.
Altri compilatori di Visual Studio possono utilizzare solo tipi gestiti da un modulo.
Usare quanto segue per determinare se è necessario usare un file .netmodule o un file .obj come input del modulo per il linker MSVC:
Se si compila con un compilatore di Visual Studio diverso da Visual C++, viene generato un file con estensione netmodule che viene utilizzato come input del linker.
Se si usa il compilatore MSVC per produrre moduli e se i moduli verranno usati per compilare qualcosa di diverso da una libreria, usare i file .obj prodotti dal compilatore come input del modulo per il linker; non usare il file .netmodule come input.
Se i moduli verranno usati per compilare una libreria nativa (non gestita), usare .obj file come input del modulo per il linker e generare 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 usati per compilare una libreria gestita e se uno o più moduli di input per il linker verranno generati con solo /clr, usare .obj file come input del modulo al linker e generare un .dll (assembly). Se si desidera esporre i tipi gestiti dalla libreria e se si desidera che le applicazioni C++ possano utilizzare i tipi nativi nella libreria, la libreria sarà costituita dai file .obj per i moduli dei componenti delle librerie ( sarà anche necessario spedire i file H per ogni modulo, in modo che possano essere usati con #include dal codice sorgente).