.NETMODULE-Dateien als Eingabe für den Linker
Aktualisiert: November 2007
link.exe akzeptiert nun MSIL-OBJ- und NETMODULE-Dateien als Eingabe. Die vom Linker erzeugte Ausgabedatei ist eine Assembly oder eine NETMODULE-Datei ohne Laufzeitabhängigkeit von den OBJ- oder NETMODULE-Dateien, die als Eingabe für den Linker verwendet wurden.
NETMODULE-Dateien werden vom Visual C++-Compiler mit /LN (Erstellen eines MSIL-Moduls) oder vom Linker mit /NOASSEMBLY (MSIL-Modul erstellen) erstellt. OBJ-Dateien werden stets in einer Visual C++-Kompilierung erstellt. Verwenden Sie bei anderen Visual Studio-Compilern die /target:module-Compileroption.
In den meisten Fällen müssen Sie dem Linker die OBJ-Datei der Visual C++-Kompilierung übergeben, bei der die NETMODULE-Datei erstellt wurde, wenn die NETMODULE-Datei nicht mit /clr (Common Language Runtime-Kompilierung) erstellt wurde. Als Eingabe für den Linker verwendete MSIL NETMODULE-Dateien müssen reine MSIL sein, das vom Visual C++-Compiler mit /clr:safe generiert werden kann. Andere Visual Studio-Compiler erzeugen standardmäßig reine MSIL-Module.
Informationen zum Aufrufen des Linkers über die Befehlszeile finden Sie unter Syntax für die Linkerbefehlszeile und Festlegen der Pfad- und Umgebungsvariablen für Befehlszeilenbuilds.
Das Übergeben einer mit /clr oder /clr:pure vom Visual C++-Compiler erstellten NETMODULE- oder DLL-Datei an den Linker kann zu einem Linkerfehler führen. Weitere Informationen finden Sie unter Auswählen des Formats von .netmodule-Eingabedateien.
Der Linker akzeptiert systemeigene OBJ-Dateien sowie mit /clr, /clr:pure oder /clr:safe kompilierte MSIL-OBJ-Dateien. Bei der Übergabe gemischter OBJ-Dateien im selben Build entspricht die Überprüfbarkeit der erstellten Ausgabedatei standardmäßig der geringsten Überprüfbarkeitsstufe der Eingabemodule. Wenn Sie z. B. eine überprüfbare und reine (safe and pure) OBJ-Datei an den Linker übergeben, ist die Ausgabedatei rein (pure). Mit /CLRIMAGETYPE (Angeben des CLR-Bildtyps) können Sie gegebenenfalls eine geringere Überprüfbarkeit angeben.
Wenn Ihre Anwendung gegenwärtig aus zwei oder mehr Assemblys besteht und die Anwendung in einer Assembly enthalten sein soll, müssen Sie die Assemblys neu kompilieren und anschließend die OBJ- oder NETMODULE-Dateien verknüpfen, um eine einzelne Assembly zu erstellen.
Sie müssen mit /ENTRY (Symbol für Einstiegspunkt) einen Einstiegspunkt angeben, wenn Sie ein ausführbares Bild erstellen.
Verwenden Sie zur Verknüpfung mit MSIL .obj- oder NETMODULE-Dateien /LTCG (Code zur Verknüpfungszeit generieren), andernfalls startet der Linker beim Antreffen einer MSIL-OBJ- oder NETMODULE-Datei die Verknüpfung mit /LTCG neu.
MSIL-OBJ- oder NETMODULE-Dateien können auch an cl.exe übergeben werden.
Als Eingabe verwendete MSIL-OBJ- oder NETMODULE-Dateien dürfen keine eingebetteten Ressourcen enthalten. Eine Ressource wird mit der /ASSEMBLYRESOURCE (Verwaltete Ressource einbetten)-Linkeroption oder in anderen Visual Studio-Compilern mit der /resource-Compileroption in eine Ausgabedatei (Modul oder Assembly) eingebettet.
Wenn Sie die MSIL-Verknüpfung ausführen, ohne auch /LTCG (Code zur Verknüpfungszeit generieren) angegeben zu haben, erhalten Sie eine Meldung mit der Information, dass die Verknüpfung neu gestartet wird. Sie können diese Meldung ignorieren, zur Verbesserung der Linkerleistung bei der MSIL-Verknüpfung sollten Sie jedoch explizit /LTCG angeben.
Beispiel
In C++-Code wird für eine systemfremde Ausnahme der catch-Block eines dazugehörigen try-Blocks aufgerufen. Standardmäßig schließt die CLR systemfremde Ausnahmen mit RuntimeWrappedException in einen Wrapper ein. Wenn eine Assembly aus Visual C++-Modulen und nicht mit Visual C++ geschriebenen Modulen erstellt wurde und beim Auslösen einer systemfremden Ausnahme durch einen try-Block der entsprechende catch-Block im C++-Code aus seiner zugehörigen try-Klausel aufgerufen werden soll, müssen Sie das folgende Attribut zum Quellcode für nicht in C++ geschriebene Module hinzufügen:
[assembly:System::Runtime::CompilerServices::RuntimeCompatibility (WrapNonExceptionThrows=false)]
// 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();
}
*/
Wenn Sie den booleschen Wert für das WrapNonExceptionThrows-Attribut ändern, ändern Sie die Fähigkeit des Visual C++-Codes, eine systemfremde Ausnahme abzufangen.
// 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