我在當前項目中遇到了一些問題,如果有人能夠爲我提供一些見解或建議,我將非常感激。重新加載動態代碼/重新加載類型
我的項目是一個服務,即執行用戶腳本。腳本是用C#編寫的,我使用CodeDomProvider在運行時構建一個程序集。大會包含單個類。
public Script : ScriptBase
{
public override void Run(){}
}
允許用戶更改腳本,如果我檢測到更改。我重建了創建ScriptBase子項的新實例的內容。我知道帶有腳本S1的原始程序集A1保持加載到當前AppDomain中,但它是我願意支付的價格。這種情況下沒有任何問題。
我想添加用戶定義庫的功能(在運行時也可編輯)。所以現在的問題是我有一個腳本S1,即使用庫L1。如果用戶更改L1,我顯然必須重建所有腳本。如何來,我的第一個場景的作品
build L1 with type T1
build S1 --depends--> L1
(use S1)
build L2 with type T1
build S2 --depends--> L2 = crashes type T1 is defined in L1 and L2
(use S1) //It passes through if I didn't use S1 for the first time
我有以下問題
:在這裏,問題來了。即我一遍又一遍地構建並加載相同類型的程序集,並且一切都正常工作
2.如果我在構建之後不使用S1,那麼即使在檢查時我也可以構建S2我可以看到,所有組件L1,S1,L2,S2都裝載了組件。顯然,如果我加載程序集,但我不會以某種方式使用它「程序集已加載,但類型未加載」。究竟發生了什麼?
3.你會建議如何解決我的問題?看起來最合乎邏輯的是使用臨時AppDomain,但我沒有任何經驗,看起來相當複雜,如果有更簡單的解決方案,我寧願使用它。
謝謝
我認爲這裏的主要答案是:或者看看AppDomain的使用(當你掌握它的時候真的不是那麼糟糕),或者查看任何現有的腳本宿主; IronPython,IronRuby,ecmascript和Lua都有相當不錯的託管腳本宿主,IIRC –