Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
link.exe aceita arquivos MSIL .obj e .netmodule 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 qualquer um dos arquivos .obj ou .netmodule que foram inseridos no vinculador.
Comentários
.netmodule arquivos são criados pelo compilador MSVC com /LN (Create MSIL module) ou pelo vinculador com /NOASSEMBLY (Create a MSIL Module).
.obj arquivos são sempre criados em uma compilação C++. Para outros compiladores do Visual Studio, use a opção /target:module compilador.
O vinculador deve passar o arquivo .obj da compilação C++ que criou o .netmodule. Não há mais suporte para a passagem de um .netmodule porque as opções de compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e não têm suporte no Visual Studio 2017 e posterior.
Para obter informações sobre como invocar o vinculador a partir da linha de comando, consulte de sintaxe da linha de comando do vinculador e Usar o conjunto de ferramentas MSVC a partir da linha de comando.
Passar um arquivo .netmodule ou .dll para o vinculador que foi compilado pelo compilador MSVC com /clr pode resultar em um erro de vinculador. Para obter mais informações, consulte Escolhendo o formato do .netmodule arquivos de entrada.
O vinculador aceita arquivos .obj nativos e arquivos MSIL .obj compilados com /clr. Você pode passar arquivos .obj mistos na mesma compilação. A verificabilidade padrão do arquivo de saída resultante é a mesma que a verificabilidade do módulo de entrada mais baixo.
Você pode alterar um aplicativo que é composto de dois ou mais assemblies para ser contido em um assembly. Recompile as fontes dos assemblies e, em seguida, vincule os arquivos .obj ou .netmodule arquivos para produzir um único assembly.
Especifique um ponto de entrada usando /ENTRY (símbolo de ponto de entrada) ao criar uma imagem executável.
Ao vincular com um arquivo MSIL .obj ou .netmodule, use /LTCG (Link-time code generation), caso contrário, quando o vinculador encontrar o .obj ou .netmoduleMSIL, ele reiniciará o link com /LTCG. Você verá uma mensagem informativa informando que o link está reiniciando. Você pode ignorar essa mensagem, mas para melhorar o desempenho do vinculador, especifique explicitamente /LTCG.
MSIL .obj ou .netmodule arquivos também podem ser passados para cl.exe.
Os arquivos de .obj ou .netmodule MSIL de entrada não podem ter recursos incorporados. Incorpore recursos em um módulo de saída ou arquivo de assembly usando a opção de vinculador de /ASSEMBLYRESOURCE (Incorporar um recurso gerenciado)
Exemplos
No código C++, o bloco catch de um try correspondente será invocado para uma exceção nãoSystem. No entanto, por padrão, o CLR encapsula exceções nãoSystem com RuntimeWrappedException. Quando um assembly é criado a partir de módulos C++ e não-C++ e você deseja que um bloco catch no código C++ seja invocado a partir de sua cláusula try correspondente quando o bloco try lança uma exceção nãoSystem, você deve adicionar o atributo [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] ao código-fonte para os módulos não-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();
}
*/
Ao alterar o valor de Boolean do atributo WrapNonExceptionThrows, você modifica a capacidade do código C++ para capturar uma exceção nãoSystem.
// 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