c#动态加载dll并调用dll中类的方法

当然,这里指的是托管的dll与托管的方法,实际上用到的东西大部分是在反射(reflecting)命名空间里头的。
用途或许广泛吧,我不是很确信,但这个是在运行期绑定的,那么就不会有编译期绑定那么僵硬……但也没有编译期绑定那么简单。
可以用于做插件之类的。
先是一个接口,实现了这个接口的类被认为是合法的,可以被载入的……

?
1
2
3
4
5
6
7
8
9
namespace gp
{
    public delegate void DoWhat();
    public interface IInterface
    {
        string GetName();
        DoWhat dowhat { get; set; }
    }
}

很简单的接口,一个是用于判断做什么的函数,另外一个,则是一个方法的委托,做什么。
然后,我们新建一个项目,弄个类实现这个接口:

?
1
2
3
4
5
6
7
8
9
namespace gp
{
    public delegate void DoWhat();
    public interface IInterface
    {
        string GetName();
        DoWhat dowhat { get; set; }
    }
}

在构造函数里头将委托加了一个项,当执行那个委托的时候就会执行这个函数。
现在是重要的一个部分,代码难度不大~~
新建一个windows application,然后在窗体上头拖一个panel,这个是为了动态加载后将操作按钮放上去的。。不过可能会重叠,建议考虑用flowlayoutpanel,这个会自动重排以满足个数,anyway,无所谓,反正是为了阐述概念。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void Form1_Load(object sender, EventArgs e)
{
    var plugindir = System.IO.Directory.GetParent(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).CreateSubdirectory("startup");
    foreach (var filesInPlugin in plugindir.GetFiles())
    {
        if (filesInPlugin.Extension.ToLower() == ".dll")
        {
            Assembly dllFromPlugin = Assembly.LoadFile(filesInPlugin.FullName);
            foreach (var dllModule in dllFromPlugin.GetLoadedModules())
            {
                foreach (var typeDefinedInModule in dllModule.GetTypes())
                {
                    if (typeDefinedInModule.GetInterfaces().Contains(typeof(gp.IInterface)))
                    {
                        if (typeDefinedInModule.IsClass)
                        {
                            var itemGet = System.Activator.CreateInstance(typeDefinedInModule) as gp.IInterface;
                            LinkLabel ll_now = new LinkLabel();
                            ll_now.Text = itemGet.GetName();
                            ll_now.Click += (a, b) => { if (itemGet.dowhat != null)itemGet.dowhat(); };
                            panel1.Controls.Add(ll_now);
                        }
                    }
                }
            }
        }
    }
}

一个不难看懂的代码,先是指定插件文件夹的位置,要是没有就创建一个。然后遍历里头为dll类型的文件,再试图转载这个文件——实际情况下,这里需要加 try...catch,因为谁也不知道你加载的dll文件倒是是不是合法的dll文件,然后遍历里头的模块,再遍历模块里头的定义的类型——可能是类、 interface、枚举等等等等,很多很多,取得这个玩意儿的集成的interface,再判断是不是包含我们的interface。(也就是说,包含了这个interface就算是合法的插件类)
如果包含了的话,判断这是不是一个类,因为接口也可以在其他的东西里头被继承,比如另一个接口等等,而其他这些情况对我们来说毫无意义。
然后,我们动态创建这个类的实例—— System.Activator.CreateInstance,并且进行转换,转换为继承的接口,现在开始就是强类型操作了。我这里做的操作是生成一个linklabel,并且设置名称和按下执行的方法。。。大概就是这样,以上。

分类: C#
好文要顶 关注我 收藏该文联系我

荣耀属于跪拜猫
关注 - 2
粉丝 - 1

+加关注

1
0
(请您对文章做出评价)

« 上一篇:Visual C++ 嵌入汇编代码
» 下一篇:通过C++/CLI使用FFMPEG库进行视频解码[初步]

c#动态加载dll并调用dll中类的方法相关推荐

  1. Asp.net2.0动态加载用户控件的三种方法

    方法一: 直接拖放的用户控件 <!--这是某个aspx页--> ..... <%@ Register Src="TestControl.ascx" TagName ...

  2. js动态加载css文件和js文件的方法

    今天研究了下js动态加载js文件和css文件的方法. 网上发现一个动态加载的方法.摘抄下来,方便自己以后使用 [code lang="html"] <html xmlns=& ...

  3. php动态加载js,动态加载script文件的两种方法_javascript技巧

    动态加载script到页面大约有俩方法 第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval()执行代码.第二种是,动态创建一个script标签,设置其s ...

  4. php 动态加载JavaScript文件或者css文件

    1. 动态加载JS文件 第一种方法: test.php <script language="JavaScript" src="test6.php?str=i lov ...

  5. 动态加载JavaScript文件

    目录 配置 无脑方法! 逆袭之道! 一块蛋糕! 结论 源代码 JavaScript文件的动态加载是您必须拥有的非常有用的工具之一.它允许您通过将阻止脚本从加载过程中移出(通常称为"延迟加载& ...

  6. [转]动态加载javascript

    动态加载script到页面大约有俩方法 第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval()执行代码. 第二种是,动态创建一个script标签,设置其 ...

  7. 解决URL存在特殊符号、异步线程池配置、动态加载lib下所有jar包

    一.解决URL存在特殊符号|{}?&.URL中包含%2F.URL中包含%5C import lombok.extern.slf4j.Slf4j; import org.springframew ...

  8. Java利用反射动态加载类实战

    package com.web.common.utility.reflector; import java.io.Serializable; import java.lang.reflect.Cons ...

  9. VB6.0动态加载ActiveX控件漫谈[转]

    [转帖]VB6.0动态加载ActiveX控件漫谈http://www.7880.com/Info/Article-4b559560.html 熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控 ...

  10. python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

最新文章

  1. android 日历下面备注,怎样在日历的下面加备注?
  2. jQuery中的DatePicker今天按钮不起作用
  3. 服务器电源can协议,硬件接口协议之“CAN总线EMC设计”
  4. 计算图片的宽和高 动态设置图片的位置
  5. 计算机键盘换挡键,电脑键盘上的换挡键是哪个
  6. 『007』MySQL
  7. 一致性哈希(hash)算法
  8. 网络流(最大流)基础入门
  9. vscode latex 英文语法拼写检查
  10. 获取实时股票行情通达信接口
  11. prince2 成功的项目管理_PRINCE2项目管理方法论
  12. arccatalog点要素显示不完_改变人际关系核心要素,不讨好不献媚,牢记这3点,受益一生...
  13. erdas几何校正_ERDAS遥感图像的几何校正.docx
  14. 菏泽话务员机器人方案_AI人工智能语音系统电话机器人
  15. 【数据分析】京东订单数据分析思路及Python代码
  16. 反向代理服务器nginx
  17. 蓝牙遥控小车2.0版发布啦
  18. 9、验签失败可能的原因有哪些?
  19. 一直被模仿从未被超越的AWS为什么这么强?
  20. JS判断字符串中的内容是否为纯数字

热门文章

  1. 戴尔服务器物理关机,戴尔服务器的远程开机和关机
  2. 快去抢票!今天开始!2020元旦春节火车票购票日程攻略来了
  3. 2021-11-01 讲题题解
  4. 谷歌分析数据导入4种方式
  5. html语言中标记h1代表什么意思,html中h1是什么意思
  6. 新浪微博热门话题 (30 分)
  7. Jenkins分布式集群设计方案
  8. AJA电源维修DCX750sairem射频发生器维修
  9. 中层领导力:西点军校和哈佛大学共同讲授的领导力教程读书摘要
  10. java 实现pdf转换成图片