用作链接器输入的 .netmodule 文件
link.exe 接受 MSIL .obj
和 .netmodule
文件作为输入。 链接器生成的输出文件是一个与输入到链接器的任何 .obj
或 .netmodule
文件没有运行时依赖关系的程序集或 .netmodule
文件。
注解
.netmodule
文件由 MSVC 编译器使用 /LN(创建 MSIL 模块)创建,或由链接器使用 /NOASSEMBLY(创建 MSIL 模块)创建。 .obj
文件始终在 C++ 编译中创建。 对于其他 Visual Studio 编译器,请使用“/target:module”编译器选项。
链接器必须从创建 .netmodule
的 C++ 编译中传递 .obj
文件。 不再支持传入 .netmodule
,因为“/clr:pure”和“/clr:safe”编译器选项在 Visual Studio 2015 中已弃用,并且在 Visual Studio 2017 和更高版本中不受支持。
有关如何从命令行调用链接器的信息,请参阅链接器命令行语法和从命令行使用 MSVC 工具集。
向链接器传递由 MSVC 编译器使用“/clr”编译的 .netmodule
或 .dll
文件可能导致链接器错误。 有关详细信息,请参阅选择 .netmodule 输入文件的格式。
链接器接受使用“/clr”编译的本机 .obj
文件和 MSIL .obj
文件。 可以将混合 .obj
文件传入同一生成中。 生成的输出文件的默认可验证性与最低输入模块的可验证性相同。
可以更改由两个或多个程序集组成的应用程序,以包含在一个程序集中。 重新编译程序集的源,然后链接 .obj
文件或 .netmodule
文件以生成单个程序集。
创建可执行映像时,使用 /ENTRY(入口点符号)指定入口点。
与 MSIL .obj
或 .netmodule
文件链接时,请使用 /LTCG(链接时代码生成),否则,当链接器遇到 MSIL .obj
或 .netmodule
时,它将重新启动与 /LTCG 的链接。 你将看到一条信息性消息,指出链接正在重启。 可以忽略此消息,但为了提高链接器性能,请显式指定 /LTG。
MSIL .obj
或 .netmodule
文件也可以传递到 cl.exe。
输入的 MSIL .obj
或 .netmodule
文件不能包含嵌入的资源。 使用 /ASSEMBLYRESOURCE(嵌入托管资源)链接器选项,在输出模块或程序集文件中嵌入资源。 或者,在其他 Visual Studio 编译器中使用 /resource 编译器选项。
示例
在 C++ 代码中,对于非System
异常,将调用相应的的 try
的 catch
块。 但是,默认情况下,将 CLR 非System
异常包装为 RuntimeWrappedException. 如果从 C++ 和非 C++ 模块创建程序集,并且希望在 try
块引发非System
异常时从其相应的 try
子句调用 C++ 代码中的 catch
块,则必须将 [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
属性的 Boolean
值,可以修改 Visual 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