C#在编译时将日期放入程序中

我在考虑如何创建一个只在X时间段内有效的程序(在C#应用程序中)。

我在想的是你会将当前日期作为程序中的常量,并检查它是否比X日期早了。 当然,我不想将日期或X外部存储在程序之外,因为它可以被篡改。

我也不想定期手动更改它并重新编译和部署它。 那么有没有办法将变量设置为编译时的当前日期?

我可以有一个批处理文件来编译它并将新的exe部署到分发服务器。

谢谢

预编译指令是您的关键。 您可以在应用程序中创建一个常量,并在编译时设置它。

但是,请确保对代码进行模糊处理。 有人可以轻松拆卸它并篡改常数。 另一个解决方案是让您的软件“手机回家”进行自我注册。 这样,注册信息存储在您的服务器上,而不是他们的机器上。 还有第三方软件包可以执行您所需的相同安全性,但它们很昂贵

查看项目的Properties文件夹中的AssemblyInfo.cs文件:

// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] 

将此更改为:

 [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyFileVersion("1.0.0.0")] 

然后,在程序集的其他地方,使用:

 System.Version MyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; // MyVersion.Build = days after 2000-01-01 // MyVersion.Revision*2 = seconds after 0-hour (NEVER daylight saving time) DateTime MyTime = new DateTime(2000, 1, 1).AddDays(MyVersion.Build).AddSeconds(MyVersion.Revision * 2); return string.Format("Version:{0} Compiled:{1:s}", MyVersion, MyTime); 

我会选择“电话之家” – 变种。 并使这个电话很重要。 ;)我的意思是,你的程序中的一些重要function(可能会进行一些计算?)将在服务器上进行。 因此,如果用户反编译程序并删除“回家”,则会使程序无效。

我知道并非所有程序都有那些使这成为可能的程序,但总的来说比你想的要多。

从您的自动构建过程中(您确实使用自动构建过程,对吗?),有一个简单的应用程序生成一行C#类

  public struct TimeLimit { public DateTime Date = new DateTime(2009,1,1); } 

自动更改日期,然后编译。

然后在您的应用中引用TimeLimit.Date。

我知道这是一个3岁的问题,但只是加上我的2美分。 我们使用James Curran建议的结构中硬编码的“DateLimit”。

但我们也使用相同的“日期”作为“crypt”和“Decrypt”(更多代码和解码)所有字符串,标签和消息的简单密钥。 如果某些人(我们称之为骗子)想要更改到期日期,他们必须通过整个程序集重新输入所有这些字符串以用于新的到期日期。 它并不完美,但我们的成本现在几乎为零,骗子的成本很高。

我建议您将日期放在一个单独的,强大的命名程序集中 – 然后至少恶意用户会发现难以反汇编,编辑并让您的程序使用它。 有没有办法让两个程序集基于强名称相互validation?

我们将此作为我们其中一个组件的许可控制的第一步。 如果调用程序集具有与许可证控制的指纹相同的指纹,我们假设它在我们自己的软件中使用并且许可被绕过。 如果主叫程序集具有不同的指纹或根本没有打印,则执行正常的许可证检查。 当我想到它时,我们的用户可能会在没有强大命名和绕过许可的情况下进行反汇编,编译。 但话说回来,我们所有的程序集都是以x86发布的,而不是CIL – 会改变什么吗?

我们的经验是,如果你与企业客户打交道,没有人可以忍受篡改你的东西的麻烦,特别是因为有被抓的风险。 有点长远,我们当前的许可解决方案已经过时了(该软件包包含VC5的示例!)但到目前为止已经是一个足够高的障碍。 另一方面,对于消费者,我可以想象这是一个更大的威胁。

我最初的建议似乎产生了更多可以回答的问题 – 毕竟可能没那么有用。 🙂

.Net的问题在于它很容易反编译并且改变你想要使用的日期是恒定的。 您可能需要考虑其他事情。

您可以在注册表中编写它,然后人们将编辑此值。

它们不是一个完美的解决方案,但拥有一个可以通过外部(Web)服务器validation的帐户是个好主意。