【问题标题】:Building different versions of an application in .NET在 .NET 中构建不同版本的应用程序
【发布时间】:2015-02-24 10:52:42
【问题描述】:

我有一个混合使用 ASP.NET webforms 和 MVC 5 开发的 Web 应用程序。我需要构建不同版本的应用程序,比如 Basic、Deluxe 和 Premium,每个版本都有不同的功能。 我知道预处理器指令是 C# 为条件构建和创建应用程序的不同版本提供的东西。

在我的情况下,我的类不应该包含方法、命名空间或属性,具体取决于构建的应用程序版本,而且某些 dll 不应该包含在应用程序版本中,同样的理论适用于前面结束代码以及 MVC 代码。

任何关于开发这个的好的方向都将不胜感激。

【问题讨论】:

  • 您确实已经回答了自己的问题 - 只需使用 #define#if#endif 来切换部分代码。但如果这是一个 web 应用程序并且您的客户不会接触到二进制文件,我认为使用运行时评估的if 来更好地实现功能切换。
  • 您将托管应用程序还是您的客户?如果您自己托管它们,那么您可以在 web.config 文件中启用基于功能的 appSettings 值...
  • #if打开/关闭部分代码更好还是在需要时只使用if
  • @RichardEverett,客户将托管应用程序

标签: c# .net preprocessor-directive


【解决方案1】:

根据您的功能,如果您自己托管,您可以简单地拥有一个设置要使用的版本的许可系统。

在您的应用程序中(在您的 ASPX 和 MVC 代码中),您可以检查此许可证(例如使用 <% if ...)以了解是否启用或禁用按钮、表单的一部分、操作等。

您可以将此许可证存储在数据库中,甚至可以按用户存储,或者存储在app.config 设置中。

如果您有一个无法控制的应用程序,您仍然可以使用此许可方法,但您需要对照外部来源对其进行检查。有一些工具可以为您提供许可(以及可选的混淆)。

【讨论】:

  • @Angel:这个答案对你有帮助吗?需要更多帮助?
【解决方案2】:

您可以使用以下方法:

  1. 在不同版本的产品中使用不同的应用程序 API 是不好的。为什么?因为如果您提供相同的 API,您的用户可以轻松升级到 Premium 或 Deluxe 版本而无需重新编译应用程序。您最好使用相同的 API,但对 Deluxe 和 Premium 用户可用的锁定方法。在代码中使用定义来锁定或解锁功能,如下所示:
public bool SomeMethod()
{
  #ifdef BASIC
    raise new Exception("this method is available in Deluxe version only!");
  #endif
  #ifdef DELUXE || PREMIUM
    ; // do some work available for deluxe versions only 
  #endif
}
  1. 为应用程序的每个版本创建 2 个配置,一个基于“调试”,另一个基于产品的“发布”配置,以便您可以在发布和调试模式下测试不同的版本。所以你可能会有这样的事情:
Debug
Release
Debug BASIC
Release BASIC
Debug DELUXE
Release DELUXE
Debug PREMIUM
Release PREMIUM

这也将导致不同版本的输出文件夹(您可以在配置的属性中调整它们)。

  1. 修改“构建后事件”命令行代码(在项目 - 属性 - 构建事件中)以从输出文件夹中删除不必要的 dll 文件,如下所示:
del PremiumDll.dll 

【讨论】:

    【解决方案3】:

    使用#if#endif 部分维护应用程序的3 个不同版本将非常困难。我个人会不惜一切代价避免这种情况,而是使用传统的运行时方法来控制 3 个版本之间的差异。

    如果 100% 有必要只将代码发送给获得许可的用户,那么您应该将该代码放在单独的程序集中,可能使用某种插件架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2019-05-19
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      相关资源
      最近更新 更多