在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载。在C#中我们也能使Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何卸载的方法。这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做。

这引发了一个问题,Assembly加载的DLL可能只在程序结束的时候才会被释放,这也意味着在程序运行期间无法更新被加载的DLL。而这个功能在某些程序设计时是非常必要的,考虑你正在反射机制写一个查看DLL中所有函数详细信息的程序,程序提供一个菜单让户可以选择DLL文件,这时就需要让程序能够卸载DLL,否则一旦户重新得到新版本DLL时,必须要重新启动程序,重新选择加载DLL文件,这样的设计是户无法忍受的。

C#也提供了实现动态卸载DLL的方法,通过AppDomain来实现。AppDomain是一个独立执行应程序的环境,当AppDomain被卸载的时候,在该环境中的所有资源也将被回收。关于AppDomain的详细资料参考MSDN。下面是使AppDomain实现动态卸载DLL的代码,

using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Reflection; namespace UnloadDll {     class Program     {         static void Main(string[] args)         {             string callingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName;             Console.WriteLine(callingDomainName);             AppDomain ad = AppDomain.CreateDomain("DLL Unload test");             ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe", "UnloadDll.ProxyObject");             obj.LoadAssembly();             obj.Invoke("TestDll.Class1", "Test", "It's a test");             AppDomain.Unload(ad);             obj = null;             Console.ReadLine();         }     }     class ProxyObject : MarshalByRefObject     {         Assembly assembly = null;         public void LoadAssembly()         {             assembly = Assembly.LoadFile(@"TestDLL.dll");                    }         public bool Invoke(string fullClassName, string methodName, params Object[] args)         {             if(assembly == null)                 return false;             Type tp = assembly.GetType(fullClassName);             if (tp == null)                 return false;             MethodInfo method = tp.GetMethod(methodName);             if (method == null)                 return false;             Object obj = Activator.CreateInstance(tp);             method.Invoke(obj, args);             return true;                    }     } }

注意:

1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。

2. 每个线程都有一个默认的AppDomain,可以通过Thread.GetDomain()来得到

转载:地址不详^_^

转载于:https://www.cnblogs.com/zzh1236/p/3289043.html

C#中动态加载和卸载DLL相关推荐

  1. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...

    原文:C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件. 当某个程序集文件被载入AppDomain,该文件在AppDomain.Unloa ...

  2. C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集...

    本博客中以"C#.Net 如何动态加载与卸载程序集(.dll或者.exe)"开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有 ...

  3. 在VC中动态加载ODBC的方法

    在VC中动态加载ODBC的方法     在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较 ...

  4. bpl文件java,在LoadLibrary中动态加载BPL失败

    我想在Delphi 10 Seattle(Update 1)或Delphi 10.1 Berlin项目(Enterprise版本)中动态加载BPL模块 . 但LoadPackage函数失败并显示消息( ...

  5. 在.Net framework中动态加载Assembly的loadFromRemoteSources配置

    简介 在插件类型的应用开发中,我们可能会在程序中动态加载一个assembly文件,创建其中的类对象并使用. 这时,就涉及到了CAS(code access security)和信任沙盒. 一般,我们的 ...

  6. Node.js项目中动态加载环境变量配置

    NODE_MODULES:项目中动态加载环境变量配置 开始 在平时的 Node.js 项目开发中,我们需要在项目中添加各种各样的配置:服务端口.服务地址.图片上传.数据库.Redis 等等. 通常情况 ...

  7. Java中动态加载字节码的方法 (持续补充)

    文章目录 Java中动态加载字节码的方法 1.利用 URLClassLoader 加载远程class文件 2.利用 ClassLoader#defineClass 直接加载字节码 2.1 类加载 - ...

  8. python requests 动态加载_Python获取网页中动态加载的数据

    Python获取网页中动态加载的数据 0.XHR 是什么? XHR是 XMLHttpRequest 对象.既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装. 1.查看异步加 ...

  9. C#中动态加载卸载类库

    网上现有很多的文章是介绍怎样开发插件化的框架的,大部分无非是用Assembly.load等方法,动态加载类库,但这种方法有个缺点,就是没有办法卸载,因为net中就没有提供卸载assembly的方法,还 ...

最新文章

  1. va_start和va_end使用详解
  2. Daily Scrum 11.5
  3. 94.cache 和虚拟存储器的功能不同
  4. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  5. 【英语天天读】I want I do I get
  6. 王莉:将开发文档英文化和本地化,我们努力让OpenHarmony走向全球
  7. Oracle 执行计划(explain plan for)
  8. 医学图像处理(三)ABIDE数据集下载
  9. 对于CRM之于现代化企业的影响以及作用的分析
  10. 域名投毒,DNS污染,域名欺骗,其实就是域名污染。
  11. 基于费马原理推导斯涅耳定律和广义斯涅耳定律
  12. 原创如何看机械硬盘SMART信息
  13. Markdown 更改字体颜色
  14. 欧氏距离与余弦距离的关系
  15. 看了数据分析师的摆摊神操作,网友:这才叫专业
  16. 大学生书店网页设计制作 简单静态在线书店HTML网页作品 小说书籍网页作业成品 学生期末作业网站模板
  17. 一个自学网络安全攻防的弱鸟简单描述下关于压力测试如何实现的
  18. H.265/HEVC学习之xCompressCU函数
  19. 美四千多宠物中毒死 中国承认两企业出口饲料含毒
  20. CLRS 9.1最小值和最大值

热门文章

  1. 让Windows 7揪出每一个暗中运行程序
  2. 读史以明志,把握好自己的明天
  3. 对程序错误的处理——Windows核心编程学习手札之一
  4. android中线程和进程
  5. Ubuntu 12.10下配置Web服务器详细教程
  6. 通过virtualbox最小化安装centos 6.3后无法上网解决办法
  7. js图片懒加载的第二种方式
  8. 实验23:测试泛型依赖注入★
  9. java paintComponent的一些解读
  10. RabbitMQ配置Mqtt协议