Soubory .netmodule jako vstup linkeru
Link.exe nyní přijímá jazyk MSIL obj a .netmodules jako vstup.Ve výstupním souboru vytvořeném propojovacím programem bude sestavení nebo .netmodule se žádná závislost běhu na obj nebo .netmodules, že se jednalo o vstup do propojovacího programu.
.netmodules jsou vytvořeny pomocí kompilátoru Visual C++ s /LN (Vytvořit modul MSIL) nebo propojovací program s /NOASSEMBLY (Vytvořit modul MSIL). .objs jsou vždy vytvořeny při kompilaci aplikace Visual C++.Jinými kompilátory Visual Studio použít /target:module možnost kompilátoru.
Ve většině případů je nutné předat do propojovacího programu souboru obj z kompilace Visual C++, vytvořený .netmodule, pokud byl vytvořen .netmodule /clr (Common Language Runtime)..Netmodules jazyk MSIL použité jako vstup do propojovacího programu musí být čistý jazyk MSIL, které může být vyrobeno pomocí kompilátoru Visual C++ /clr:safe.Jinými kompilátory Visual Studio vytvoří ve výchozím nastavení modulů čistého jazyka MSIL.
Informace o vyvolání propojovací program z příkazového řádku naleznete v tématu Syntaxe příkazového řádku linkeru a Nastavení cesty a proměnných prostředí pro sestavení příkazového řádku.
Předávání .netmodule nebo .dll soubor propojovací program byl kompilován pomocí kompilátoru Visual C++ s /clr nebo /clr:pure může mít za následek chyby propojovacího programu.Další informace naleznete v tématu Výběr formátu vstupních souborů .netmodule.
Přijímá propojovací program nativní obj soubory stejně jako soubory obj MSIL zkompilovaný s /clr, /clr:pure, nebo /clr:safe.Při předávání .objs smíšené ve stejném sestavení, ověřitelnosti výsledného výstupního souboru, ve výchozím nastavení, bude rovna nejnižší úroveň ověřitelnosti vstupní moduly.Například pokud předáte do propojovacího programu bezpečný a čistý obj, výstupní soubor bude čisté./CLRIMAGETYPE (Zadat typ obrázku CLR)Umožňuje zadat nižší úroveň ověřitelnosti, pokud je to, co potřebujete.
Pokud chcete, aby aplikace, které mají být obsaženy v jednom sestavení aktuálně máte aplikaci, která se skládá ze dvou nebo více sestavení, musíte překompilovat sestavení a potom propojit .objs nebo .netmodules k vytvoření jediného sestavení.
Je nutné zadat bod vstupu pomocí /ENTRY (symbol vstupního bodu) při vytvoření spustitelné bitové kopie.
Při propojení se souborem jazyka MSIL obj nebo .netmodule pomocí /LTCG (vytváření kódu v době propojování), jinak pokud propojovací program zjistí jazyk MSIL obj nebo .netmodule, bude restartován propojení s/ltgc.
Soubory obj nebo .netmodule jazyk MSIL může být předán cl.exe.
Vstupní jazyk MSIL obj nebo .netmodule soubory nelze vložené prostředky.Prostředek je vložen do výstupního souboru (modul nebo sestavení) s /ASSEMBLYRESOURCE (integrovaný spravovaný zdroj) možností propojovacího programu nebo /resource možnost kompilátoru v jinými kompilátory Visual Studio.
Při provádění jazyka MSIL propojení, a pokud není také zadán /LTCG (vytváření kódu v době propojování), zobrazí se informační zpráva hlášení, že je restartování propojení.Tuto zprávu lze ignorovat, ale ke zlepšení výkonu propojovací program s MSIL propojení, explicitně zadat /LTCG.
Příklad
V kódu jazyka C++ bude vyvolána catch blok try odpovídající systém bez výjimky.Však ve výchozím nastavení, obtéká CLR systému bez výjimky s RuntimeWrappedException.Při sestavení je vytvořen z Visual C++ a Visual C++ bez modulů a chcete blok catch v kódu jazyka C++, které lze vyvolat pomocí jeho odpovídající try klauzule při bloku try výjimku mimo systém, je nutné přidat
[assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] atribut pro moduly bez C++ zdrojový kód.
// 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 logickou hodnotu atributu WrapNonExceptionThrows úpravě kódu Visual C++ schopnost zachytit výjimky bez systému.
// 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#");
}
}
}