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初めて実行する場合にのみ役立ちます。クライアントがこのアプリケーションを 1 日に 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 に答える