zoukankan      html  css  js  c++  java
  • [C#] 動的にアセンブリをロードする

    アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.dll や .exe) を読み込む場合、System.Reflection.Assemby クラスの Load メソッドを使用します。この場合はアセンブリ名を指定しますが、特定の場所に保持しているファイルからアセンブリをロードする場合は、LoadFrom メソッドを使用します。下記のサンプルコードでは、予め、「MyLibrary」という名前空間に「MyBirthday」というクラスを実装した 「MyLibrary.dll」がアプリケーション フォルダに配備されているものとします。また、この MyBirthDay クラスには 「CalcDaysFromBirthDate」という DateTime を引数にする void 型のメソッドが実装されているものとします。

    MyLibrary.cs

    C#
    using System; 
    using System.Text; 
     
    namespace MyLibrary 
    { 
        public class MyBirthday 
        { 
            public void CalcDaysFromBirthDate(DateTime birthDate) 
            { 
                StringBuilder sb = new StringBuilder(); 
                sb.Append("あなたの誕生日は "); 
                sb.Append(birthDate.ToShortDateString()); 
                sb.Append(" です。"); 
                sb.Append("誕生日から "); 
                sb.Append(DateTime.Today.Subtract(birthDate).Days); 
                sb.Append(" 日経過しています。"); 
                Console.WriteLine(sb.ToString()); 
            } 
        } 
    }
     

    上記のアセンブリを読み込んだサンプル コードは下記の通りです。

    C#
    using System; 
    using System.IO; 
    using System.Reflection; 
     
    namespace CodeRecipe_LoadAssembly_CS 
    { 
        class Program 
        { 
            static void Main(string[] args) 
            { 
                DateTime birthDate; 
                Console.Write(@"誕生日を入力してください (yyyy/MM/dd):"); 
                while (!DateTime.TryParse(Console.ReadLine(), out birthDate)) 
                { 
                    Console.Write("入力が正しくありません。再度入力してください (yyyy/MM/dd):"); 
                } 
                try 
                { 
                    Assembly asm = Assembly.Load("MyLibrary"); 
                    Type myType = asm.GetType("MyLibrary.MyBirthday"); 
                    MethodInfo myMethod = myType.GetMethod("CalcDaysFromBirthDate"); 
                    object obj = Activator.CreateInstance(myType); 
                    myMethod.Invoke(obj, new object[] { birthDate }); 
                } 
                catch (Exception e) 
                {                 
                    Console.WriteLine(e); 
                } 
                Console.ReadLine(); 
            } 
        } 
    }
     

    このコードでは Assembly クラスの静的メソッドである Load メソッドを使用し、アセンブリをロードしています。また、GetType メソッドにて型を取得した後、Type.GetMethod メソッドを使用することで MyBirthdaty.CalcDaysFromBirthDate メソッドの情報を取得しています。

    C#
    Assembly asm = Assembly.Load("MyLibrary"); 
    Type myType = asm.GetType("MyLibrary.MyBirthday"); 
    MethodInfo myMethod = myType.GetMethod("CalcDaysFromBirthDate");
     

    更に、読み込んだアセンブリからオブジェクト インスタンスを Activator.CreateInstance メソッドにより作成し、MethodInfo.Invoke メソッドを用いることでオブジェクト、メソッドに必要な引数を設定しています。

    C#
    object obj = Activator.CreateInstance(myType); 
    myMethod.Invoke(obj, new object[] { birthDate });
     

    上記のサンプルコードの実行結果 (2010 年 5 月 25 日時点) は下記の通りです。

    C#
    誕生日を入力してください(yyyy/MM/dd):1978/08/13 
    あなたの誕生日は 1978/08/13 です。誕生日から 11608 日経過しています。
     
  • 相关阅读:
    在模拟器安装测试APP,给指定设备安装APP
    设置安卓模拟器,打开模拟器,设置语言为中文
    使用appium1.4在android8.0真机上测试程序时报错command failed shell "ps 'uiautomator'"的解决方式
    appium1.4+华为8.0执行自动化脚本,报启动session失败,原因是unicode_ime_apk\Uni codeIMEdebug.apk在手机上已存在,再次安装失败,导致启动session失败,解决办法:换高版本的appium
    搭建appium+maven手机自动化测试环境搭建
    appium1.7的使用
    SDK打开模拟器遇到SDK包里缺少API组件,附上我的解决历程,心累
    简单记录下Jmeter通过CSV保存测试数据,测试用例,及将测试结果导出到Excel里
    基于webpack的React项目搭建(一)
    基于webpack的React项目搭建(二)
  • 原文地址:https://www.cnblogs.com/xpvincent/p/9903526.html
Copyright © 2011-2022 走看看