.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 .netmoduleDatei 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 .netmodulestartet 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 umschließt die CLR jedoch 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

Siehe auch