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 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 nãoSystem
exceções 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