動態加栽程式集(二) (轉)
正式開始本文:在 中,將集載入至應用程式域的方法有幾種。每種方法使用不同的類。
您可以使用下面的過載方法將程式集載入至應用程式域:
System.Appain 類包含幾種過載的 Load 方法。儘管這些方法可用於將任何程式整合功地載入至當前的或新的應用程式域,但它們主要還是用於 互動操作。您也可以使用 CreateInstance 方法載入程式集。
System.Reflection.Assembly 類包含兩種靜態過載方法:Load 和 LoadFrom。這兩種方法因載入上下文而異。
簡單例題:講解了在一個.exe中另一個.exe檔案的方法
using System;:namespace prefix = o ns = "urn:schemas--com::office" />
namespace dy_loadAsse
{
class testclass
{
[STAThread]
static void Main(string[] args)
{
OutUse test=new OutUse();
test.Output();
Console.ReadLine();
}
}
class OutUse
{
public OutUse()
{
}
public void Output()
{
Console.WriteLine("test dy load assembly");
}
}
}
以上編譯成功。為dy_loadAsse.exe,顯示:
test dy load assembly
放在與下面生成的loadexe.exe於同一目錄下。
檔案二:
using System;
using System.Reflection;
namespace Use_dy_Load_Assembly
{
class LoadExe
{
[STAThread]
static void Main(string[] args)
{
// Use the file name to load the assembly into the current application domain.
Assembly a = Assembly.LoadFrom("dy_loadAsse.exe");
Type [] types2 = a.GetTypes();
foreach (Type t in types2)
{
Console.WriteLine (t.FullName);
}
//Get the type to use.
//Type myType = a.GetType("OutUse"); 這樣寫老是出錯
Type myType = a.GetType("dy_loadAsse.OutUse");
Console.WriteLine (myType.FullName);
//Get the method to call.
MethodInfo mymethod = myType.GetMethod("Output");
// //Create an instance.
obj = Activator.CreateInstance(myType);
// //Execute the adnamemethod method.
mymethod.Invoke(obj,null);
//執行結果為test dy load assembly
//以下是呼叫dy_loadAsse.exe中的Main方法,出現錯誤
// Type myType = a.GetType("dy_loadAsse.testclass");
// Console.WriteLine (myType.FullName);
// //Get the method to call.
// MethodInfo mymethod = myType.GetMethod("Main");
// //// //Create an instance.
// Object obj = Activator.CreateInstance(myType);
// //// //Execute the adnamemethod method.
// mymethod.Invoke(obj,null);
Console.ReadLine();
}
}
}
實際上不管你是.exe或dll 組成的程式集 都可以被載入
自定義繫結
除了由隱式地用來進行晚期繫結之外(指virtual方法,介面等相關實現的繫結),反射還可以在程式碼中顯式地用來完成晚期繫結。 支援多種語言,但這些語言的繫結規則各不相同。在早期繫結的情況下,程式碼生成器可以完全控制此繫結。但是,當透過反射進行晚期繫結時,必須用自定義繫結來控制繫結。Binder 類提供了對成員選擇和呼叫的自定義控制。
利用自定義繫結,您可以在執行時載入程式集,獲取有關該程式集中型別的資訊,然後對該型別呼叫方法或訪問該型別的欄位或屬性。如果您在編譯時(例如當型別依賴於輸入時)不知道物件的型別,就可以使用這種方法。
using System;
namespace dy_loaddll
{
public class HelloWorld
{
// Constant Hello World string.
private const String m_helloWorld = "Hello World";
// Default public constructor.
public HelloWorld()
{
}
// Print "Hello World" plus the passed text.
public void PrintHello(String txt)
{
// Output to the Console.
Console.WriteLine(m_helloWorld + " " + txt);
}
}
}
編輯生成dy_loaddll.dll,與 LoadExe.exe在同一的目錄下面。
using System;
using System.Reflection;
namespace Use_dy_Load_Assembly
{
class LoadExe
{
[STAThread]
static void Main(string[] args)
{
// Use the file name to load the assembly into the current application domain.
Assembly a = Assembly.LoadFrom("dy_loaddll.dll");
Type [] types2 = a.GetTypes();
foreach (Type t in types2)
{
Console.WriteLine (t.FullName);
}
//Get the type to use.
// Type myType = a.GetType(""); 這樣寫老是出錯因為上面的dll加了名稱空間
Type myType = a.GetType("dy_loaddll.HelloWorld");
// Type myType = a.GetType("HelloWorld");
Console.WriteLine (myType.FullName);
// //Get the method to call.
MethodInfo printMethod = myType.GetMethod("PrintHello");
// Create an instance of the HelloWorld class.
Object obj = Activator.CreateInstance(myType);
// Create the args array.
Object[] test = new Object[1];
// Set the arguments.
test[0] = "From Late Bound";
// Invoke the PrintHello method.
printMethod.Invoke(obj, test);
Console.ReadLine();
}
}
}
當然我們不禁要問題,如果方法過載,如果是屬性。又該怎麼辦??
/查相關的msdn,
ms-help://MS.VSCC/MS.MSDNVS.2052/cpgu/html/cpcondynamicallyloadingusingtypes.htm#cpcondynamicallyloadingusingtypes
ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfSystemTypeClassInvokeMemberTopic.htm
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997899/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 動態載入程式集(三) (轉)
- .NET 動態載入程式集 (一) (轉)
- .NET Emit 入門教程:第二部分:構建動態程式集(追加構建靜態程式集教程)MIT
- 利用Assembly動態載入程式集
- BIND 高階特性(二)-- 動態更新(轉)
- 動態質量管理之二(轉載)
- DW+ASP 玩轉動態二級選單 (轉)
- 《springcloud 二》微服務動態閘道器,閘道器叢集SpringGCCloud微服務
- 避免動態SQL(二)SQL
- 常用JS程式碼集(二)JS
- [轉] 從 dll 程式集中動態載入窗體
- 給你的應用程式新增動態滑鼠 (轉)
- Java動態程式設計---動態代理Java程式設計
- AI運動小程式開發常見問題集錦二AI
- 再論字符集轉換(二)
- 動態行轉列
- Linux網路驅動程式編寫(二)(轉)Linux
- DEDE整站動態/靜態轉換
- 程式人生(二) (轉)
- 如何追蹤laravel動態<二>Laravel
- jq動態生成二維碼
- 【轉】動態位元組碼技術跟蹤Java程式Java
- 二維陣列的動態記憶體分配和釋放 (轉)陣列記憶體
- 【Mongodb】分片加複製集MongoDB
- 暑假集訓 加賽1
- 動態內表及動態ALV顯示(轉)
- 動態移動控制元件 (轉)控制元件
- 動態固定行轉列
- 動態 iptables 防火牆(轉)防火牆
- 動態連結庫(轉)
- 動態SQL語句 (轉)SQL
- mysql動態行轉列MySql
- 動態監控程式
- 寫程式是一種態度(二)四倍速memmove (轉)
- 動態庫的生成和使用(二)
- WebClass實現動態WEB程式設計之理論篇 (轉)Web程式設計
- VB呼叫C程式的方法—動態連結庫法 (轉)C程式
- Windows Server2012 故障轉移叢集之動態仲裁(Dynamic Quorum)WindowsServer