【问题标题】:How to replace Preprocessor directives with C# code,Alternative for preprocessor directives如何用 C# 代码替换预处理器指令,预处理器指令的替代方法
【发布时间】:2021-11-21 20:40:19
【问题描述】:

我们使用的是 trail 和 license 等预处理器指令,因此我们有两个用于 trail 和 license 的安装程序。当用户想要从试用升级到许可时,他们必须卸载试用并安装许可,反之亦然。现在我们只想拥有一个安装程序,这意味着我们希望摆脱重新安装应用程序以获取许可的过程,并且只有一个为 Trail 和许可用户提供服务的安装程序。所以我的问题是基于一些许可文件,即 DAT文件,我们应该如何使用 C# 代码更改预处理代码 用户升级或降级许可证后更改代码的替代方法是什么。如果许可证有任何变化,那么我们需要再次使用 Main 方法并重新加载会话和所有异常处理程序、引擎并打开相应的模式。请建议如何为此类挑战编写代码。

 class Program
    {
        static void Main(string[] args)
        {
#if Trail
        SomeStaticClass.PropertyId = "10023";
        //trail based code
#elif LICENSED
            SomeStaticClass.PropertyId = "10024";
            //licensed code
#endif

            //register some events based on trail and Licensed
            //create session based on trail and Licensed
            //license check is happening after all the sessions and environments are created 

        }
    }

    public static class SomeStaticClass
    {
        public static string PropertyId { get; set; }
    }

【问题讨论】:

  • 改用if

标签: c# polymorphism preprocessor precompiler


【解决方案1】:

如果下载您的试用版为人们提供了许可版本的所有编译代码,那么有些人可能会尝试弄清楚您的许可测试是如何实施的并破坏它。

我会改为重构您的应用程序以创建相同接口的试用和许可实现。从试用工厂类或许可工厂创建。所有许可类都在一个单独的程序集中,您的试用版不附带该程序集。

然后您的 main 方法可以找到许可程序集,加载它,并通过反射发现工厂类。

如果您真的只想发送一个安装程序,我会发送加密的许可程序集。然后您的注册过程可以传输和存储加密密钥,因此您的主要方法可以将程序集解密到内存中并加载它。如果没有加密密钥,该程序集将完全无用。

【讨论】:

  • 嗨@jeremy,感谢您的回复。我们的客户只希望一名安装人员同时使用试用版和许可版。我们无法访问许可证的工作方式,即来自 API 服务。目前我们正在考虑使用事件处理程序来实现它或为跟踪和许可实现多态性。但是有很多代码要加载,这些代码有这些预处理器#if 块,而这些块又依赖于检查许可证,但是要检查许可证,我们需要先加载那些,所以这很难实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
相关资源
最近更新 更多