2014-06-10 52 views
0

目前,我有一個運行過許多.dll文件的且具有模塊/它導入啓動插件C#的服務。我想創建一個基本上停止服務的更新系統,刪除任何要刪除的文件(舊版本),從服務器下載新版本並啓動服務。我相信除了刪除部分之外,我已經編寫了這個權限,因爲只要我不覆蓋任何內容,該文件就會下載。如果我嘗試覆蓋某些內容,它將無法正常工作,這就是爲什麼我想要先刪除它。但是,當我將File.Delete()設置爲我想要執行的路徑時,它會給我 access to the path is denied。這裏是我的代碼:MEF C#服務 - DLL更新

new Thread(new ThreadStart(() => 
      { 
       ServiceController controller = new ServiceController("client"); 
       controller.Stop(); 
       controller.WaitForStatus(ServiceControllerStatus.Stopped); 
       try 
       { 
        if (um.FilesUpdated != null) 
        { 
         foreach (FilesUpdated file in um.FilesUpdated) 
         { 
          if (file.OldFile != null) 
          { 
           File.Delete(Path.Combine(Utility.AssemblyDirectory, file.OldFile)); 
          } 
          if (file.NewFile != null) 
          { 
           wc.DownloadFile(cs.UpdateUrl + "/updates/client/" + file.NewFile, Path.Combine(Utility.AssemblyDirectory, file.NewFile)); 
          } 
         } 
        } 


        if (um.ModulesUpdated != null) 
        { 
         foreach (ModulesUpdated module in um.ModulesUpdated) 
         { 
          if (module.OldModule != null) 
          { 
           File.Delete(Path.Combine(cs.ModulePath, module.OldModule)); 
          } 
          if (module.NewModule != null) 
          { 
           wc.DownloadFile(cs.UpdateUrl + "/updates/client/modules/" + module.NewModule, Path.Combine(cs.ModulePath, module.NewModule)); 
          } 
         } 
        } 


       } 
       catch (Exception ex) 
       { 
        Logger.log(ex); 
       } 


       controller.Start(); 

      })).Start(); 

我相信這是因爲文件正在使用,但我似乎無法卸載它們。我雖然停止服務將工作,但顯然不是。我也檢查過這些文件,它們不是隻讀的(但文件夾位於Program Files中,但似乎無法通過程序或手動方式使其不可讀)。該服務也以管理員身份運行(NT AUTHORITY \ SYSTEM)。我已閱讀卸載AppDomain,但AppDomain.Unload(AppDomain.CurrentDomain);也返回了一個異常。

不太清楚,即使這是MEF或我的程序只是不具有正確的權限問題...我認爲這主要是因爲該文件正在使用中。

+0

是您嘗試更新的同一服務的代碼部分還是不同的可執行文件? – Gusman

+0

它是在服務器向客戶端發送「更新」消息時調用的函數下的相同代碼的一部分。 – connerb

+0

我也試過在新的後臺線程中創建並運行updater.exe,但是當我停止服務時,它也停止了。 – connerb

回答

0

你將永遠無法從已經運行的進程更新程序,每個DLL你沒有使用將被鎖定。

正如你所說,你可以在無所事事之前創建一個新的應用程序域,在該域​​內執行你的真實代碼,當需要完成更新時,你可以卸載它,但即使如此,你將無法更新該服務的可執行文件。

做到這一點的方法是使用一個單獨的應用程序或服務。

如果您使用的應用程序更新,那麼就一定不能從服務啓動,桌面創建甚至在一個服務運行,所以你的更新可能會失敗。讓會話啓動時讓您的更新程序運行,並讓它成爲查詢服務器更新的程序。

否則,如果你願意從其他服務更新那麼你的主要服務可以開始更新服務和更新可以停止主服務。使用服務的優點是即使沒有桌面,也可以運行服務器機器的情況下,每個示例的服務器機器非常常見,甚至在沒有用戶會話的情況下運行數月,因此使用桌面應用進行更新將不會有效。