0

我们如何在多次执行后从应用程序中删除一段代码?让我举个例子,现在,我有这个应用程序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

当前发生的情况是,在每次启动应用程序时,它都在执行 region 内的代码onlyUsefulForFirstTime,尽管它仅对第一次运行有用。如果客户一天要运行这个应用程序 10 次,那么继续让这个代码执行将是一种完全的浪费。我知道,如果它第一次运行,我需要检查某个地方,以便添加值,但在那之后它只是浪费。那么,有什么办法可以删除这段代码,而不是完全删除,而是让代码onlyUsefulForFirstTime不再执行,或者类似的东西,好吧!你明白了!

ps:我不是在问其他备份方法或其他备份策略,我知道还有其他方法,但这不是问题!

4

3 回答 3

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 格式以避免歧义。

于 2012-07-15T00:54:18.897 回答
4

在 Windows 注册表中添加一个键,表示代码已经运行。在您的应用程序启动时检查此注册表项。

或者,您可以使用应用程序设置

if (Properties.Settings.Default.alreadyExecuted == false)
{
     // run one-time code.

     Properties.Settings.Default.alreadyExecuted = true;
     Properties.Settings.Default.Save();
}
于 2012-07-15T00:54:33.843 回答
-1

除非有问题,否则不要优化。一旦您的分析器显示该功能是一个瓶颈,就开始做一些事情。

于 2012-07-15T01:06:27.963 回答