1

私のアプリケーションにはアンインストーラーが付属しています。すべてが完了したときにuninstaller.exeファイルを削除する方法が見つからないことを除いて、すべてが正常に機能しています。

現在のアセンブリexeを一時ディレクトリにコピーしようとしましたが、元のファイルのファイルハンドルがロックされたままです。

何か案は?

4

4 に答える 4

7

これを行うには、PInvokeを実行する必要があります。MoveFileExには、次回の再起動時にファイルの削除をスケジュールする機能があります。

dwFlagsがMOVEFILE_DELAY_UNTIL_REBOOTを指定し、lpNewFileNameがNULLの場合、MoveFileExは、システムの再起動時に削除されるlpExistingFileNameファイルを登録します。

何かのようなもの:

[return: MarshalAs (UnmanagedType.Bool)]
[DllImport ("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool MoveFileEx (string lpExistingFileName, string lpNewFileName, int dwFlags);

public static bool ScheduleDelete (string fileFullName) {
    if (!File.Exists (fileFullName))
        throw new InvalidOperationException ("File does not exist.");

    return MoveFileEx (fileFullName, null, 0x04); //MOVEFILE_DELAY_UNTIL_REBOOT = 0x04
}
于 2009-07-01T12:30:49.540 に答える
1

アンインストーラー.exeを正確にコピーし、実行をその特定の実行可能ファイルに変更する方法のコードを投稿すると、興味深いでしょう。アプリケーションドメインをアンロードすると、ファイルハンドルが解放される
と思います。

于 2009-07-01T12:26:53.590 に答える
1

アセンブリのシャドウコピーを使用することで、目的を達成できる可能性がありますが、このシナリオでは試していません。

于 2009-07-01T13:10:33.687 に答える
0

「cmd」は遅延して使用できます。

    internal static void ExitAndDelete()
    {
        var f = Application.ExecutablePath;
        Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
    }
于 2016-08-13T16:32:52.270 に答える