2014-01-05 3 views
0

Я следующий (упрощенный) код для установки WinService:ManagedInstallerClass.InstallHelper является замок WinService ехе

public static bool InstallService(string fullFileName) 
    { 
     try 
     { 
      ManagedInstallerClass.InstallHelper(new[] { fullFileName }); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 

я заметил, что при вызове его в моем мастере установки EXE файл из WinService не блокируется до всей установки мастер не завершен. Есть ли способ избежать этой блокировки? Как «освободить ресурсы» сразу после установки InstallService? Я нашел аналогичную проблему here. GC.Collect() мне не помог.

Я попытался вызвать метод в отдельном потоке, но безуспешно.

+0

Это нормально, сборки, загруженные Assembly.LoadFrom() остаются загруженными и сохраняют блокировку файла до тех пор, пока AppDomain не будет выгружен. Вам нужно будет запустить этот код в новом AppDomain и выгрузить его самостоятельно, чтобы этого не произошло. –

ответ

0

Основываясь на некоторых исследованиях, я нашел решение, которое не блокирует выполнение исполняемого файла.

public static bool InstallService(string fullFileName) 
    { 
     try 
     { 
      using (var ai = new AssemblyInstaller(fullFileName, null)) 
      { 
       ai.Install(null); 
       ai.Commit(null); 
       return true; 
      } 
     } 
     catch (Exception ex) 
     { 
      return false; 
     } 
    } 
Смежные вопросы