选择 .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 引用它们)。