.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