2014-01-05 58 views
0

我有以下安裝WINSERVICE(簡化)代碼:ManagedInstallerClass.InstallHelper被鎖定WINSERVICE exe文件

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

我注意到,在我的安裝嚮導調用它時,一個WINSERVICE的EXE文件被鎖定,直到整個安裝嚮導沒有完成。有沒有辦法如何避免這種鎖?如何在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; 
     } 
    }