Compartilhar via


Arquivos .netmodule como entrada do vinculador

Agora o link.exe aceita arquivos .obj e .netmodule da MSIL como entrada. O arquivo de saída produzido pelo vinculador é um assembly ou um arquivo .netmodule sem dependência em tempo de execução de nenhum dos arquivos .obj ou .netmodule de entrada para o vinculador.

Comentários

Os arquivos .netmodule são criados pelo compilador do MSVC com /LN (Criar módulo da MSIL) ou pelo vinculador com /NOASSEMBLY (Criar um módulo da MSIL). Os arquivos .obj são sempre criados em uma compilação do C++. Para outros compiladores do Visual Studio, use a opção do compilador /target:module.

O arquivo .obj da compilação do C++ que criou o .netmodule, deve ser passado ao vinculador. Não há mais suporte para a passagem de um .netmodule, porque as opções do compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e estão sem suporte no Visual Studio 2017 e posteriores.

Para obter informações sobre como invocar o vinculador a partir da linha de comando, consulte Sintaxe de linha de comando do vinculador e Usar o conjunto de ferramentas MSVC da linha de comando.

Passar um arquivo .netmodule ou .dll para o vinculador que foi compilado pelo compilador do MSVC com /clr poderá resultar em um erro do vinculador. Para obter mais informações, confira Como escolher o formato dos arquivos de entrada netmodule.

O vinculador aceita arquivos nativos .obj e arquivos da MSIL .obj compilados com /clr. Você pode passar arquivos .obj misturados no mesmo build. A capacidade de verificação padrão do arquivo de saída resultante será a mesma que a capacidade de verificação mais baixa do módulo de entrada.

Você pode alterar um aplicativo composto por dois ou mais assemblies para que fiquem contidos em um assembly. Recompile as origens dos assemblies e vincule os arquivos .obj ou arquivos .netmodule para produzir um único assembly.

Especifique um ponto de entrada usando /ENTRY (Símbolo de ponto de entrada) durante a criação de uma imagem executável.

Durante a vinculação com um arquivo .obj ou .netmodule da MSIL, use /LTCG (Geração de código durante o tempo de vinculação); caso contrário, quando o vinculador encontrar o .obj ou .netmodule da MSIL, ele reiniciará a vinculação com /LTCG. Você verá uma mensagem informando que a vinculação está sendo reiniciada. Você pode ignorar essa mensagem, mas, para melhorar o desempenho do vinculador, especifique /LTCG explicitamente.

Os arquivos .obj ou .netmodule da MSIL também podem ser passados para o cl.exe.

Os arquivos de entrada .obj ou .netmodule da MSIL não podem ter recursos inseridos. Insira recursos em um módulo de saída ou arquivo de assembly usando a opção do vinculador /ASSEMBLYRESOURCE (Inserir um recurso gerenciado). Ou use a opção do compilador /resource em outros compiladores do Visual Studio.

Exemplos

No código do C++, o bloco catch de um try correspondente será invocado para uma exceção que não seja System. No entanto, por padrão, o CLR encapsula as exceções que não são System com RuntimeWrappedException. Quando um assembly for criado com base em módulos que sejam ou não do C++, e você desejar que um bloco catch no código do C++ seja invocado de sua cláusula try correspondente quando o bloco try gerar uma exceção que não seja System, você precisará adicionar o atributo [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] ao código-fonte para esses módulos que não são do 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();
}
*/

Alterando o valor Boolean do atributo WrapNonExceptionThrows, você modifica a capacidade de o código do C++ capturar uma exceção que não seja System.

// 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#");
      }
   }
}
caught non System exception in C++ source code file

Confira também