我一直在努力讓Windows服務在有新版本時自動重啓應用程序。我的代碼在下面,它實際上工作。我的問題是這樣的:在這裏有一個很大的禁忌?我是在單獨的線程上創建應用程序域的新手,我想知道是否有更好的方法來實現這一點。我也擔心可能我有一個很大的盲點,關於我如何處理這個問題。任何建議表示讚賞。不同線程上的應用程序域自我更新應用程序
有兩個通用部分:運行的Windows服務,以不同的進程啓動我的應用程序,然後輪詢以檢測該應用程序的新版本何時可用。第二部分是開始,更新,重新啓動的實際應用程序。
首先,當服務啓動時,它調用LoadApp(),以便該應用程序開始運行。
private void LoadApp()
{
// ** appDomainSetup here **
this._appDomain = AppDomain.CreateDomain("MyUpdatedApp", AppDomain.CurrentDomain.Evidence, appDomainSetup);
this._tokenSource = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
try
{
this._appDomain.ExecuteAssembly(assembly);
}
catch (AppDomainUnloadedException ex)
{
Debug.WriteLine(ex.ToString());
}
}, _tokenSource.Token);
}
然後,每10秒,定時器調用此方法:
private void Process(object stateInfo)
{
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Check for new binaries. If new, copy the files and restart the app domain.
if (!NewAppVersionReady()) { return; }
DeleteFiles();
CopyFiles();
RestartAppDomain();
}
finally
{
Monitor.Exit(_locker);
}
}
RestartAppDomain()看起來像這樣。請注意,我在此方法的第二行中卸載應用程序域時遇到異常。 (我避開,通過捕捉異常,基本上忽略它。)
private void RestartAppDomain()
{
this._tokenSource.Cancel();
AppDomain.Unload(this._appDomain);
LoadApp();
}
編輯:因爲我已經發現該AppDomain.Unload()線是不必要的。如果沒有它,服務仍然使用新版本更新應用程序,然後啓動新版本的應用程序。我最擔心的是在令牌源上調用Cancel()。我希望應用能夠優雅地關閉,而不是強制關閉。
很高興聽到你有它的工作!我正在做一些非常相似的事情,所以我會對看到更多的代碼/僞代碼進行比較感興趣,也許我們可以相互學習一些東西。我的主要目標是在數據庫中安裝程序集,但是我設法實現了一些簡潔的方面,比如避免需要共同的依賴關係(您的IStartStop接口,一個額外的dll)。 – Thracx 2013-06-28 20:54:05