用應用程式域實現軟體系統的熱插拔

2021-08-23 11:28:18 字數 2081 閱讀 3066

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

不許重新編譯整個系統就可以更新某個模組的方法我們都知道,那就是用反射功能,比如

assembly.load,可以在**層動態載入某個模組。但要實現真正的執行過程中動態更換,我們必須有乙個機制,首先把舊的版本從程序中解除安裝,然後載入新的版本,不幸的是,我們沒有乙個assembly.unload方法,我們必須尋找其他途徑。

首先看主程式:

static

void

main() }

這裡是介面類remotehelper:

public

class

remotehelper:marshalbyrefobject

public

void

ziplogfile(

intfilenumber)

;methodinfo ziplogmethodinfo =

ziplogtype.getmethod("zipfiles");

ziplogmethodinfo.invoke(activator.createinstance(ziplogtype),

ziplogarguments);}}

壓縮模組的assemblyname配置在config檔案中

當需要更新模組時,我們做兩件事情:

1.用新的

assembly替換掉舊的,直接覆蓋,(當正在壓縮檔案時不可以,避開這個時間段);

2.更改配置檔案中的

newdomainfunction名字。

下面是壓縮模組的**:

public

class

ziplog

public

void

zipfiles(

intfilenumber)

",datetime.now.tostring("yyyy.mm.dd hh:mm:ss"));

tw.close();

//zip function...}}

} 啟動主程式執行,然後把壓縮模組的版本更新,替換舊的版本。下面是測試結果:

dll fullname:newdomainfunction, version=1.0.3273.17760, culture=neutral, publickeytoken=cc277552af2314ec

zip time:2008.12.17 10:04:16

dll fullname:newdomainfunction, version=1.1.3273.18113, culture=neutral, publickeytoken=cc277552af2314ec

zip time:2008.12.17 10:05:07

到此一切順利,不過有個小地方我們感到不方便,那就是我們必須避開壓縮檔案的時候,如果正在壓縮檔案你去公升級,比如我們在

zipfiles

system.threading.thread.sleep(60000);

再執行,並且當你確定正在執行

zipfiles

時刪掉newdomainfunction.dll

檔案,將出現下面的錯誤:

這個錯誤的原因是系統會對程序裡用到的原**檔案進行鎖定。雖然在我們的例子中遇到這個時候的機率並不高,我們還是需要解決這個問題。解決方案是

」shadow copy」

。在主程式

createdomain

newdomaininfo.shadowcopyfiles="true";

domaininfo.shadowcopydirectories="file:///" + system.environment.currentdirectory;

這樣的話,系統將把**檔案複製乙份拷貝到其他目錄(

)。系統執行的任何時候你將可以更新模組檔案。

翻譯 應用程式池和應用程式域的區別

應用程式域是asp.net的概念,它為每個asp.net應用程式提供隔離。應用程式池是iis的概念,它提供在程序級別的隔離。應用程式域僅對asp.net應用程式可用。應用程式池對asp.net和非asp.net應用程式都可用。每個asp.net應用程式有它自己的應用程式域。乙個應用程式池可以被多個應...

翻譯 應用程式池和應用程式域的區別

應用程式域是asp.net的概念,它為每個asp.net應用程式提供隔離。應用程式池是iis的概念,它提供在程序級別的隔離。應用程式域僅對asp.net應用程式可用。應用程式池對asp.net和非asp.net應用程式都可用。每個asp.net應用程式有它自己的應用程式域。乙個應用程式池可以被多個應...

關於跨應用程式域邊界的物件訪問

乙個應用程式域可以通過兩種方式和另乙個應用程式域進行通訊。一種是傳值 by value 另一種是傳引用 by reference 傳值是通過物件的序列和反序列實現的,因此要傳遞的物件必須有system.serializable屬性.它的實現原理 我們在應用程式域a中構造了乙個物件a1,現在要將物件a...