2

我需要创建一个由 2 个模块组成的 .NET 程序集:1 个带有本机代码的内部(在 DLL 中)和 1 个外部(在 .netmodule 文件中)。

这很容易做到,除了原生部分。

C# 的编译器可以做到这一点(这是我想要的,但使用本机代码):

csc /t:library /out:foobar.dll foo.cs /out:bar.netmodule bar.cs
-foobar.dll (contains assembly manifest and foo's IL)
    -internal module foobar.dll (contains foo's IL)
    -external module bar.netmodule (contains bar's IL)

C++ 编译器/链接器会将所有内容放在 1 个内部模块中。

cl /clr /LD foo.cpp /link bar.netmodule /LTCG
OR link /out:foobar.dll foo.netmodule bar.netmodule
-foo(bar).dll (contains IL for both foo and bar, as well as assembly manifest)

汇编链接器仅执行外部模块:

al /out:foobar.dll foo.netmodule bar.netmodule
-foobar.dll (only contains manifest)
    -external module foo.netmodule (contains foo's IL)
    -external module bar.netmodule (contains bar's IL)

我也尝试过手动调整 IL,但 ILDASM 和 ILASM 似乎无法往返本机代码:

ildasm foobar.dll /out=foobar.il
ilasm /dll foobar.il
-lots of errors

为了澄清,我想要的是:

-foobar.dll (contains assembly manifest and foo's IL AND NATIVE CODE)
    -internal module foobar.dll (contains foo's IL AND NATIVE CODE)
    -external module bar.netmodule (contains bar's IL)
4

3 回答 3

3

亨克已经走上了正轨。您可以.netmodule为输入创建一个仅用于创建装配的。程序集是 .NET 环境中最小的执行单元。一个程序集可以由一个或多个物理文件组成。它可以包含多种资源:资源文件、网络模块和本地 DLL。网络模块不能单独部署,它必须链接到程序集中。

既然我们已经解决了这个问题,让我们试着专注于你所追求的。您是否正在尝试创建多文件程序集?这是可能的。这是一篇关于多模块程序集的相当古老但仍然有用的帖子。或者您是否正在尝试创建可用作库的网络模块?因为那是不可能的,因为 netmodules 不包含程序集。

如果这不能回答您的问题,您能否更详细地解释您希望最终结果是什么和/或您希望如何使用它?

于 2009-10-26T00:46:56.173 回答
2

看起来这个问题在System.Data.Sqlite中得到了解决。请参阅文件SQLite.Interop/SQLite.Interop.2010.vcxproj

<Link/>元素中,您需要指定模块中的网络<AdditionalDependencies/>模块。

于 2012-12-21T23:18:11.993 回答
1

免责声明:这是未经测试的。

您在寻找正确的cl 编译器选项吗?

cl /clr:pure /LN Stringer.cpp
cl /clr:pure Client.cpp /link /ASSEMBLYMODULE:Stringer.netmodule

我很惊讶 Abel 提供的链接中的link.exe 工具对您不起作用。

于 2010-07-31T19:56:51.920 回答