.NET相当于静态库?

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

核心代码在两个版本之间是相同的这一事实导致我有点麻烦,因为我想将生成的工具打包为单个程序集(DLL),我不希望必须包含公共的.cpp文件两个版本工具的项目代码。 我宁愿有一个公共代码项目和每个工具版本的项目,并且每个版本的工具项目都依赖于公共代码并根据需要链接它。

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

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

我可能做错了但是我试图用netmodules和其他方法来解决这个问题,但是我无法让它工作。 最后,我让它工作的唯一方法是告诉链接器链接公共代码程序集的构建产品而不是有效的结果但是有点像黑客恕我直言。

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

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

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

正如所说的ILmerge是单向的,如果你的兄弟们有很多dll的话,我个人赞成Netz 。

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

如果我正确理解这一点,那么你有一个包含两个项目的解决方案。 “普通”用户的一个项目和“专业”用户的一个项目。 Visual Studio允许您从另一个项目向另一个文件源添加“链接”。 如果您的“专业版”具有真正的核心代码文件,并且在“普通”版本中添加现有 – >在“专业”项目中找到该文件,并单击“添加”按钮的向下箭头并选择“添加为链接” ”。 现在你有两个项目之间完全相同的单个文件。

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

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

Remotesoft Salamander会把你搞定 。 它基本上是一个本机编译器和链接器。

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