.NET 動態載入程式集(二)

來源:互聯網
上載者:User

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

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

System.AppDomain 類包含幾種重載的 Load 方法。儘管這些方法可用於將任何程式整合功地載入至當前的或新的應用程式定義域,但它們主要還是用於 COM 互動操作。您也可以使用 CreateInstance 方法載入程式集。

System.Reflection.Assembly 類包含兩種靜態重載方法:Load 和 LoadFrom。這兩種方法因載入上下文而異。

簡單例題:講解了在一個.exe檔案中調用另一個.exe檔案的方法

using System;

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.

            Object 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 CSharp Late Bound";

              // Invoke the PrintHello method.

              printMethod.Invoke(obj, test);  

              Console.ReadLine();

         }

     }

}

當然我們不禁要問題,如果方法重載,如果是屬性。又該怎麼辦??

/查相關的msdn,

ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpcondynamicallyloadingusingtypes.htm#cpcondynamicallyloadingusingtypes

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

 
 
 



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。