C# 写一个动态加载DLL的程序 怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 写一个动态加载DLL的程序 怎么写?相关的知识,希望对你有一定的参考价值。

C#写一个动态加载C#编程的DLL 类库 实现那种即插即用的插件功能??求一份类似的DEMO 包含主程序 和 DLL 源码.......求高手给传一个~~~~~

我准备给你演示一下,

步骤如下:

    我发一个exe和一个dll给你

    你新建一个类库项目,引用我的dll,任意写个方法实现dll里面的接口,然后编译生成新的dll

    这两个dll都与exe放在一个目录,然后你运行exe,就看到你编写的代码再exe里面运行,

    你新建的那个dll就是我那个exe的插件。

如果你真的想尝试一下就留联系吧!

追问

我要的EXE 和 DLL 的源码DEMO 需要知道怎么实现的,百度可以上传附件的吧

追答

还是留联系吧,如果你能直接看懂的话,就不会在这里问问题了。

追问

137269933 +Q

追答

加了,不过才看到,还在么?

参考技术A 实现原理用反射,发个简单源码给你
System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile("c://TestMyFile.dll");//加成程序集
//创建类实例
object obj = assembly.CreateInstance("TestMyFile.MyClass");//创建类MyClass的实例

obj.GetType().GetMethods();//获取所有方法

obj.GetType().GetProperties();//获取所有属性

TestMyFile.dll的代码

namespace TestMyFile

public class MyClass

private string _myname;
public string MyName

get return _myname;
set _myname = value;


public string GetName()

return MyName;




你还可以自己定义一个接口,然后让动态DLL实现这个接口,这样就更简单追问

能否把代码稍微具体一点

我通过 GetMethod 获取到了 GetName() 这个方法 那么怎么执行呢?
我通过 GetProperty 获取到了 MyName 怎么获取到他的值呢?

参考技术B 直接添加引用就行了追问

..................我说我是程序外的功能操作...不是编程过程中...

追答

那要用接口反射啊,是不是这种啊 我举个例子啊,用户要用sql数据或者是acces数据,但是我不知道用户要用那种,我就两种都写,分别在两个dll中,然后编译,之后如果用户想用哪种数据库了,我就改下配置文件就行了,是不是想要这种效果啊

追问

看二楼代码 就是我要的结果 只是还有一些问题

追答

二楼的答案就是这样的饿,什么问题啊,

C#动态加载dll 时程序集的卸载问题

程序是个客户端控制台程序,因为部署在多台电脑上,所以是通过服务端通知客户端更新dll
客户端有多个线程同时调用一个dll里面的方法
var apdomain = AppDomain.CreateDomain(“test.dll”)
我为每个dll创建了一个程序池,并加入缓存,设置缓存时间为5分钟,绑定Cache 的OnRemoveCallback 事件,当这个程序集的缓存失效后,会掉用OnRemoveCallback 释放这个程序集 AppDomain.Unload(apdomain),然后再去服务端比对dll版本,有更新是把dll下载下来替换,

现在的问题就是当这个dll的程序集的缓存失效了,但是另一个线程还在执行这个dll里面的一个方法,还没执行完,这时候调用AppDomain.Unload(apdomain) 虽然没提示异常,但是这个时候那个dll还是被占用的,没发替换
问下各位有没有遇到过这样的问题,你们是怎么解决的呢

参考技术A 你提到,当卸载域的时候“另一个线程还在执行这个dll里面的方法”,那么这个方法的调用方应该在计划卸载的域之外,这样:通过反射方法运行的代码在执行的域中(即主程序的域),这种情况下在执行域中同样加载了目标程序集(因此文件被占用),与要卸载的域无关。

如果目标程序集是可执行程序,则可以令新建的域执行该代码,此时,在代码执行中突然卸载域,会从执行线程上引发AppDomainUnloadException异常。

跨应用程序域访问不是一种好的设计思路。本回答被提问者和网友采纳
参考技术B 暂时还没有遇到过这种奇葩问题

以上是关于C# 写一个动态加载DLL的程序 怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

C# 动态加载dll插件并执行

Delphi简单调用DLL

C#动态加载dll 时程序集的卸载问题

在 C# 中动态加载和使用 DLL

C# 动态加载程序集dll (实现接口)

C#中动态加载和卸载DLL