為了將問題描述清楚,我們先來看乙個例子。在這個例子中,winform上有乙個按鈕,當使用者點選這個按鈕後,就會裝載乙個已經存在的assembly,並且在介面的label控制項上顯示出這個assembly的fullname。對reflection稍微熟悉一點的朋友都知道,這是非常簡單的事情,只需要用assembly.loadfile方法獲得assembly,然後用fullname屬性來顯示即可,比如下面的**:
view plain
?private
void
button1_click(
object
sender, eventargs e)
當然,程式執行正常,您不會發現任何編譯時或執行時的錯誤。然而,當你在沒有退出此程式之前,再去編譯被呼叫的testlib.dll,你會發現,visual studio無法完成編譯,提示說該檔案正在被其它的程序所使用,如下:
事實上,我們的程式與這個testlib.dll並沒有太大的關聯,我們的程式只不過就是顯示一下testlib.dll的基本資訊。如果testlib.dll是乙個共享的庫,那麼資源獨佔問題會影響到其它程式的正常工作。
view plain
?public
class
remoteloader : marshalbyrefobject
public
string
fullname
} } view plain
?public
class
localloader
public
void
loadassembly(
string
fullname)
public
void
unload()
public
string
fullname
} } 最後,修改我們winform上的button click事件處理過程,改為如下的形式:
view plain
?private
void
button1_click(
object
sender, eventargs e)
AppDomain與動態引導程式集
是乙個應用程式執行的獨立環境,為執行託管 提供隔離 解除安裝和安全邊界.net 應用程式是由許多程式集組成的,然而不像win32 程式,net 程式是在應用程式域中執行.應用程式域不同於win32 的程序.實際上,之間是完全隔離的.中應用程式是不能共享資訊的 全域性變數,靜態字段 除非用remoti...
應用程式域(AppDomain)
1 進行錯誤隔離和安全設定隔離,乙個應用程式域如果崩潰不會影響其他應用程式域,功能類似於作業系統的程序 2 在.net環境下才產生,因為它在clr中執行 3 應用程式域的建立和銷毀所需的開銷相對於系統程序小,乙個程序中可以包含多個應用程式域其實,程序就是作業系統用來隔離各個不同應用程式的機制。這樣就...
關於C ,CLR,程式集,AppDomain
c 中的程式集形式上是 exe或 dll,兩者的區別是是否有程式的入口函式。程式集是.net型別 資源的集合。程式集又可分為動態程式集和靜態程式集。還記得程式的執行過程麼,編譯 鏈結 裝入,鏈結程式將編譯後的目標程式和用到的庫函式 c 中的include指令就是用來查詢庫的 鏈結在一起形成乙個裝入模...