32

ある条件で自分自身を削除できるアプリケーションを C# で作成することは可能ですか。

アプリケーションのアップデーターを作成する必要がありますが、更新プロセス後に実行可能ファイルを残したくありません。

公式の .Net OneClick がありますが、HTTP サーバーとの互換性がなく、OneClick 自体に問題があるため、自分で作成する必要があります。

ジョージ。

[編集] 詳細:

アップデーターをダウンロードするアプリケーション実行可能ファイル (「パッチ」ですが、正確ではありません) この「パッチ」は、アプリケーション実行可能ファイル自体を更新します。

アプリケーションは次のように実行されます。

Application: Start -> Check Version -> Download new Updater -> Start Updater -> exit;
Updater: Start -> do it's work -> start Application Executable -> self delete (this is where I get stuck);
4

7 に答える 7

35

Process.Start を使用する場合は、Delパラメーターと、削除するアプリケーションへのパスを渡すことができます。

ProcessStartInfo Info=new ProcessStartInfo();
Info.Arguments="/C choice /C Y /N /D Y /T 3 & Del "+
               Application.ExecutablePath;
Info.WindowStyle=ProcessWindowStyle.Hidden;
Info.CreateNoWindow=true;
Info.FileName="cmd.exe";
Process.Start(Info); 

この記事のコード スニペット

于 2009-08-20T11:17:24.293 に答える
9

バッチファイルをブートストラップとして使用し、その後それ自体とexeを削除することをお勧めします

public static class Updater
{
    public static void Main() 
    {   
        string path = @"updater.bat";

        if (!File.Exists(path)) 
        {
            // Create a file to write to.
            using (StreamWriter sw = File.CreateText(path)) 
            {
                sw.WriteLine("updater.exe");
                sw.WriteLine("delete updater.exe /y");
                sw.WriteLine("delete updater.bat /y");
            } 

            System.Process.Start(path);   
        }
        else
        {
            RunUpdateProcess();
        }
    }

    private void RunUpdateProcess()
    {
        .....
    }
}
于 2009-08-20T18:04:05.657 に答える
5

さらに別のプロセスを導入しないと注意が必要です (そのプロセスも削除する必要があることは間違いありません)。あなたの場合、すでに updater.exe と application.exe の 2 つのプロセスがあります。そこから生成されたときに、おそらくアプリケーションで updater.exe を削除するだけです。単純なコマンドライン引数を使用するか、updater.exe から application.exe への IPC 呼び出しを使用してトリガーすることができます。それはまさに自己削除EXEではありませんが、私が思う要件を満たしています。

完全な処理とその他のオプションについては、自己削除 EXE の決定的な処理を読む必要があります。コード サンプルは C (または ASM) ですが、p/invokable である必要があります。

私はおそらく(疑似コード)のようなもので updater.exe でCreateFileを試してみます:FILE_FLAG_DELETE_ON_CLOSE

 var h = CreateFile(
            "updater.exe", 
            GENERIC_READ | GENERIC_WRITE, 
            FILE_SHARE_DELETE, 
            NULL, 
            CREATE_NEW, 
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE
         );

 byte[] updaterBytes = GetUpdaterBytesFromWeb();
 File.WriteAllBytes("updater.exe", updaterBytes);

 Process.Start("updater.exe");

application.exe が終了すると、updater.exe のファイル ハンドルは 1 になります。updater.exe が終了すると、ファイル ハンドルは 0 になり、削除する必要があります。

于 2009-08-20T11:56:44.887 に答える
3

アプリケーション内からアップデーターを削除するだけではいけませんか?すなわち:

アプリケーション:開始->[古いアップデーターが存在する場合は削除]->バージョンの確認->新しいアップデーターのダウンロード->アップデーターの開始->終了;

アップデータ:開始->更新の実行->アプリケーションの開始->終了;

アプリケーション:開始->[古いアップデーターが存在する場合は削除]->..。

于 2009-08-20T11:32:06.417 に答える
0

あなたの2行目は

Updater: Star -> do it's work -> start Application Executable -> Updater Exits -> Application deletes your Updater.exe
于 2009-08-20T11:29:53.223 に答える