Escolhendo o formato de arquivos de entrada .netmodule
Um arquivo MSIL .obj (compilado com /clr) também pode ser usado como um arquivo .netmodule. Os arquivos .obj contêm metadados e símbolos nativos. .netmodules contêm apenas metadados.
Você pode passar um arquivo .obj msil para qualquer outro compilador do Visual Studio por meio da opção do compilador /addmodule (mas lembre-se de que o arquivo .obj se torna parte do assembly resultante e deve ser enviado com o assembly). Por exemplo, Visual C# e Visual Basic têm a opção do compilador /addmodule.
Observação
Na maioria dos casos, você precisará passar para o vinculador o arquivo .obj da compilação que criou o módulo .net. Passar um arquivo de módulo MSIL .dll ou .netmodule para o vinculador pode resultar em LNK1107.
Os arquivos .obj, juntamente com seus arquivos .h associados, que você referencia por meio de #include na origem, permitem que aplicativos C++ consumam os tipos nativos no módulo, enquanto em um arquivo .netmodule, somente os tipos gerenciados podem ser consumidos por um aplicativo C++. Se você tentar passar um arquivo .obj para #using, as informações sobre tipos nativos não estarão disponíveis; #include o arquivo .obj do arquivo .h.
Outros compiladores do Visual Studio só podem consumir tipos gerenciados de um módulo.
Use o seguinte para determinar se você precisa usar um .netmodule ou um arquivo .obj como entrada de módulo para o vinculador MSVC:
Se você estiver criando com um compilador do Visual Studio diferente do Visual C++, produza um .netmodule e use o .netmodule como entrada para o vinculador.
Se você estiver usando o compilador MSVC para produzir módulos e se os módulos forem usados para criar algo diferente de uma biblioteca, use os arquivos .obj produzidos pelo compilador como entrada de módulo para o vinculador; não use o arquivo .netmodule como entrada.
Se os módulos forem usados para criar uma biblioteca nativa (não gerenciada), use arquivos .obj como entrada de módulo para o vinculador e gere um arquivo de biblioteca .lib.
Se os módulos forem usados para criar uma biblioteca gerenciada e se toda a entrada do módulo no vinculador for verificável (produzida com /clr:safe), use arquivos .obj como entrada de módulo para o vinculador e gere um arquivo de biblioteca .dll (assembly) ou .netmodule (módulo).
Se seus módulos forem usados para criar uma biblioteca gerenciada, e se uma ou mais entradas de módulos para o vinculador forem produzidas apenas com /clr, use arquivos .obj como entrada de módulo para o vinculador e gere um .dll (assembly). Se você quiser expor tipos gerenciados da biblioteca e também quiser que aplicativos C++ consumam os tipos nativos na biblioteca, sua biblioteca consistirá nos arquivos .obj para os módulos de componente de bibliotecas (você também desejará enviar os arquivos .h para cada módulo, para que eles possam ser referenciados com #include do código-fonte).