2011-08-15 63 views
3

在寫這個問題時:AppDomain, handling the exceptions我也想到了一個不同的問題。AppDomain,運行程序集.exe或.dll?

如果你想寫一個像我上面寫的插件應用程序。你會去編寫插件作爲可執行文件或庫?

對於通過AppDomain.ExecuteAssembly(String)方法運行的動態加載的可執行文件,您將擁有多少控制權?而不是使用AppDomain.CreateInstanceAndUnwrap(String, String)創建對象的實例。

我現在有一個接口,其特點是在CreateInstanceAndUnwrap之後調用的啓動/運行+停止+初始化方法。你對執行的程序集版本有相同的控制類型嗎?如果我使用後者,我如何實現這種功能來動態地停止該插件?

或者我在完全錯誤的方向思考?

[編輯後的問題]

Basicly我們得到了 '一個' 應用程序,以及多種功能。

  • 刻錄(視頻)DVD)
  • 打印照片的
  • 下載從照片/視頻攝像機圖像
  • 一個POS
  • 存儲服務器,充當備份/ configsettings /圖片+視頻 知識庫
  • 在多臺顯示器上顯示上述照片/視頻
  • 等等,但這些是主要的「功能」

計算機可以運行多個任務/插件。例如,我們可以選擇讓一臺電腦處理整個圖像下載/顯示/打印系統。或者有一臺具有多個下載/顯示系統的集中式打印機。

一切都是通信的插座

如果重新啓動,不管什麼原因,它需要一個插件崩潰和郵件要發送到辦公室。如果同一次崩潰在短時間內多次發生,那麼它應該發送某種緊急電子郵件並關閉該插件並通知操作員。

其中一些函數使用第三方非託管代碼,一些使用C++/Native編寫,一些使用C++編寫,其他一些使用C#編寫,所有這些都將在不同項目的相同解決方案中編寫。

edit2 還有這個額外的功能,我們想添加到系統中。只要該插件的更新版本可用,就會自動更新插件。父AppDomain /線程應定期檢查更新,如果發現更新,應該卸載該插件,下載新版本並重新啓動。由於這個特定的原因,我認爲我們需要使用AppDomain的

+0

IIRC .NET EXE文件是一個帶有引導程序(C++)和清單的.NET DLL,它告訴引導程序入口點的位置,其中包括「使用管理員權限運行我」 – Aren

+0

這完全取決於什麼這個'插件'需要做。要多照顧一下我們? –

+0

我在您的請求中添加了額外的信息,@ csharptest.net –

回答

2

我肯定會去使用CreateInstanceAndUnwrap()。你有更多的控制方式,你可以合理地與插件進行通信。當你使用ExecuteAssembly()時,你幾乎可以啓動它,然後讀取返回值(一個int)。

另外,當使用CreateInstanceAndUnwrap()時,如果您有充分的理由這樣做,沒有任何東西阻止您使用exe。

基本上,你有一個工作解決方案,沒有必要改變它(至少不是這個方向)。

+0

我已經添加了額外的信息。目前它確實是一個可行的解決方案(我們還沒有編寫關於插件的任何內容,目前處於規劃和設計階段) –

0

您還應該考慮替代設計。基於這樣的信息:

如果我現在有其特點是開始/運行+停止 + Init方法

接口...

一臺計算機可以運行多任務/插件。例如,我們可以選擇 讓一臺電腦處理整個圖像下載/顯示/打印系統。或者有一臺帶有多個 下載/顯示系統的集中式打印機。

...

一切都是通信的插座

通信已經被插座做的,唯一缺少的功能是「管理」:

  1. 隔離在一個插件從崩潰其他。
  2. 啓動/停止插件
  3. 重新啓動上崩潰
  4. 插件通過電子郵件通知有關崩潰管理員
  5. 自動更新

您可以簡單地使用什麼已經在那裏 - 窗口服務。如果您將插件部署爲Windows服務,則已經實現了1,2和3。您不必擔心AppDomain,在本機代碼崩潰等。該實施是健壯的,經過測試和管理員很好理解。您可以manage windows services programaticaly。您唯一需要做的就是編寫一個'WatchDog'服務,它將發送電子郵件並處理自動更新。

+0

但是,這具有GUI的問題。 Windows服務不能由GUI組成。 –

+0

@Daan:是的,在這種情況下,您可能需要一個將其任務卸載到服務的門戶GUI應用程序。這可能會成爲這種架構的一個破壞者,這取決於複雜性。或者您可以使用常規流程並在WatchDog中管理它們。 – Dmitry