C# 与.NET等效的静态库?

C# 与.NET等效的静态库?,c#,.net,assemblies,static-libraries,.net-assembly,C#,.net,Assemblies,Static Libraries,.net Assembly,我正在用托管代码(主要是C++/CLI)构建一个工具,分为两个版本,“普通用户”版本和“专业”版本 两个版本之间的核心代码相同这一事实给我带来了一些麻烦,因为我想将生成的工具打包为单个程序集(DLL),并且我不想在两个版本的工具的项目中包含公共代码的.cpp文件。我更希望有一个针对通用代码的项目和一个针对每个版本的工具的项目,并且让每个版本的工具项目依赖于通用代码,并根据需要将其链接 在非托管C++中,我将把公共代码放在静态库中,并将工具的两个版本链接到它。我似乎无法在C++/CLI中实现这一点

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

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

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

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

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

不管怎样,有人对我应该如何解决这个问题有什么建议吗


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

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


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

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

将为您提供连接。它基本上是一个本地编译器和链接器。

如前所述,ILmerge是一种方法。就个人而言,如果你将一些exe与许多DLL捆绑在一起,我倾向于。

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

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

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

你能再解释一下你的第二段吗。你是说如果我让链接器将公共代码程序集的构建产品链接到最终程序集中,那么我会遇到这些问题吗?是的,这就是为什么当你进行远程处理时,公共接口保存在服务器和客户端程序引用的第三个.dll文件中。在2个不同的程序集中拥有相同名称和结构的类型,总共创建了2种不同的类型,不同于没有托管元数据的非托管C++库,因此在程序的两个版本中都看到相同的结构化类型。我尝试过,并且无法使其工作,您知道如何设置这一点的一个不平凡的例子吗?理想情况下,代码可以使用VS2008构建,模块可以与自定义构建步骤合并?不,我不知道。模块是相当深奥的。谢谢,对于我想要的东西来说,看起来有点贵,但我会看一看,因为它可能也解决了我的混淆要求…答案中的链接似乎死了-“这个网站无法访问”。@Pang好吧,已经11年了。我认为这家公司已经不存在了。但是该功能存在于.NETCore3.x和更高版本中。我想我应该提到其中一个程序集不是100%托管代码。。。ILMerge不适用于它:(Paul,我接受了这个答案,因为它是在程序集中没有非托管代码的情况下的最佳答案。我仍在寻找一个适用于混合程序集的解决方案。我还没有研究“模块”问题。1)看起来它需要输出为exe(我的应用程序打包为dll)。2)不处理混合托管/非托管C++/CLI程序集。1)是-它无法处理“仅dll”打包。。2) 你看过“mkbundle”吗(参见其他答案)——cygwin可能是一个相当奇怪的先决条件,但IMO mkbundle确实处理托管/非托管混合——但是:我没有真正尝试过。(一直想要,很难)我还没有尝试过mkbundle,但现在要想尝试它(即有时间和意愿安装并运行所有的必备组件)需要一段时间。开发在几年前就停止了Erik,这可能会起作用,尽管从可伸缩性的角度来看这有点痛苦(也就是说,添加另一个项目并不容易,它依赖于项目1中90%的代码)。我会试一试。没错,但我认为可伸缩性问题只会在不同的普通、专业等版本之间出现。如果您要针对自己的DLL编写代码,我会认为您将在