執筆者: インフラジスティックス・ジャパン株式会社 池原 大然

動作確認環境: Visual Studio 2010、.NET Framework 2.0、Windows 7 Enterprise 32 bit

更新日: 2010 年 6 月 4 日


アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.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 日経過しています。
 

動的にロードする場合に有益なリフレクションの用法、さらに C# 4.0 で追加された dynamic 型を使用したアセンブリの動的ロード、応用例については、連載! とことん C#

に解説がされていますので、こちらも確認してください。

関連リンク


 

Code Recipe Code Recipe

ページのトップへ