如何在执行多次后从应用程序中删除一段代码?让我举个例子,现在,我有这个应用程序SomeSoftware
,它每个月左右备份一次数据。它的作用是,在客户端机器上安装时(在部署时),它在数据库中创建一个关于安装日期的条目,然后在每次运行时检查类似
var con = InitializeDB.StartConnection(); // start the connection
var cmd = con.CreateCommand();
var cmdOther = con.CreateCommand();
// check if its the first run of the software
#region onlyUsefulForFirstTime
cmd.CommandText = "SELECT Count(*) FROM Misc WHERE ItemName='FirstRun'"
if (Int32.Parse(cmd.ExecuteScalar().ToString()) == 0)
// it is the first run, add the entry
cmd.CommandText = "INSERT INTO Misc(ItemName, Val) VALUES('FirstRun'," + DateTime.Now + ")";
else
#endregion
// it is not the first run
cmd.CommandText = "SELECT Val FROM Misc WHERE ItemName='LastRun'";
cmdOther.CommandText = "SELECT Val FROM Misc WHERE ItemName='FirstRun'";
// now after this, we compare the value of LastRun and the date in FirstRun, if it's more than a month, we take the steps to backup the database
目前正在发生的事情是,每次启动应用程序时,它都会执行区域onlyUsefulForFirstTime
内的代码,尽管它仅对首次运行有用。如果客户端在一天内运行此应用程序10次,那么让这些代码执行将是完全浪费。我知道,我需要在某处检查它是否第一次运行,所以要添加值,但在此之后它只是浪费。那么,有什么方法可以删除这些代码,而不是完全删除,但是让onlyUsefulForFirstTime
中的代码不再执行,或类似的东西,好吧!你明白了!
ps:我不是在询问其他备份方法或其他备份策略,我知道还有其他方法,但这不是问题!
答案 0 :(得分:4)
如果你修改程序集的CIL并重新保存它在技术上是可行的,但它比它的价值更麻烦。为什么不能只使用本地可写INI文件甚至Windows注册表来存储“最后运行”值,以便有条件地分支?
请注意,更改可执行文件将破坏程序集上的任何强名称,当然还有Authenticode。
此外,由于DEP / NX阻止了可写内存页面的执行,因此无法在内存中执行此操作。
编辑:
顺便说一下,你的代码中有一个错误。
System.DateTime
隐式ToString()
使用CultureInfo.CurrentCulture
来提供格式信息。在美国,它将在6月7日输出“06/07/2012”,但如果您在欧洲运行该程序,它将在同一日期输出“07/06/2012”。您的SQL Server可能会以某种格式预期日期,并且突然您的日期非常不准确。我强烈建议您将DateTime值转换为ISO-8601格式以避免歧义。
答案 1 :(得分:4)
Add a key to the Windows registry,表示代码已经运行。在启动应用程序时检查此注册表项。
或者,您可以使用application setting:
if (Properties.Settings.Default.alreadyExecuted == false)
{
// run one-time code.
Properties.Settings.Default.alreadyExecuted = true;
Properties.Settings.Default.Save();
}
答案 2 :(得分:-1)
除非出现问题,否则不要optimize。在您的分析器显示该功能是瓶颈之前,请开始对其进行一些操作。