Не удается удалить исполняемый файл службы после его удаления

Я удаляю такой сервис:

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

который работает нормально, но затем я пытаюсь сделать Directory.Delete, и он выдает исключение, говорящее, что доступ к исполняемому файлу службы был запрещен. Тем не менее, сразу после этого я могу удалить файл вручную в проводнике Windows.

Мое приложение запускается установщиком, который запрашивает доступ администратора, поэтому я предполагаю, что у него есть права на файл. Фактически, он удаляет все остальные файлы в этом каталоге, но не может получить этот. Я также проверил, и файл не только для чтения.

Есть идеи, почему я не могу удалить этот файл?

1 ответ

Решение

Оказывается, есть дескриптор этого файла, который остается открытым. Решением было создать новый домен 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);
Другие вопросы по тегам