web-dev-qa-db-ja.com

1つの実行可能ファイル内のC#の自己削除可能なアプリケーション

ある条件で自分自身を削除できるアプリケーションを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);
29
George

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); 

この記事 から抜粋したコードスニペット

34
James

bootstrapとしてバッチファイルを使用し、後で自分自身と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()
    {
        .....
    }
}
9
Emre Aydinceren

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

完全な処理およびその他のオプションについては、 自己削除EXEの最終的な処理 をお読みください。コードサンプルはC(またはASM)にありますが、p/invokableである必要があります。

たぶん CreateFile with FILE_FLAG_DELETE_ON_CLOSE for updater.exe(psuedo code)のようなもの:

 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になり、削除する必要があります。

5
Mark Brackett

アプリケーション内から単純にアップデーターを削除できませんでしたか?例:

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

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

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

3
Eamon Nerbonne

うーん、これをまっすぐにしましょう。 application.exeとアップデータアプリケーションupdater.exeがいくつかありますか?

したがって、application.exeを起動すると、一部のWebサーバーで新しいバージョンがチェックされ、updater.exeが起動されます。そして、あなたはupdater.exeがそれが更新を終えた後にそれ自身を削除したいですか?または、ダウンロードしたパッチ(または類似のもの)を削除しますか?もう少し正確にしてください。

Updater.exeを削除する場合は、次の更新プロセスのために再作成する必要があることを考慮してください。

0
chrischu

あなたの二行目は

Updater: Star -> do it's work -> start Application Executable -> Updater Exits -> Application deletes your Updater.exe
0
anonymous