動態加栽程式集(二) (轉)

worldblog發表於2008-01-21
動態加栽程式集(二) (轉)[@more@]

正式開始本文:在 中,將集載入至應用程式域的方法有幾種。每種方法使用不同的類。

您可以使用下面的過載方法將程式集載入至應用程式域:

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章