【问题标题】:Single Visual Studio C# project, multiple DLLs versions?单个 Visual Studio C# 项目,多个 DLL 版本?
【发布时间】:2014-04-10 22:33:51
【问题描述】:

我们有一个主项目,它创建一个 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 个项目)——对于非常简单的事情来说,这似乎是一种矫枉过正/骇人听闻的事情。

【问题讨论】:

  • look at this answer。可能是你需要的
  • 不确定。我需要在 RELEASE 配置中构建的所有三个 DLL,而不是具有三个 RELEASE-1/2/3 配置(此解决方案中的其他项目都依赖于 RELEASE)
  • 我明白了,直接从VS你需要定义3个配置并运行编译3次。也许一些 MSBUILD 向导可以帮助你
  • 但是,如果您准备一个名为 RELEASE_FEATURE1 的配置继承自 RELEASE 并将其应用于您的所有项目,然后继续每个需要定义 FEATURE_1 的项目并设置它,最后构建整个解决方案。最后,您将在一个名为 BIN\RELEASE_FEATURE1 的子文件夹中拥有您的应用,并且仅启用此功能。对其他两个重复此操作,您在各自的子文件夹中有 3 组不同的程序集。从现在开始,您只需切换配置并重建所需的设置
  • 当然,只要你从命令行构建。从 IDE 执行此操作需要添加解决方案平台。这是一个可怕的 hack,总是可以通过使用配置文件更好地解决。 C# 不会像 GCC 那样给您创建一个麻烦,这至少要归功于即时编译器。使用项目 + 属性、设置。

标签: c# visual-studio dll msbuild


【解决方案1】:

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

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

  1. 右键单击项目并单击添加现有项目...
  2. 选择要添加的文件(或多个文件)。
  3. 不是点击添加按钮,点击添加按钮旁边的箭头,然后点击添加为链接

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

【讨论】:

  • 谢谢,但这仍然使我们承担手动维护多个项目的一致性的负担,例如将文件new.cs 添加到“主”项目,您现在必须记住将指向new.cs 的链接添加到其他“链接”项目中。如果您拥有具有特定项目属性的资源(去过那里!),那就更糟了。复制整个项目(甚至链接)只是为了指定一个构建标志而过度杀伤力!
【解决方案2】:

您是否有可能彻底扭转局面?

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

微软有 ILMerge,而 ILRepack 是一个开源替代品,

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

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

然后你就摆脱了太难管理的条件编译,把复杂性转移到你的打包脚本中,可以轻松管理并签入到源代码管理中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多