.netmodule soubory jako vstup linkeru
link.exe přijímá jako vstup jazyk MSIL .obj
a .netmodule
soubory. Výstupní soubor vytvořený linkerem je sestavení nebo .netmodule
soubor bez závislosti na době běhu na žádném ze vstupních .obj
.netmodule
souborů linkeru.
Poznámky
.netmodule
soubory jsou vytvořeny kompilátorem MSVC pomocí /LN (vytvořit modul MSIL) nebo linkerem s /NOASSEMBLY (vytvoření modulu MSIL). .obj
soubory se vždy vytvářejí v kompilaci jazyka C++. Pro ostatní kompilátory sady Visual Studio použijte možnost kompilátoru /target:module .
Linker musí být předán .obj
soubor z kompilace C++, která vytvořila .netmodule
. .netmodule
Předání už není podporováno, protože možnosti kompilátoru /clr:pure a /clr:safe jsou v sadě Visual Studio 2015 zastaralé a v sadě Visual Studio 2017 a novější nejsou podporovány.
Informace o vyvolání linkeru z příkazového řádku naleznete v tématu Syntaxe příkazového řádku linkeru a použití sady nástrojů MSVC z příkazového řádku.
Předání nebo .netmodule
.dll
souboru do linkeru, který byl kompilován kompilátorem MSVC s clr / může vést k chybě linkeru. Další informace naleznete v tématu Volba formátu vstupníchnetmodule souborů.
Linker přijímá nativní .obj
soubory i soubory MSIL .obj
zkompilované pomocí /clr. Ve stejném sestavení můžete předat smíšené .obj
soubory. Výchozí ověřitelnost výsledného výstupního souboru je stejná jako ověřitelnost nejnižšího vstupního modulu.
Aplikaci, která se skládá ze dvou nebo více sestavení, můžete změnit tak, aby byla obsažena v jednom sestavení. Znovu zkompilujte zdroje sestavení a pak propojte .obj
soubory nebo .netmodule
soubory, aby se vytvořilo jedno sestavení.
Při vytváření spustitelného obrázku zadejte vstupní bod pomocí /ENTRY (symbol vstupního bodu).
Při propojení s jazykem MSIL nebo souborem použijte /LTCG (generování kódu v čase link-time), jinak když linker narazí na jazyk MSIL .obj
.obj
nebo .netmodule
, restartuje propojení pomocí /LTCG..netmodule
Zobrazí se informační zpráva, že se odkaz restartuje. Tuto zprávu můžete ignorovat, ale pokud chcete zlepšit výkon linkeru, explicitně zadat /LTCG.
MsIL .obj
nebo .netmodule
soubory lze také předat cl.exe.
Vstupní knihovna MSIL .obj
nebo .netmodule
soubory nemohou obsahovat vložené prostředky. Prostředky můžete vložit do výstupního modulu nebo souboru sestavení pomocí možnosti linkeru /ASSEMBLYRESOURCE (Vložit spravovaný prostředek). Nebo použijte možnost kompilátoru /resource v jiných kompilátorech sady Visual Studio.
Příklady
V kódu catch
jazyka C++ bude vyvolánSystem
blok odpovídající try
výjimky. Ve výchozím nastavení CLR však zabalí jiné nežSystem
výjimky s RuntimeWrappedException. Při vytvoření sestavení z modulů C++ a jiných než C++ a chcete catch
, aby blok v kódu C++ byl vyvolán z odpovídající try
klauzule, když try
blok vyvolá výjimku,System
je nutné přidat [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
atribut do zdrojového kódu pro moduly jiné než 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();
}
*/
Změnou Boolean
hodnoty atributu WrapNonExceptionThrows
upravíte schopnost kódu C++ zachytit výjimku, která neníSystem
výjimka.
// 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