私のアプリケーションにはアンインストーラーが付属しています。すべてが完了したときにuninstaller.exeファイルを削除する方法が見つからないことを除いて、すべてが正常に機能しています。
現在のアセンブリexeを一時ディレクトリにコピーしようとしましたが、元のファイルのファイルハンドルがロックされたままです。
何か案は?
私のアプリケーションにはアンインストーラーが付属しています。すべてが完了したときにuninstaller.exeファイルを削除する方法が見つからないことを除いて、すべてが正常に機能しています。
現在のアセンブリexeを一時ディレクトリにコピーしようとしましたが、元のファイルのファイルハンドルがロックされたままです。
何か案は?
これを行うには、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
}
アンインストーラー.exeを正確にコピーし、実行をその特定の実行可能ファイルに変更する方法のコードを投稿すると、興味深いでしょう。アプリケーションドメインをアンロードすると、ファイルハンドルが解放される
と思います。
アセンブリのシャドウコピーを使用することで、目的を達成できる可能性がありますが、このシナリオでは試していません。
「cmd」は遅延して使用できます。
internal static void ExitAndDelete()
{
var f = Application.ExecutablePath;
Process.Start(new ProcessStartInfo("CMD.exe", "/C timeout 2&del \"" + f + "\"") { WindowStyle = ProcessWindowStyle.Hidden });
}