Udostępnij za pośrednictwem


Pliki .netmodule — Wejście konsolidatora

Link.exe teraz akceptuje MSIL .obj i .netmodules jako dane wejściowe.Utworzony przez konsolidator plik wyjściowy będzie zespół lub .netmodule z żadnych zależności wykonywania na dowolnym .obj lub .netmodules, które zostały wprowadzone do linker.

.netmodules są tworzone przez kompilator języka Visual C++ z /LN (Utwórz moduł MSIL) lub przez program łączący z /NOASSEMBLY (Utwórz moduł MSIL). .objs są zawsze tworzone podczas kompilacji programu Visual C++.Dla innych kompilatory Visual Studio, użyj /target:module opcję kompilatora.

W większości przypadków należy przekazać do linker pliku .obj kompilacji Visual C++, który utworzony .netmodule, chyba że .netmodule został utworzony za pomocą /clr (Kompilacja środowiska uruchomieniowego języka wspólnego)..Netmodules instrukcje MSIL używane jako dane wejściowe do linker musi być czysty MSIL, które mogą być produkowane przy użyciu kompilatora Visual C++ /clr:safe.Inne kompilatory Visual Studio produkują czystego moduły MSIL domyślnie.

Aby uzyskać informacje, jak wywołać program łączący z wiersza polecenia, zobacz Składnia wiersza polecenia konsolidatora i Ustawianie ścieżki i zmiennych środowiskowych dla kompilacji z wiersza polecenia.

Przekazywanie pliku .dll lub .netmodule do linker został skompilowany przez kompilator języka Visual C++ z /clr lub z /clr:pure może spowodować błąd linker.Aby uzyskać dodatkowe informacje, zobacz Wybieranie formatu plików wejściowych .netmodule.

Program łączący akceptuje pliki .obj macierzystego, a także pliki .obj MSIL skompilowany z /clr, /clr:pure, lub /clr:safe.Przekazując mieszane .objs ten sam budować, możliwość weryfikacji wynikowego pliku wyjściowego domyślnie będzie równa najniższego poziomu możliwość weryfikacji modułów wejściowych.Na przykład jeśli do linker przekazany .obj bezpieczne i czyste, plik wyjściowy będzie czysta./CLRIMAGETYPE (Określenie typu obrazu CLR)Pozwala określić niższym poziomie możliwość weryfikacji, czy to, co jest potrzebne.

Jeśli masz obecnie aplikacji, która składa się z dwóch lub więcej zestawów i chcesz, aby aplikacja muszą być zawarte w jednym zestawie, należy ponownie skompilować zestawów, a następnie połączyć .objs lub .netmodules do produkcji jednego zestawu.

Należy określić punkt wejścia za pomocą /ENTRY (Symbol punktu wejścia) podczas tworzenia obrazu wykonywalnego.

Użyj podczas łączenia z pliku Intermediate .obj lub .netmodule, /LTCG (Generowanie łączonych kodów czasowych), w przeciwnym razie po linker napotka MSIL .obj lub .netmodule, to zostanie uruchomiony ponownie łączy z /LTCG.

Instrukcje MSIL pliki .obj lub .netmodule mogą być również przekazywane do cl.exe.

Instrukcje MSIL .obj lub .netmodule plików wejściowych nie osadzania zasobów.Zasób jest osadzony w pliku wyjściowego (moduł lub zestawu) z /ASSEMBLYRESOURCE (Osadź zarządzany zasób) opcję lub z /resource opcję kompilatora w innych programów kompilujących w języku Visual Studio.

Podczas wykonywania łączenia MSIL, a także nie zostanie określony /LTCG (Generowanie łączonych kodów czasowych), zostanie wyświetlony komunikat informacyjny, zgłoszenie, że łącze jest ponowne uruchomienie.Ten komunikat można zignorować, ale na poprawę wydajności program łączący z MSIL łączenia, jawnie określić /LTCG.

Przykład

W kodzie języka C++ blok catch try odpowiednich zostanie wywołany dla wyjątku nie System.Jednak domyślnie CLR otacza wyjątki nie System z RuntimeWrappedException.Podczas tworzenia zestawu z Visual C++ i moduły non Visual C++ i chcesz blok catch w kodzie języka C++ powoływać z jego odpowiedniej klauzuli try po bloku try zgłasza wyjątek nie System, należy dodać

atrybut [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] do kodu źródłowego dla modułów nie 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();
}
*/

Zmieniając Boolean wartość atrybutu WrapNonExceptionThrows, należy zmodyfikować kod Visual C++ możliwość połowu wyjątek nie System.

// 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#");
      }
   }
}
  

Zobacz też

Informacje

Pliki wyjściowe LINK

Opcje konsolidatora