アプリケーション ドメインにおいて起動時に読み込まれない別のアセンブリ (.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#] 動的にアセンブリをロードする相关推荐

  1. 在SQL2000怎樣用動態實現SQL2005的nvarchar(max)功能

    最近發現還有網友在提SQL2000的字符限制問題,以下舉一個例給大家參照: --動態建表: use Tempdb go if object_id('SP_CreateTable') is not nu ...

  2. [Tool] 使用CodeMaid自動程式排版 - 摘自网络

    前言 「使用StyleCop驗證命名規則」這篇文章,指引開發人員透過StyleCop這個工具,來自動檢驗專案中產出的程式碼是否合乎命名規則. [Tool] 使用StyleCop驗證命名規則 但是在專案 ...

  3. (iOS)从0到Double系列 如何刻出一个可拖动的导航浮動按钮

    本篇教程使用Swift 源碼:https://github.com/jamesdouble/JDJellyButton ,以下稱JDJellyButton 0)何謂導航浮動按鈕 当你的应用开发到一定程 ...

  4. 【Vegas原创】“無法解析 equal to 動作的定序衝突”错误的处理

    错误:無法解析 equal to 動作的定序衝突. COLLATE Chinese_Taiwan_Stroke_CI_AS 用法: select @EMP_ID=emp_id from am_empl ...

  5. tankwar java,TankWar 單機(JAVA版) 版本0.4~版本0.6 讓坦克動起來

    版本0.4的項目要求是讓坦克動起來 由於在版本0.6也是讓坦克聽從我們指揮  等會再寫 在這里主要是建立一個屏幕刷新線程  使屏幕達到時時刷新的效果 代碼如下: public class update ...

  6. LAMP 啟動 WWW 服務與測試 PHP 模組

    OK!最單純簡易的 WWW 伺服器設定搞定的差不多了,接下來就是要啟動啦!啟動的方法簡單到不行,用傳統的方式來處理: [root@www ~]# [root@www ~]# [root@www ~]# ...

  7. Oracle啟動模式關閉模式

    Oracle啟動數據庫 1.启动SQL*PLUS不与数据库连接    SQLPLUS /NOLOG 2.以SYSDBA角色与Oracle连接    CONNECT username/password ...

  8. groovy oracle数据库,使用Groovy /搖籃到用什麼驅動程序連接到Oracle數據庫

    compile 'org.postgresql:postgresql:9.3-1102-jdbc41' compile 'mysql:mysql-connector-java:5.1.31' comp ...

  9. php 判定pc端與移動端

    1.親測有效 2.上代買 //判斷移動端,pc端/*移动端判断*/public static function isMobile(){ // 如果有HTTP_X_WAP_PROFILE则一定是移动设备 ...

  10. 以非root 用戶安裝並啟動高級單服務器版

    WebSphere Application Server,高級單服務器4.0 版可以在Red Hat Linux 7.1 與SuSE Linux 7.1 上運行.根據您的發行版本(distributi ...

最新文章

  1. ajax校验的优点,django框架中ajax的使用及避开CSRF 验证的方式详解
  2. 电商库存设计mysql redis_基于redis实现的扣减库存
  3. Kotlin入门(3)基本变量类型的用法
  4. Chrome 跨域调试
  5. error: 'Can't connect to local MySQL server through socket '/data/3307/data/mysql.sock' (2)'
  6. VMWaer克隆centos后网络的问题解决
  7. 【递归,Java从入门到精通第五版pdf百度云
  8. 模块化存储区域网络(SAN)解决方案的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. 喜欢的抖音视频只能收藏,不能保存?一篇文章教会你使用Python下载抖音无水印视频
  10. 网易面试总结——面试案例9~面试案例12
  11. ipad pro + zotero + 坚果云 + PDF Expert 搭建多平台文献管理(自用备忘)
  12. ORACLE 仿照原表建表语法
  13. mysql8删除root用户,Window下如何恢复被删除的Mysql8.0.17 Root账户及密码
  14. 计算机组成原理简单模型机实验,CPU 与简单模型机设计实验
  15. 戴尔联手九大云计算伙伴成立云联盟:通吃混合云
  16. (转)操作系统实现多线程的几种模式
  17. win10+cuda10.0+pytorch安装
  18. android studio 引入vitamio,Android studio3.0导入vitamio结果报错,求大神看看问题怎么解决...
  19. css inherit(继承)和initial(初始值)
  20. bestcoder#86 T1~T3

热门文章

  1. win2008服务器维护费用,win2008 服务器安全检查步骤指引(日常维护说明)
  2. mybatis中association和collection的column传入多个参数值
  3. PHP使用http_build_query()构造URL字符串的方法(可将POST参数组转换拼接成GET请求链接)...
  4. 一次ajax请求返回状态为Cancled的记录
  5. [转载]虚拟机磁盘空间已满的发现和解决
  6. POJ 1003 Hangover
  7. 金蝶工业老单单据的相关表
  8. Kafka消息压缩与解压
  9. 一样入职的应届生工资不一样_为什么每月工资一样,但扣的个税不一样?
  10. python实现多表格合并_python 如何把两个表格数据,合并为一个呢?