動態載入程式集(三) (轉)

worldblog發表於2008-01-21
動態載入程式集(三) (轉)[@more@]

我們先看看一般的反射的動態方法查詢

下面為ms自帶的例子ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemreflectionmethoaseclassinvoketopic.htm

public class A:namespace prefix = o ns = "urn:schemas--com::office" />

{

  public virtual int method () {return 0;}

}

public class B

{

  public virtual int method () {return 1;}

}

 

class Mymethodinfo

{

  public static int Main()

  {

  Console.WriteLine ("nReflection.MethodInfo");

  A MyA = new A();

  B MyB = new B();

 

  //Get the Type and MethodInfo

  Type MyTypea = Type.GetType("A");

  MethodInfo Mymethodinfoa = MyTypea.GetMethod("method");

  Type MyTypeb = Type.GetType("B");

  MethodInfo Mymethodinfob = MyTypeb.GetMethod("method");

  //Get and display the Invoke method

  Console.Write("nFirst method - " + MyTypea.FullName +

  " returns " + Mymethodinfoa.Invoke(MyA, null));

  Console.Write("nSecond method - " + MyTypeb.FullName +

  " returns " + Mymethodinfob.Invoke(MyB, null));

  return 0;

  }

}

下面是用介面查詢方法,例項建立,再例項物件

using System;

 public interface  IPoint

{

   // return  now  class of  shix  interface

     string  ReturnNowClass();

上面為 ClassSuc.cs 編輯為ClassSuc.dll  。

 

using System;

namespace Claib1

{

  public class Class1:  IPoint

  {

  public Class1()

  {

  }

  public string ReturnNowClass()

  {

  return  "weclone  Execute ClassLib1  Class1";

  }

  }

}

將ClassSuc.dll的也新增到上面檔案,Class1實現了Ipoint介面

編輯檔案為ClassLib1.dll

using System;

namespace ClassLib2

{

  public class Class2:IPoint

  {

  public Class2()

  {

 

  }

  public string ReturnNowClass()

  {

  return  "ClassLib2"+"Class2"+"weclone";

  }

  }

}

將ClassSuc.dll的也新增到上面檔案,Class2實現了Ipoint介面

編輯檔案為ClassLib2.dll

 

也許你已經看和做的不厭煩了,你可能要要問,你到底想講什麼????

注意,將上面的三個dll  copy 在 同一路徑下 這裡為“C:/test”

using System;

using System.Reflection;

class LoadExe

  {

  [STAThread]

  static void Main(string[] args)

  {

  // Use the file name to load the assembly into the current application ain.

  Assembly b;

  b = Assembly.LoadFrom(@"C:/test/ClassSuc.dll");

  Type[] mytypes = b.GetTypes();

  // show b中的介面IPoint

  foreach (Type t in mytypes)

  {

  Console.WriteLine (t.FullName);

  }

  MethodInfo Method = mytypes[0].GetMethod("ReturnNowClass");

  //Get the method to call.

  Assembly a ;

  string  k=Console.ReadLine();

  //輸入大於10時,ClassLib1.dll的方法 否則呼叫ClassLib2的方法

    if(Convert.ToInt32(k)>10)

  a = Assembly.LoadFrom(@"C:/test/ClassLib1.dll");

  else

  a = Assembly.LoadFrom(@"C:/test/ClassLib2.dll");

  Type[] types = a.GetTypes();

  // show b中的ClassLib1.Class1或 ClassLib2.Class2

  foreach (Type t in  types)

  {

  Console.WriteLine (t.FullName);

  }

  // Create an instance of the HelloWorld class.

  obj = Activator.CreateInstance(types[0]);

  // Invoke the  method.

  Console.WriteLine(Method.Invoke(obj, null)); 

  Console.ReadLine();

 

  }

  }

執行效果為:

Ipoint

這時要求輸入 輸入

13

繼續執行顯示

ClassLib1.Class1

weclone  Execute ClassLib1  Class1

要求輸入時 輸入

5

繼續執行顯示

ClassLib2.Class2

weclone  Execute ClassLib2  Class2

實現了什麼,透過介面動態載入集。

意義:反射機制實現動態插拔,只需更改檔案和XCOPY相應的,

可以無須編譯就直接定製出一個特定

  缺點: 衝擊 速度慢

 

有的人還要問,既然能夠動態載入程式集

那如何顯示解除安裝程式集  CLR不支援解除安裝程式集  但可以解除安裝AppDomain包含的所有的程式集。AppDomain.Unload 方法 解除安裝指定的應用程式域。

本還想寫一文章講述動態程式集 但自己理解不夠,又覺得意義不大所以把那些東西,自己也不想學那些東西(太浮躁的表現),所以提到這裡來。

動態程式集是或工具在執行時發出後設資料和 MSIL,並可在上生成可移植可執行 (PE) 檔案 (不同於上面的那個動態載入程式集)

在執行時定義程式集,然後執行這些程式集並/或將它們儲存到磁碟。

在執行時定義新程式集中的模組,然後執行這些模組並/或將它們儲存到磁碟。

在執行時定義型別,建立這些型別的例項,並呼叫這些型別的方法。

程式集---》 模組---》型別—》例項的方法

具體見

ms-help://MSSDK.CHS/cpgunf/html/cpconemittingdynamicassemblies.htm

ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemappdomainclassdefinedynamicassemblytopic.htm

感謝?sendto=bitfan" target=_blank>bitfan(數字世界一凡人) ( )  使得自己有這樣的收穫


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997906/,如需轉載,請註明出處,否則將追究法律責任。

相關文章