2010-09-15 3 views
4

я удалить услугу, как это:Невозможно удалить исполняемый файл службы после удаления его

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

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

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

Любые идеи, почему я не могу удалить этот файл?

ответ

3

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