Udostępnij za pośrednictwem


pliki .netmodule jako dane wejściowe Linker

Link.exe teraz akceptuje MSIL .obj i.netmodules jako danych wejściowych.Plik wyjściowy produkowane przez program łączący będzie zestawu lub.netmodule z zależnością nie run-time na żadnym .obj lub.netmodules, że zostały one wprowadzone do programu łączącego.

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

W większości przypadków należy przekazać łączący pliku .obj z kompilacji Visual C++, utworzony.netmodule, chyba że.netmodule został utworzony za pomocą / CLR (kompilacja wspólnej Language Runtime).INSTRUKCJE MSIL.używane jako dane wejściowe do łączący musi być czysty MSIL, który można wyprodukowany przy użyciu kompilatora Visual C++ netmodules /clr:safe.Inne kompilatory Visual Studio wyprodukowania czystej modułów MSIL domyślnie.

Aby uzyskać informacje, jak wywołać program łączący z wiersza polecenia, zobacz Program łączący składni wiersza polecenia i Ustawianie ścieżki i zmienne środowiskowe dla wiersza polecenia kompilacje.

Przekazując.plik netmodule lub dll program łączący, że został skompilowany przez kompilator Visual C++ z /clr lub /clr:pure może spowodować błąd programu łączącego.Aby uzyskać więcej informacji, zobacz Wybieranie formatu .netmodule pliki danych wejściowych.

Program łączący akceptuje pliki macierzystym .obj, jak również pliki .obj MSIL skompilowany z /clr, /clr:pure, lub /clr:safe.Przy przekazywaniu mieszane .objs w tym samym kompilacji, możliwość weryfikacji wynikowy plik wyjściowy domyślnie będzie równa najniższym poziomie możliwość weryfikacji wejściowych modułów.Na przykład jeśli przekazać .obj bezpieczne i czyste łączący plik wyjściowy będzie czysty./ CLRIMAGETYPE (Określ typ CLR obrazu)Pozwala określić niższego poziomu możliwość weryfikacji, jeżeli jest to, co jest potrzebne.

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

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

Podczas łączenia z .obj MSIL lub.plik netmodule, użyj / LTCG (generowanie kodu czasu łącza), inaczej, gdy program łączący napotka MSIL .obj lub.netmodule, zostanie ponownie uruchomiony łącze z /LTCG.

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

Dane wejściowe MSIL .obj lub.pliki netmodule, nie osadzone zasobów.Zasób jest osadzony w pliku wyjściowym (moduł lub zestawu) z / ASSEMBLYRESOURCE (osadzanie zarządzanych zasobów) opcję lub z /resource opcję kompilatora w inne kompilatory Visual Studio.

Podczas wykonywania łączenia MSIL, a także nie zostanie określony / LTCG (generowanie kodu czasu łącza), zobaczysz komunikat informacyjny, sprawozdawczości, łącze jest ponowne uruchomienie.Ten komunikat można zignorować, ale aby poprawić wydajność programu łączącego z MSIL łączenie, jawnie określić /LTCG.

Przykład

Kodu C++ bloku catch odpowiednich spróbuj zostanie wywołany dla wyjątku nie systemu.Jednak domyślnie CLR otacza wyjątki innych niż System z RuntimeWrappedException.Gdy zespół jest tworzona z Visual C++ i modułów innych niż Visual C++ i chcesz blok catch w C++ kod zostanie wywołany z jej odpowiednich klauzuli try, gdy blok try generuje wyjątek braku systemu, należy dodać

atrybut [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] 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();
}
*/

Zmieniając wartość logiczna atrybutu WrapNonExceptionThrows, możesz zmodyfikować możliwość wychwycić wyjątek systemu bez kodu Visual C++.

// 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 danych wejściowych łączy

Opcje Linker