选择 .netmodule 输入文件的格式

MSIL .obj 文件(用 /clr 编译)也可用作 .netmodule 文件。.obj 文件包含元数据和本机符号。.netmodules 只包含元数据。

可通过 /addmodule 编译器选项将 MSIL .obj 文件传递给任何其他 Visual Studio 编译器(但需注意,该 .obj 文件将成为结果程序集的一部分,而且必须随程序集一起提供)。例如,Visual C# 和 Visual Basic 具有 /addmodule 编译器选项。

说明说明

大多数情况下,需要向链接器传递由创建 .net 模块的编译生成的 .obj 文件。如果 .netmodule 是使用 /clr:pure 创建的,则不属于这种情况。向链接器传递 .dll 或 .netmodule MSIL 模块文件可能会导致 LNK1107。

.obj 文件以及与之关联的 .h 文件(通过源代码中的 #include 引用)允许 C++ 应用程序使用模块中的本机类型,而在 .netmodule 文件中,只有托管类型可由 C++ 应用程序使用。如果尝试向 #using 传递 .obj 文件,则关于本机类型的信息将不可用;改为 #include 此 .obj 文件的 .h 文件。

其他 Visual Studio 编译器只可以使用模块中的托管类型。

使用下列方法来确定是否需要使用 .netmodule 或 .obj 文件作为 Visual C++ 链接器的模块输入:

  • 如果使用 Visual Studio 编译器(而不是 Visual C++)生成,则生成一个 .netmodule 并使用 .netmodule 作为链接器的输入。

  • 如果使用 Visual C++ 编译器生成模块,并且模块将用于生成库以外的某些内容,则使用编译器生成的 .obj 文件作为链接器的模块输入,而不要将 .netmodule 文件用作输入。

  • 如果模块将用于生成一个本机库(而不是托管库),则使用 .obj 文件作为链接器的模块输入并生成一个 .lib 库文件。

  • 如果模块将用于生成托管库,并且链接器的所有模块输入将都是可验证的(使用 /clr:safe 生成),则使用 .obj 文件作为链接器的模块输入并生成一个 .dll(程序集)或 .netmodule(模块)库文件。

  • 如果模块将用于生成托管库,并且将使用 /clr:pure 或 /clr:safe 生成链接器的所有模块输入,则当仅希望公开库中的托管类型时,才使用 .obj 文件作为链接器的模块输入并生成一个 .dll(程序集)或 .netmodule(模块)。如果要公开库中的托管类型,并且还要 C++ 应用程序使用库中的本机类型,则库将由库组件模块的 .obj 文件组成(您还要提供各个模块的 .h 文件,以便可以使用源代码中的 #include 引用它们)。

  • 如果模块将用于生成托管库,并且链接器的一个或多个模块输入将仅用 /clr 生成,则使用 .obj 文件作为链接器的模块输入并生成一个 .dll(程序集)。如果要公开库中的托管类型,并且还要 C++ 应用程序使用库中的本机类型,则库将由库组件模块的 .obj 文件组成(您还要提供各个模块的 .h 文件,以便可以使用源代码中的 #include 引用它们)。

请参见

参考

用作链接器输入的 .netmodule 文件