[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 日経過しています。
[C#] 動的にアセンブリをロードする的更多相关文章
- eafier 簡單易用 HTML、CSS 網頁編輯器(可自動插入 Tag 標籤)
很久很久以前,一般人要做網頁的話大概都會用 FrontPage 之類的工具,更進階一點的會用 Dreamweaver 等軟體.雖然上述軟體提供很方便的「所見即所得」的編輯預覽模式,但寫出來的網頁程式碼 ...
- [原] XAF 如何啟用ListView橫向滾動條
using System; using DevExpress.ExpressApp; using DevExpress.ExpressApp.Win.Editors; using DevExpress ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (3):部署設定及應用 (转帖)
說明:這一篇主要是說明如何將程式部署到Application Server,以及程式如何運作,產生的檔案置於何處,以及如何以瀏覽器呈現(Applet),或是當成桌面應用程式,或是 桌面Applet,這 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (2):JavaFX建立及程式碼說明 (转帖)
說明:就如同標題一樣,前端會用到JavaFX.Swing.Java Web Start.Google Map 的技術, 後端就是JDBC.Servlet的技術,以及我們會簽署認證jar檔案,這樣才可存 ...
- JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet (转帖)
JavaFX結合 JDBC, Servlet, Swing, Google Map及動態產生比例圖 (1):NetBeans 寫 Servlet 功能:這支程式的主要功能是將 javafx 與 swi ...
- [Xamarin] 動態載入Fragment (转帖)
這篇我們來動態加入,一樣務求好懂簡單 1.一樣先將專案調整成3.0以上版本 2.首先建立自定Control的Layout \Resources\Layout\MyControlLayout1.axml ...
- 歐洲國家拓展其移動和IT服務業務
中興德國子公司與JOIN簽訂了一項綜合託管服務合同,在該合同中,公司將全面負責為盧森堡和比利時的JOIN核心網路提供網路運營,點對點無線網路報告,新品發佈和維護,還負責故障檢查.維修.測試和軟體升級. ...
- iphone6 帶回家”活動!
十一小長假即將來臨,周向榮還準備窩在家裏坐等“鋒菲戀”的後續結果嗎?雖然宅男無罪,但是請不要繼續在論壇裏高呼“李亞鵬娶了張柏芝”等口號,放下你“不吐槽會死星人”的特質,走出家門去領略一下祖國的大好山河 ...
- 問題排查:行動裝置網頁前端 UI 設計 (1)
這是最近開始接手的一個微信公眾平台專案, 在重整後端程式碼時,因為也需要透過前端來看效果, 所以就因此在前端的部分遇到了不少問題, 畢竟這是以前沒接觸過的領域 (早年的網頁應用程式開發沒有那麼多分工) ...
- 問題排查:F5啟動偵錯後所提示的錯誤 (2)
原始專案版本:Visual Studio 2005 開發環境:Visual Studio 2013 偵錯運行環境:IIS Express 啟動偵錯後,錯誤提示內容如下: HTTP 错误 403.14 ...
随机推荐
- CF24D Broken robot
题目链接 题意 有一个\(n \times m\)的矩阵.机器人从点\((x,y)\)开始等概率的往下,往右,往左走或者不动.如果再第一列,那么不会往左走,再第m列不会往右走.也就是说机器人不会走出这 ...
- Dubbo2.6.5+Nacos注册中心(代替Zookeeper)
在上一节的小栗子的基础上,只需要更改两个地方 第一个:父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --> <dependency ...
- prometheus 配置容器 cadvisor监控节点
安装cadvisor docker run \ --volume=/:/roofs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro ...
- 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...
- UDP核心API讲解
- mac使用apktool打包回apk
升级最新版的apktool 下载目录:https://ibotpeaches.github.io/Apktool/install/. 权限修改 将上述的文件放在usr/local/bin目录下并执行 ...
- GPS车辆监控系统的启动方式
我们通常用到的GPS车辆监控系统都有哪些启动方式,又有什么区别呢?通常GPS车辆监控系统都有热启.冷启.温启的技术指标,现参考如下:GPS开机定位分为冷启动.温启动和热启动三种:一.冷启动:以下几种情 ...
- java中的stream的泛型方法的使用示例
本文章使用jdk8测试 ,并结合使用lambda测试 测试前准备一些测试数据: class ObjectDemo { private Integer id; private String name; ...
- liunx 修改ssh 端口22
vim /etc/ssh/sshd_config 找到Port 22 添加 Port 5002 重启sshd /bin/systemctl restart sshd.service 防火墙释放5 ...
- chromerdriver下载地址:xpath_help
chrome下载地址 http://npm.taobao.org/mirrors/chromedriver xpath_help https://blog.csdn.net/Cayny/article ...