Udostępnij za pośrednictwem


.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 .netmoduleplik . 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

Zobacz też