.netmodule pliki jako dane wejściowe konsolidatora
link.exe akceptuje MSIL .obj
i .netmodule
pliki jako dane wejściowe. Plik wyjściowy utworzony przez konsolidator jest zestawem lub plikiem .netmodule
bez zależności czasu wykonywania od żadnego z .obj
plików lub .netmodule
, które były danymi wejściowymi konsolidatora.
Uwagi
.netmodule
pliki są tworzone przez kompilator MSVC za pomocą /LN (Tworzenie modułu MSIL) lub przez konsolidator z /NOASSEMBLY (Tworzenie modułu MSIL). .obj
pliki są zawsze tworzone w kompilacji języka C++. W przypadku innych kompilatorów programu Visual Studio użyj opcji /target:module kompilatora.
Konsolidator musi zostać przekazany .obj
plik z kompilacji języka C++, która utworzyła .netmodule
plik . Przekazywanie elementu .netmodule
nie jest już obsługiwane, ponieważ opcje kompilatora /clr: i /clr:safepure są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017 lub nowszym.
Aby uzyskać informacje na temat wywoływania konsolidatora z wiersza polecenia, zobacz Składnia wiersza polecenia konsolidatora konsolidatora i Używanie zestawu narzędzi MSVC z wiersza polecenia.
Przekazanie pliku .netmodule
lub .dll
do konsolidatora skompilowanego przez kompilator MSVC za pomocą polecenia /clr może spowodować błąd konsolidatora. Aby uzyskać więcej informacji, zobacz Wybieranie formatu plików wejściowych .netmodule
Konsolidator akceptuje zarówno pliki natywne .obj
, jak i pliki MSIL .obj
skompilowane za pomocą polecenia /clr. W tej samej kompilacji można przekazać mieszane .obj
pliki. Domyślna weryfikowalność wynikowego pliku wyjściowego jest taka sama jak weryfikowalność najniższego modułu wejściowego.
Możesz zmienić aplikację składającą się z co najmniej dwóch zestawów, które mają być zawarte w jednym zestawie. Ponownie skompiluj źródła zestawów, a następnie połącz .obj
pliki lub .netmodule
pliki w celu utworzenia pojedynczego zestawu.
Określ punkt wejścia przy użyciu /ENTRY (symbol punktu wejścia) podczas tworzenia obrazu wykonywalnego.
Podczas łączenia z MSIL lub pliku użyj /LTCG (generowanie kodu czasu łącza), w przeciwnym razie gdy konsolidator napotka MSIL .obj
.obj
lub .netmodule
, uruchomi ponownie link z /LTCG..netmodule
Zostanie wyświetlony komunikat informacyjny informujący o ponownym uruchomieniu linku. Możesz zignorować ten komunikat, ale aby poprawić wydajność konsolidatora, jawnie określ /LTCG.
MSIL .obj
lub .netmodule
pliki można również przekazać do cl.exe.
Dane wejściowe MSIL .obj
lub .netmodule
pliki nie mogą mieć zasobów osadzonych. Osadź zasoby w module wyjściowym lub pliku zestawu przy użyciu opcji konsolidatora /ASSEMBLYRESOURCE (Osadź zasób zarządzany). Możesz też użyć opcji /resource compiler w innych kompilatorach programu Visual Studio.
Przykłady
W kodzie catch
języka C++ blok odpowiadający try
mu zostanie wywołany dla wyjątku innego niżSystem
. Jednak domyślnie CLR opakowuje wyjątki inne niżSystem
.RuntimeWrappedException Gdy zestaw jest tworzony na podstawie modułów C++ i innych niż C++, a blok w kodzie C++ ma catch
być wywoływany z odpowiedniej try
klauzuli, gdy try
blok zgłaszaSystem
wyjątek inny niż C++, należy dodać [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
atrybut do kodu źródłowego dla modułów innych niż 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();
}
*/
Boolean
Zmieniając wartość atrybutuWrapNonExceptionThrows
, można zmodyfikować możliwość przechwycenia kodu C++, aby przechwycićSystem
wyjątek.
// 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