程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於在AppDomain中動態編譯的解決方法

關於在AppDomain中動態編譯的解決方法

編輯:C#入門知識

看著博文之前,希望大家能看看 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 Code

RemoteLoader.cs類:

View Code

Compiled.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中。但由於水平有限,希望有大神可以指教

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved