C 動態程式集的載入 建立例項 序列化與反序列化

2021-05-26 11:22:52 字數 2554 閱讀 4567

動態程式集是指沒有被編譯至主程式,而是主程式在執行時動態呼叫或者生成的程式集。動態鏈結庫(dll)大家一定很熟悉,它是一系列類和方法的打包,可以被不同的執行程式載入和共享,而c#生成的程式集也是dll。在實際應用中,一些程式不一定要在啟動的時候就把所有dll檔案都載入到記憶體中,而是根據需要動態載入或者建立。c#的反射和晚期繫結為實現這種操作提供了極大的幫助。本文主要介紹了從動態程式集裡怎樣建立特定類的物件,以及該物件的序列化和反序列化問題。

using system;

}

using system;

namespace dynamicassembly

set

}private int age;

public int age

set

}public person(string name, int age)

public void print()

age:", name, age);}}

}

using system.reflection;
然後新增修改main函式如下

static void main(string args)

}//建立這個動態類的例項

object o = activator.createinstance(mytype, new object );

//執行類中的print方法

ipersoncontrol iperson = o as

ipersoncontrol;

iperson.print();

console.read();

}

執行程式,輸出為

name:shinichi_wtn age:22
因此,動態引導程式集並且新建物件是很容易的一件事情。

有時候,我們更希望將這個物件儲存下來,即序列化操作,我們新增兩個函式,分別處理序列化和反序列化操作(using system.runtime.serialization.formatters.binary),如下

static void serializeobject(object o, string path)

}static object deserializeobject(string path)

return o;

}

在main函式中新增序列化的操作

...

//建立這個動態類的例項

object o = activator.createinstance(mytype, new object );

//執行類中的print方法

ipersoncontrol iperson = o as

ipersoncontrol;

iperson.print();

//反序列化物件到本地

serializeobject(o, "person.dat");

...

再執行一下,就在bin/debug目錄裡得到了物件的序列化檔案person.dat

之後,我們測試從person.dat還原到person物件的操作,修改main函式如下

static void main(string args)

執行程式,輸出為

name:shinichi_wtn age:22
這個時候,比較好奇,因為在程式中並沒有新增對dynamicassembly.dl的引用,也沒有動態載入,而事實是居然能直接被反序列化,可以看到在執行程式的時候,遇到未知程式集的時候,主程式會自動尋找同一目錄下的程式集,如果有該未知程式集,那麼就被自動載入了。可以用乙個簡單的方法來測試這個猜想。

static void main(string args)

console.writeline("---反序列化後---");

//還原序列化的物件

object o = deserializeobject("person.dat");

foreach (assembly assembly in

console.read();

}

執行後發現,反序列化前並沒有輸出dynamicassembly.dll,而反序列化後就有了,說明dynamicassembly.dll是在程式執行時自動被載入的。這就引發乙個問題,當dynamicassembly.dll不在主程式目錄下時,就會丟擲異常。我們把dynamicassembly.dll放到lib目錄裡,然後再執行程式,直接異常了……

static void main(string args)

static

assembly currentdomain_assemblyresolve(object sender, resolveeventargs e)

執行程式,輸出為

name:shinichi_wtn age:22
問題解決了,即通過手動指定程式集能夠解決在反序列化的時候找不到程式集的錯誤。有了這個基礎,我們在序列化和反序列化的時候變得更加靈活,這在開發乙個開放式的軟體,有著外掛程式/組建/模組功能的時候,可以對動態載入的程式集建立物件、並執行序列化和反序列化操作,的確是一件很好的事情。

C 動態程式集的載入 建立例項 序列化與反序列化

動態程式集是指沒有被編譯至主程式,而是主程式在執行時動態呼叫或者生成的程式集。動態鏈結庫 dll 大家一定很熟悉,它是一系列類和方法的打包,可以被不同的執行程式載入和共享,而c 生成的程式集也是dll。在實際應用中,一些程式不一定要在啟動的時候就把所有dll檔案都載入到記憶體中,而是根據需要動態載入...

C 程式集載入方法

原文 http blog.csdn.net podded archive 2008 10 27 3158687.aspx 要從程式集的元資料中獲取程式集的資訊,首先需要引導程式集。net中引導程式集方法有幾種,本人結合自己的實踐和認識簡單介紹一下。描述不一定很準確,請提出來一起進步。一 隱式載入 沒...

C 動態建立類的例項

c 動態 建立類的例項,如果對效能要求不是很高,而且需要動態 建立類的例項的時候可以考慮使用以下的方法 1.定義兩個類 基類 public class basebusiness 子類 public class samplebusiness basebusiness 2.動態 建立類的例項 程式集名稱...