.NET相当于静态库?

时间:2009-10-02 08:37:13

标签: c# .net assemblies static-libraries .net-assembly

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

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

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

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

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

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

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

7 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

正如所说的ILmerge是一种方式,如果你的朋友们使用很多dll,那么我个人赞成Netz

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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