.netmodule soubory jako vstup linkeru

link.exe přijímá jako vstup 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

.netmodulesoubory 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í však CLR zabalí 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

Viz také