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

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

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

В большинстве случаев необходимо передать компоновщику OBJ-файл из компиляции Visual C++, которая создала .netmodule, если .netmodule не создается с помощью /clr (компиляция CLR). .netmodules MSIL, используемый в качестве входных данных компоновщику должно быть чистый MSIL, которая может быть создана компилятором Visual C++ — с помощью /clr:safe. Другие компиляторы Visual Studio создают модули MSIL по умолчанию.

Сведения о запуске компоновщика из командной строки см. в разделах Синтаксис командной строки компоновщика и Установка переменных пути и среды при построении из командной строки.

Передача .netmodule или DLL-файл компоновщику, был компилироваться C компилятором Visual C++ с /clr или с /clr:pure может привести к ошибке компоновщика. Для получения дополнительной информации см. Выбор формата входных файлов netmodule.

Компоновщик принимает машинные OBJ-файлы, а также OBJ-файлы на языке MSIL, скомпилированные с использованием параметров /clr, /clr:pure или /clr:safe. При передаче смешанных OBJ-файлов в одном построении проверяемость результирующих выходных файлов будет равна по умолчанию минимальному уровню проверяемости входных модулей. Например, если передать компоновщику безопасный и чистый OBJ-файл, то файл вывода будет чистым. Параметр /CLRIMAGETYPE (указание типа образа среды CLR) позволяет указать более низкий уровень проверяемости, если это необходимо.

Если в настоящее время имеется приложение, состоящее из нескольких сборок и требуется приложения включено в одной сборке, необходимо перекомпилировать сборки, а затем связать .objs или .netmodules для создания единой сборки.

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

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

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

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

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

Пример

В коде на языке C++ блок catch, связанный с соответствующим try, будет вызван при возникновении несистемного исключения. Однако по умолчанию среда CLR упаковывает несистемные исключения с помощью RuntimeWrappedException. При создании сборки из модулей Visual C++ и не-Visual C++ и необходимости вызова блока catch в коде C++ из соответствующей конструкции try при создании блоком try несистемного исключения следует добавить атрибут

[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();
}
*/

Путем изменения логического значения WrapNonExceptionThrows можно управлять способностью кода на языке 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#");
      }
   }
}
  

См. также

Ссылки

Входные LINK-файлы

Параметры компоновщика