需要解釋的是這裡我們在傳遞編譯參數時設置了GenerateInMemory為true這表明生成的DLL會被加載在內存中(隨後被默認引用入當前應用程序域)在調用GetTime方法時我們需要加入參數傳遞object類型的數組並通過Reflection的InvokeMember來調用在創建生成的Assembly中的對象實例時需要注意用到的命名空間是你輸入代碼的真實命名空間以下是我們輸入的測試代碼(為了方便所有的代碼都在外部輸入動態執行時不做調整)
namespace Dynamicly
{
public class HelloWorld
{
public string GetTime(string strName)
{
return Welcome + strName + Check in at + SystemDateTimeNowToString();
}
}
}
運行附件中提供的程序可以很容易得到一下結果
改進的執行過程
現在一切看起來很好我們可以編譯代碼並把代碼加載到當前應用程序域中來參與我們的活動但你是否想過去卸載掉這段程序呢?更好的去控制程序呢?另外當你運行這個程序很多遍的時候你會發現占用內存很大而且每次執行都會增大內存使用是否需要來解決這個問題呢?當然需要否則你會發現這個東西根本沒用我需要執行的一些大的應用會讓我的服務器crzay不堪重負而瘋掉的
要解決這個問題我們需要來了解一下應用程序域NET Application Domain是NET提供的運行和承載一個活動的進程(Process)的容器它將這個進程運行所需的代碼和數據隔離到一個小的范圍內稱為Application Domain當一個應用程序運行時Application Domains將所有的程序集/組件集加載到當前的應用程序域中並根據需要來調用而對於動態生成的代碼/程序集我們看起來好像並沒有辦法去管理它其實不然我們可以用Application Domain提供的管理程序集的辦法來動態加載和移除Assemblies來達到我們的提高性能的目的具體怎麼做呢在前邊的基礎上增加以下步驟
·創建另外一個Application Domain
·動態創建(編譯)代碼並保存到磁盤
·創建一個公共的遠程調用接口
·創建遠程調用接口的實例並通過這個接口來訪問其方法
換句話來講就是將對象加載到另外一個AppDomain中並通過遠程調用的方法來調用所謂遠程調用其實也就是跨應用程序域調用所以這個對象(動態代碼)必須繼承於MarshalByRefObject類為了復用這個接口被單獨提到一個工程中並提供一個工廠來簡化每次的調用操作
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/net/201311/14549.html