2013-02-08 149 views
0

我在當前項目中遇到了一些問題,如果有人能夠爲我提供一些見解或建議,我將非常感激。重新加載動態代碼/重新加載類型

我的項目是一個服務,即執行用戶腳本。腳本是用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 

我有以下問題

  1. :在這裏,問題來了。即我一遍又一遍地構建並加載相同類型的程序集,並且一切都正常工作

    2.如果我在構建之後不使用S1,那麼即使在檢查時我也可以構建S2我可以看到,所有組件L1,S1,L2,S2都裝載了組件。顯然,如果我加載程序集,但我不會以某種方式使用它「程序集已加載,但類型未加載」。究竟發生了什麼?

    3.你會建議如何解決我的問題?看起來最合乎邏輯的是使用臨時AppDomain,但我沒有任何經驗,看起來相當複雜,如果有更簡單的解決方案,我寧願使用它。

謝謝

+1

我認爲這裏的主要答案是:或者看看AppDomain的使用(當你掌握它的時候真的不是那麼糟糕),或者查看任何現有的腳本宿主; IronPython,IronRuby,ecmascript和Lua都有相當不錯的託管腳本宿主,IIRC –

回答

0

我覺得一個AppDomain是這裏最好的選擇。正如馬克所說,一旦你知道你在做什麼,他們真的不是那麼糟糕,它只是找到我發現問題的信息。

現在,無恥插頭:我做了這個信息庫在計算器上的另一個問題,以幫助反射裝組件,它應該包括建立與它跨越邊界的通信的應用程序域的基礎:Plugin Demo

從看你的問題,你可以放心地忽略陰影複製部分,只使用主機項目的掃描儀/通信部分。

+0

好吧,我期望從答案中得知,有人還會解釋什麼時候從程序集中加載Type。無論如何,你的例子非常有幫助,我非常感謝你。 – Biggles