Поделиться через


.netmodule файлы в качестве входных данных компоновщика

link.exe принимает MSIL .obj и .netmodule файлы в качестве входных данных. Выходной файл, созданный компоновщиком, является сборкой или .netmodule файлом без зависимости времени выполнения от любого из .obj .netmodule входных данных компоновщика.

Замечания

.netmodule файлы создаются компилятором MSVC с помощью /LN (создание модуля MSIL) или компоновщиком с помощью /NOASSEMBLY (создание модуля MSIL). .obj файлы всегда создаются в компиляции C++. Для других компиляторов Visual Studio используйте параметр компилятора /target:module.

Компоновщик должен передавать .obj файл из компиляции C++, которая создала объект .netmodule. Передача больше .netmodule не поддерживается, так как параметры компилятора /clr: и /clr:safepure устарели в Visual Studio 2015 и не поддерживаются в Visual Studio 2017 и более поздних версиях.

Сведения о вызове компоновщика из командной строки см . в синтаксисе командной строки Компоновщика и использовании набора инструментов MSVC из командной строки.

.netmodule Передача компоновщика или .dll файла компоновщику, скомпилированному компилятором MSVC с /clr, может привести к ошибке компоновщика. Дополнительные сведения см. в разделе "Выбор формата входных файлов ".netmodule

Компоновщик принимает как собственные .obj файлы, так и файлы MSIL.obj, скомпилированные с /clr. Смешанные .obj файлы можно передать в одной сборке. Результирующая проверка по умолчанию файла выходных данных совпадает с возможностью проверки самого низкого входного модуля.

Вы можете изменить приложение, состоящее из двух или нескольких сборок, которые будут содержаться в одной сборке. Повторно компилируйте источники сборок, а затем свяжите .obj файлы или .netmodule файлы для создания одной сборки.

Укажите точку входа с помощью /ENTRY (символ точки входа) при создании исполняемого образа.

При связывании с MSIL или файлом используйте /LTCG (создание кода во время ссылки) в противном случае, если компоновщик обнаруживает MSIL .obj .obj или .netmoduleперезагрузит ссылку с /LTCG..netmodule Вы увидите информационное сообщение о перезапуске ссылки. Это сообщение можно игнорировать, но для повышения производительности компоновщика явно укажите /LTCG.

MSIL .obj или .netmodule файлы также можно передать в cl.exe.

Входные MSIL .obj или .netmodule файлы не могут содержать внедренные ресурсы. Внедрение ресурсов в выходной модуль или файл сборки с помощью параметра компоновщика /ASSEMBLYRESOURCE (внедрение управляемого ресурса). Или используйте параметр компилятора /resource в других компиляторах Visual Studio.

Примеры

В коде catch C++ блок соответствующего try объекта будет вызываться для исключения, отличногоSystem от исключения. Однако по умолчанию CLR оболочки не являютсяSystem исключениями RuntimeWrappedException. Если сборка создается из модулей C++ и не C++ и требуется catch , чтобы блок в коде C++ был вызван из соответствующего try предложения, когда try блок создаетSystem исключение, необходимо добавить [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)] атрибут в исходный код для модулей, отличных от 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 значение атрибута WrapNonExceptionThrows , можно изменить способность кода C++ перехватывать исключение, отличное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#");
      }
   }
}
caught non System exception in C++ source code file

См. также