4

次のようなサービスをアンインストールしています。

using (AssemblyInstaller installer = new AssemblyInstaller(serviceFileName, new String[] { }))
{
    installer.UseNewContext = true;
    installer.Uninstall(null);
}

これは正常に動作しますが、Directory.Delete を実行しようとすると、サービスの実行可能ファイルへのアクセスが拒否されたことを示す例外がスローされます。しかし、その直後に、Windows エクスプローラーでファイルを手動で削除できます。

私のアプリケーションは、管理者アクセスを要求するインストーラーによって実行されているため、ファイルに対する権限があると想定しています。実際、そのディレクトリ内の他のすべてのファイルを削除しますが、そのファイルを取得することはできません。私もチェックしましたが、ファイルは読み取り専用ではありません。

このファイルを削除できない理由はありますか?

4

1 に答える 1

5

開いたままのファイルへのハンドルがあることがわかりました。解決策は、インストーラーが実行される新しい AppDomain を作成し、削除を試みる前にそれを閉じることでした。

var domain = AppDomain.CreateDomain("MyDomain");

using (AssemblyInstaller installer = domain.CreateInstance(typeof(AssemblyInstaller).Assembly.FullName, typeof(AssemblyInstaller).FullName, false, BindingFlags.Public | BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.ExactBinding, null, new Object[] { serviceFileName, new String[] { } }, null, null, null).Unwrap() as AssemblyInstaller)
{
    installer.UseNewContext = true;
    installer.Uninstall(null);
}

AppDomain.Unload(domain);
于 2010-09-22T18:55:16.370 に答える