После удаления сервиса с помощью AssemblyInstaller я не могу удалить файл .exe - PullRequest
0 голосов
/ 24 февраля 2020

Я использовал AssemblyInstaller в своем коде для удаления службы, после чего я попытался удалить файл .exe.

Но произошла ошибка, говорящая:

Файл используется другой процесс.

Я пытался assemblyInstaller.dispose(), но он не работает.

using (AssemblyInstaller installer = new AssemblyInstaller(filepath, commandLineOptions))
{
     installer.UseNewContext = true;
     installer.Uninstall(null);
     installer.Dispose();
}

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

После помощи других я обнаружил, что использование AssemblyInstaller вызывает проблемы. Для удаления службы мы можем использовать другие методы, такие как InstallUtil.exe или ServiceInstaller. Мы можем использовать ServiceInstaller вместо AssemblyInstaller для удаления, что не вызовет этой проблемы.

 ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
 InstallContext Context = new InstallContext(AppDomain.CurrentDomain.BaseDirectory + "\\uninstalllog.log", null);
 ServiceInstallerObj.Context = Context;
 ServiceInstallerObj.ServiceName = "myService";
 ServiceInstallerObj.Uninstall(null);

это удалит имя, указанное службой, а файл .exe может быть удален без проблем

EDIT

Я обнаружил, что с помощью 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[] { servicePath, new String[] { } }, null, null, null).Unwrap() as AssemblyInstaller)
            {
                installer.UseNewContext = true;
                installer.Uninstall(null);
            }
            AppDomain.Unload(domain);
0 голосов
/ 24 февраля 2020

Используйте Resource Monitor для поиска файловых дескрипторов, открытых процессами. Найдя процесс, вы можете прекратить его, чтобы освободить дескриптор файла, что позволит вам удалить его.

enter image description here

...