经过多次执行后删除一段代码?

时间:2012-07-15 00:52:43

标签: c# .net jit

如何在执行多次后从应用程序中删除一段代码?让我举个例子,现在,我有这个应用程序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:我不是在询问其他备份方法或其他备份策略,我知道还有其他方法,但这不是问题!

3 个答案:

答案 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。在您的分析器显示该功能是瓶颈之前,请开始对其进行一些操作。