6

我在托管代码(主要是 C++/CLI)中构建了一个工具,有两个版本,一个“普通用户”版本和一个“专业”版本。

两个版本之间的核心代码相同的事实给我带来了一些麻烦,因为我想将生成的工具打包为单个程序集 (DLL),并且我不想包含通用的 .cpp 文件两个版本工具的项目中的代码。我宁愿有一个用于公共代码的项目和一个用于每个版本的工具的项目,并且让每个版本的工具项目都依赖于公共代码并根据需要链接它。

在非托管 C++ 中,我会通过将公共代码放在静态库中并将工具的两个版本链接到它来做到这一点。我似乎无法让它在 C++/CLI 中工作。似乎我被迫将公共代码构建到 DLL 程序集中,这导致了比我想要的更多的 DLL。

因此,总而言之,我无法弄清楚如何在一个项目中构建公共代码并将其与每个最终产品项目链接以生成两个都包含公共代码的单个 DLL 程序集。

我可能做错了什么,但我试图弄清楚如何使用 netmodules 和其他东西来做到这一点,但我就是无法让它工作。最后,我让它工作的唯一方法是告诉链接器链接通用代码程序集的构建产品,而不是链接有效但有点像 hack 恕我直言的结果。

无论如何,有人对我应该如何解决这个问题有任何建议吗?

编辑:我想我应该提到这样一个事实,即生成的程序集不是 100% 托管代码,它们包含托管和非托管代码的混合,这可能与使用 C++/CLI 生成的程序集很常见......

4

7 回答 7

6

如果您对所有 DLL 感到恼火,请下载ILMerge。我使用它来将多个 DLL 捆绑到一个易于使用的 .EXE 中,供我的客户使用。

于 2009-10-02T08:55:18.663 回答
3

如果我理解正确,您有一个包含两个项目的解决方案。一个项目供“普通”用户使用,一个项目供“专业”用户使用。Visual Studio 允许您将“链接”添加到来自另一个项目的另一个文件源。如果您的“pro”版本具有真正的核心代码文件,并且在您的“普通”版本中添加现有的 -> 在“pro”项目中找到该文件,然后单击“添加”按钮旁边的向下箭头并选择“添加为链接”。现在你有一个文件,在两个项目之间实际上是相同的。

于 2009-11-12T04:17:38.437 回答
2

如前所述,ILmerge 是一种方式。就个人而言,如果您将一些 exe 与许多 DLL 捆绑在一起,我更喜欢Netz

于 2009-10-02T09:00:29.233 回答
1

你可以使用模块。您可以使用程序集链接器将它们链接到程序集中,al.exe.

于 2009-10-02T09:10:39.400 回答
0

这是 .Net 编译过程的缺点,你不能拥有静态库和将它们组合在一起的头文件之类的东西,所有东西都保存在一个大 dll 文件中,共享信息的唯一方法是构建一个通用 dll并从其他程序集中引用它或复制每个 dll 中的代码(可能通过在项目之间复制/链接 .cs 文件)。

请注意,第二种方式将声明不同的类型,即使它们具有相同的名称。这会用远程处理(或任何需要转换到进程之间的特定共享接口的东西)之类的东西来咬你的屁股。

于 2009-10-02T08:49:53.403 回答
0

Remotesoft Salamander将连接您。它基本上是一个本地编译器和链接器。

于 2009-10-02T08:58:55.553 回答
0

当使用单声道(或 cygwin 是一个选项)时,mkbundle也可能是一个有效的选择。

于 2009-10-02T09:04:38.867 回答