用作链接器输入的 .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异常,将调用相应的的 trycatch 块。 但是,默认情况下,CLR 使用 RuntimeWrappedException 包装非System异常。 如果从 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

另请参阅