Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在我的C代码中生成编译日期来确定演示版本的到期日期吗?_C# - Fatal编程技术网

C# 我可以在我的C代码中生成编译日期来确定演示版本的到期日期吗?

C# 我可以在我的C代码中生成编译日期来确定演示版本的到期日期吗?,c#,C#,我正在创建一个C#程序的演示版本,我希望它在一个月后过期 // DEMO - Check date DateTime expires = new DateTime(2016, 3, 16); expires.AddMonths(2); var diff = expires.Subtract(DateTime.Now); if (diff.Days < 0) { Messa

我正在创建一个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;
        }
//演示-检查日期
DateTime expires=新的日期时间(2016,3,16);
有效期:1个月(2);
var diff=expires.Subtract(DateTime.Now);
如果(差异天数<0)
{
MessageBox.Show(“演示已过期”);
返回;
}
我想要编译的日期,而不是硬编码的新日期时间(2016,3,16)
是否有编译器指令给我当前日期?或者我是不是用了错误的方法?

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

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


看来你最好的选择应该是创造某种独特的钥匙,将其存储在应用程序中,并通过连接到您开发的某些授权服务的线路检查整个密钥是否仍然有效。

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

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

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


如果此程序将在用户机器上运行,则此技术无效。用户只需更改其操作系统的日期(这会影响
DateTime.Now
)即可诱使程序认为它尚未过期。@Bob这是一个很好的答案。目前我正在使用[assembly:AssemblyVersion(“1.0.10.*”)],但我可以将其更改为“1.1.*”,并且该方法可以工作。我会在构建过程中将日期作为字符串插入适当的文件中。在构建时选择一个已知的文件,然后用日期替换一个特定的标记,这是一个相对简单的过程。是的,我知道这远不是防弹的。我只是让诚实的人保持诚实
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}");

    }
}