单个Visual Studio C#项目,多个DLL版本



我们有一个主项目,它创建了一个单独的DLL,其中FEATURE_1、FEATURE_2和FEATURE.3是启用这些相应功能的三个条件编译符号。

MyLib.dll=>在中编译了FEATURE_1、FEATURE_2和FEATURE.3

我们现在希望有相同的主项目吐出3个不同的DLL如下:

MyLib.1.dll => has only FEATURE_1 compiled in
MyLib.2.dll => has only FEATURE_2 compiled in
MyLib.3.dll => has only FEATURE_3 compiled in

目前,我们在VS2013中构建,这些编译常量在.csproj文件(在<DefineConstants> </DefineConstants>标记中)中定义,后者对它们进行硬编码。

是否可以通过命令行传递它们,这样我们仍然可以维护一个主csproj,但只需更改命令行(例如:gcc的-D<buildFlag>样式)就可以在RELEASE配置中构建3种不同的风格?该解决方案还有其他项目,它们被设计用于RELEASE配置。我也对任何其他易于使用和维护的技术持开放态度。

我们真的在努力避免创建伪项目或影响解决方案中的其他项目(解决方案中有21个项目)——对于非常简单的事情来说,这似乎是一种过度杀戮/黑客行为。

我没有用命令行做任何事情,但为了解决类似的问题,我创建了单独的项目(定义框架目标和任何条件编译符号),然后将所有项目文件添加为LINKED文件。这样,我只需要修改一组源文件,但每个项目都编译成自己的DLL。

将文件作为链接添加到项目

  1. 右键单击项目,然后单击"添加现有项…"
  2. 选择要添加的文件
  3. 单击添加按钮旁边的箭头,然后单击添加为链接,而不是单击添加按钮

我不确定这是否适用于您的情况,但在为不同的.NET框架版本开发库时,它确实为我节省了很多时间。

是否有可能实现彻底的转变?

您可以为每个功能创建单独的项目,然后在打包阶段将较小的程序集合并为一个程序集,而不是在单个库中定义所有功能,然后禁用其中的一些功能。

微软有ILMerge,而ILRepack是一个开源的替代方案,

https://www.nuget.org/packages/ilmerge

https://www.nuget.org/packages/ILRepack/

然后,您就可以摆脱条件编译,这太难管理了,并且复杂性转移到了打包脚本上,可以很容易地对其进行管理并将其检查到源代码管理中。

最新更新