【问题标题】:Can I generate the compile date in my C# code to determine the expiry for a demo version?我可以在我的 C# 代码中生成编译日期以确定演示版本的到期时间吗?
【发布时间】:2016-03-16 11:47:19
【问题描述】:

我正在创建一个 C# 程序的演示版本,我希望它在一个月后过期。

        // DEMO - Check date
        DateTime expires = new DateTime(2016, 3, 16);
        expires.AddMonths(2);
        var diff = expires.Subtract(DateTime.Now);
        if (diff.Days < 0)
        {
            MessageBox.Show("Demonstration expired.");
            return;
        }

我想要编译的日期而不是硬编码的new DateTime(2016, 3, 16); 是否有编译器指令给我当前日期?还是我以错误的方式接近这个?

【问题讨论】:

  • Compile date and time的可能重复
  • 如果这个程序将在用户的机器上运行,这个技术是无效的。用户可以简单地更改其操作系统的日期(这会影响DateTime.Now)来欺骗您的程序认为它还没有过期。
  • @Bob 这是一个很好的答案。目前我正在使用 [assembly: AssemblyVersion("1.0.10.*")] 但我可以将其更改为 "1.1.*" 并且该方法可以工作。
  • 我会在构建过程中将日期作为字符串插入到适当的文件中。在构建时选择一个已知文件,然后用日期替换特定标记是一个相对简单的过程。

标签: c#


【解决方案1】:

但是在编译时使用预处理器指令。

应该使用可执行代码来实现过期。这里的问题是您可以对其进行硬编码并尽可能隐藏它,但是狂热的开发人员可以找到它并替换中间语言并生成一个新的程序集而不会过期。实际上,还有很多其他情况,用户可以绕过整个过期时间......

似乎您最好的选择应该是创建某种唯一密钥,将其存储在您的应用程序中,并检查整个密钥是否仍然有效,通过连接到您开发的某些许可服务的线路。

【讨论】:

  • 是的,我知道它远非防弹。我只是让诚实的人诚实
【解决方案2】:

硬编码日期的另一种解决方案也提供了一些灵活性和可扩展性,可能是在网络服务器上托管许可证文件。对于我的示例,我使用了 github。为应用程序创建一个众所周知的文件(可能一个用于演示,一个用于 beta1 等)。在启动时,可能会定期读取文件并解析它以确定适用性、超时、禁用/启用功能(如激活自定义警告消息)等。

现在您可以发布您的演示,将过期日期放入文件中,根据需要进行更改等。这不是最优雅和最安全的解决方案,但对于演示/测试版的许多用例来说,这可能就足够了达到预期目的。

下面是它的外观的工作模型(为简洁起见,省略了错误检查和适当的清理):

public class LicenseInfo
{
    public string Info1 { get; private set; }

    public bool IsValid
    {
        get
        {
            // todo, add logic here
            return true;
        }
    }

    public bool ParseLicense(string data)
    {
        bool ret = false;

        if (data != null)
        {
            // todo, parse data and set status/attributes/etc
            Info1 = data;
            ret = true;
        }

        return ret;
    }
}

// could make a static class...
public class License
{
    public LicenseInfo GetLicenseInfo()
    {
        var license = new LicenseInfo();

        // todo: create whatever schema you want.
        // filename hard-coded per app/version/etc.
        // file could contain text/json/etc.
        // easy to manage, update, etc.
        // extensible.
        var uri = "https://raw.githubusercontent.com/korygill/Demo-License/master/StackOverflow-Demo-License.txt";

        var request = (HttpWebRequest)HttpWebRequest.Create(uri);
        var response = request.GetResponse();
        var data = new StreamReader(response.GetResponseStream()).ReadToEnd();

        license.ParseLicense(data);

        return license;
    }
}

class Program
{
    static void Main(string[] args)
    {
        // check if our license if valid
        var license = new License();
        var licenseInfo = license.GetLicenseInfo(); 

        if (!licenseInfo.IsValid)
        {
            Console.WriteLine("Sorry...license expired.");
            Environment.Exit(1);
        }

        Console.WriteLine("You have a valid license.");
        Console.WriteLine($"{licenseInfo.Info1}");

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2013-05-06
    • 2018-08-10
    • 1970-01-01
    • 2020-06-01
    • 2016-10-23
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多