目前,我有一個運行過許多.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或我的程序只是不具有正確的權限問題...我認爲這主要是因爲該文件正在使用中。
是您嘗試更新的同一服務的代碼部分還是不同的可執行文件? – Gusman
它是在服務器向客戶端發送「更新」消息時調用的函數下的相同代碼的一部分。 – connerb
我也試過在新的後臺線程中創建並運行updater.exe,但是當我停止服務時,它也停止了。 – connerb