[C#] 動的にアセンブリをロードする
アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.dll や .exe) を読み込む場合、System.Reflection.Assemby クラスの Load メソッドを使用します。この場合はアセンブリ名を指定しますが、特定の場所に保持しているファイルからアセンブリをロードする場合は、LoadFrom メソッドを使用します。下記のサンプルコードでは、予め、「MyLibrary」という名前空間に「MyBirthday」というクラスを実装した 「MyLibrary.dll」がアプリケーション フォルダに配備されているものとします。また、この MyBirthDay クラスには 「CalcDaysFromBirthDate」という DateTime を引数にする void 型のメソッドが実装されているものとします。
MyLibrary.cs
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());
}
}
}
上記のアセンブリを読み込んだサンプル コードは下記の通りです。
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 メソッドの情報を取得しています。
Assembly asm = Assembly.Load("MyLibrary");
Type myType = asm.GetType("MyLibrary.MyBirthday");
MethodInfo myMethod = myType.GetMethod("CalcDaysFromBirthDate");
更に、読み込んだアセンブリからオブジェクト インスタンスを Activator.CreateInstance メソッドにより作成し、MethodInfo.Invoke メソッドを用いることでオブジェクト、メソッドに必要な引数を設定しています。
object obj = Activator.CreateInstance(myType);
myMethod.Invoke(obj, new object[] { birthDate });
上記のサンプルコードの実行結果 (2010 年 5 月 25 日時点) は下記の通りです。
誕生日を入力してください(yyyy/MM/dd):1978/08/13
あなたの誕生日は 1978/08/13 です。誕生日から 11608 日経過しています。
最新文章
- Swift入门篇-集合
- Android 下的EXIF
- 通过桥接虚拟网卡使VMWare和宿主机实现双向通讯
- 【转】C 宏
- LINQ To SQL 语法及实例大全
- 超赞值得一试的六款jQuery插件和CSS3应用
- Win32 SDK程序创建一些控件(简单调用InitCommonControlsEx,并指定ICC_LISTVIEW_CLASSES控件就可以了)
- SQL大数据操作统计
- Layout Resource官方教程(4)<;include>;与<;merge>;
- 如何用Windbg找到被catch住的C++的异常
- logstash 字段类型转换后 需要刷新
- 使用Oracle安装账户登录数据库
- JQuery中Checkbox的一些功能
- git基础命令学习总结
- 最新webstorm
- flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?
- Linux---基础指令(一)
- Redis事务概念
- C# SpinWait 实现
- hiho #1196 : 高斯消元&#183;二