看著博文之前,希望大家能看看 Allan. 的這篇文章。
http://www.cnblogs.com/zlgcool/archive/2008/10/12/1309616.html
之前逛園子時偶爾看到 Allan.這篇文章中提供了兩種動態編譯的方案,其中第一種方法由於卸載不太方便的確會導致內存方面的問題。而改良的第二種方法會將dll保存至bin目錄,並通過加載這個dll,再調用dll中的方法,最後還有個刪除dll的操作。這一系列操作勢必會影響效率和浪費資源。我當時就想能否不簡化這一系列的操作。所以才有了這篇博文,在這裡首先感謝 ,峰哥利用自己時間為園子裡面的同志們解決問題,這種做法值得大家學習。
好了,開始說正文:
程序集的確是不能單獨卸載,但程序域可以卸載,Allan. 的第二種方法可以借鑒修改。
先看看解決方案
autoCompiled:提供對源代碼動態編譯的功能
AppDomainTest:調用程序
Form1.cs:新建AppDomain、加載autoCompiled
RemoteLoader.cs:提供遠程訪問調用
Winform中引用autoCompiled項目。
大致的思路就是將整個代碼的編譯過程(Compiled.cs類)全部拿到AppDomain中執行,RemoteLoader.cs提供遠程訪問。
winform代碼:
View CodeRemoteLoader.cs類:
View CodeCompiled.cs類:
View Code
執行步驟:
1:點擊按鈕之後,代碼會新建一個程序域AppDomain
2:在新建立的ApppDomain中程序域加載程序集【remoteLoader.LoadAssembly("autoCompiled");】
3:獲取程序集中的需要調用的類 【object objClass = assembly.CreateInstance("autoCompiled.Compiled");】
4:調用類方法進行編譯並返回執行結果【GetCompiledByString】
5:卸載AppDomain
在AppDomain.Unload之後再次調用,會發現程序報錯。說明程序集的確已隨著AppDomain被卸載。
這種方法的確可以避免Allan.第二種方法繁瑣的步驟,但是本質上還是通過加載編譯後的引用。每次都會通過2次反射調用方法
第一次:調用引用的方法
第二次:調用自動編譯代碼中的方法
本人理想化的只是將動態編譯之後的結果 Assembly 添加至AppDomain中,而不是將代碼編譯的過程都添加至AppDomain中。但由於水平有限,希望有大神可以指教