.netmodule Dateien als Linkereingabe
link.exe akzeptiert MSIL .obj
und .netmodule
Dateien als Eingabe. Die vom Linker erstellte Ausgabedatei ist eine Assembly oder eine .netmodule
Datei ohne Laufzeitabhängigkeit von einer der .obj
Dateien, .netmodule
die für den Linker eingegeben wurden.
Hinweise
.netmodule
Dateien werden vom MSVC-Compiler mit /LN (MSIL-Modul erstellen) oder vom Linker mit /NOASSEMBLY (Erstellen eines MSIL-Moduls) erstellt. .obj
Dateien werden immer in einer C++-Kompilierung erstellt. Verwenden Sie für andere Visual Studio-Compiler die Compileroption /target:module.
Der Linker muss die .obj
Datei aus der C++-Kompilierung übergeben werden, mit der die .netmodule
Datei erstellt wurde. Das Übergeben einer .netmodule
Datei wird nicht mehr unterstützt, da die Compileroptionen /clr: und /clr:safepure in Visual Studio 2015 und in Visual Studio 2017 und höher nicht unterstützt werden.
Informationen zum Aufrufen des Linkers über die Befehlszeile finden Sie unter "Linker-Befehlszeilensyntax " und "Verwenden des MSVC-Toolsets aus der Befehlszeile".
Das Übergeben einer .netmodule
Datei an .dll
den Linker, der vom MSVC-Compiler mit /clr kompiliert wurde, kann zu einem Linkerfehler führen. Weitere Informationen finden Sie unter Auswählen des Formats von Eingabedateiennetmodule.
Der Linker akzeptiert sowohl systemeigene .obj
Dateien als auch MSIL-Dateien .obj
, die mit /clrkompiliert wurden. Sie können gemischte .obj
Dateien im selben Build übergeben. Die standardmäßige Prüfbarkeit der Ausgabedatei entspricht der Nachprüfbarkeit des niedrigsten Eingabemoduls.
Sie können eine Anwendung ändern, die aus zwei oder mehr Assemblys besteht, die in einer Assembly enthalten sind. Kompilieren Sie die Assemblyquellen erneut, und verknüpfen Sie dann die .obj
Dateien oder .netmodule
Dateien, um eine einzelne Assembly zu erstellen.
Geben Sie beim Erstellen eines ausführbaren Bilds einen Einstiegspunkt mithilfe von /ENTRY (Einstiegspunktsymbol) an.
Verwenden Sie beim Verknüpfen mit einer MSIL oder .netmodule
Datei /LTCG (Link-Time Code Generation), andernfalls, wenn der Linker auf die MSIL .obj
.obj
trifft, oder .netmodule
startet er den Link mit /LTCG neu. Es wird eine Informationsmeldung angezeigt, dass der Link neu gestartet wird. Sie können diese Meldung ignorieren, aber um die Leistung von Linker zu verbessern, geben Sie explizit /LTCG an.
MSIL .obj
oder .netmodule
Dateien können auch an cl.exe übergeben werden.
Eingabe-MSIL .obj
oder .netmodule
Dateien können keine eingebetteten Ressourcen haben. Einbetten von Ressourcen in ein Ausgabemodul oder eine Assemblydatei mithilfe der Linkeroption /ASSEMBLYRESOURCE (Einbetten einer verwalteten Ressource). Oder verwenden Sie die Option "/resource compiler" in anderen Visual Studio-Compilern.
Beispiele
Im C++-Code wird der catch
Block eines entsprechenden try
Codes für eine AusnahmeSystem
aufgerufen. Standardmäßig werden jedoch CLR keineSystem
Ausnahmen mit RuntimeWrappedException. Wenn eine Assembly aus C++- und Nicht-C++-Modulen erstellt wird und ein catch
Block in C++-Code aus der entsprechenden try
Klausel aufgerufen werden soll, wenn der try
Block eine AusnahmeSystem
auslöst, müssen Sie das [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
Attribut dem Quellcode für die Nicht-C++-Module hinzufügen.
// 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();
}
*/
Durch Ändern des Boolean
Werts des WrapNonExceptionThrows
Attributs ändern Sie die Fähigkeit des C++-Codes, eine Ausnahme abzufangenSystem
.
// 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