在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载。在C#中我们也能使用Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何卸载的方法。这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做。
当AppDomain被卸载的时候,在该环境中的所有资源也将被回收。关于AppDomain的详细资料参考MSDN。下面是使用AppDomain实现动态卸载DLL的代码,
当AppDomain被卸载的时候,在该环境中的所有资源也将被回收。关于AppDomain的详细资料参考MSDN。下面是使用AppDomain实现动态卸载DLL的代码,
namespace MyDemo.Context { class UnloadDll { 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(@"MyDemo.exe", "MyDemo.Context.ProxyObject"); obj.LoadAssembly(); obj.Invoke("Model.Person", "GetByID", 100); AppDomain.Unload(ad); obj = null; Console.ReadLine(); } } class ProxyObject : MarshalByRefObject { Assembly assembly = null; public void LoadAssembly() { string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Model.dll"); assembly = Assembly.LoadFile(file); } 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; } } }
发表评论
-
C# 实现将文件夹分卷压缩
2015-04-17 17:01 1132http://bbs.csdn.net/topics/3907 ... -
C#发送邮件
2015-04-17 15:58 643public class SendEmailHelper ... -
C# xml文件读取
2015-02-11 16:08 576看附件................ -
什么时候该用委托,为什么要用委托,委托有什么好处....
2015-01-29 16:56 783http://www.cnblogs.com/superpce ... -
转:c#常用的18种设计模式
2015-01-21 08:16 718http://blog.jobbole.com/78130/ -
C#委托的介绍(delegate、Action、Func、predicate)
2015-01-09 17:26 1051http://www.cnblogs.com/akwwl/p/ ... -
接口和抽象类有什么区别 .
2014-12-22 16:35 584接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么 ... -
C#一个简单写日志文件的类
2014-12-11 09:57 1066/// <summary> /// L ... -
Linq初级班 Linq to DataSet体验(单表、多表联合查询JOIN语法)
2014-12-10 14:34 326http://www.cnblogs.com/huangcon ... -
C#泛型详解
2014-11-29 11:31 441我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处 ... -
线程同步与异步的区别
2014-11-26 09:12 839异步处理就是按照不同步的程序处理问题。异步处理与同步处理是对立 ... -
应用C#和SQLCLR编写SQL Server用户定义函数 .
2013-10-09 17:07 445http://blog.csdn.net/zhzuo/arti ... -
log4Net简介
2013-06-30 11:32 537使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中 ... -
DataGridView历史记录的前进与后退操作
2013-06-23 11:13 1073此功能介绍:DataGridView频繁查询数据时,可以将每次 ... -
c# 对INI配置文件的读取操作
2013-06-17 10:51 647此种方法只对如下格式的INI文件起作用 server=loca ... -
对DataGridView控件的扩展开发
2013-06-15 21:47 2327首先在项目中引用 ... -
对集合控件(ListBox,ComboBox,TreeView,RichTextBox,DataGridView)的查找、替换操作控件
2013-06-15 09:39 1520一、程序入口: using System; using ... -
C#对文件、文件夹操作公用组件
2013-06-11 09:46 931namespace HR.Class.IO { / ... -
TreeView控件操作开发篇之(五)
2013-06-09 00:09 784#region 加载文件夹及文件到树 ... -
TreeView控件操作开发篇之(五)
2013-06-08 23:14 2#region "查找遍历树节点" ...
相关推荐
如题如题如题如题如题如题如题如题如题如题如题如题
c#中通过反射可以方便的动态加载dll程序集,但是如果你需要对dll进行更新,却发现.net类库没有提供卸载dll程序集的方法。在.net 中,加入了应用程序域的概念,应用程序域是可以卸载的。也就是说,如果需要对动态加载...
反射的加载与卸载,适用于需要经常变换更新的地方。 代码里文件路径是编译的路径(需要替换为自己的存放路径),我是将DLL拷贝到EXE文件夹下测试的,在没有卸载完,拷贝覆盖不了,卸载后就可以覆盖了。
c# 实现动态加载c++ dll 动态库 本示例提供动态加载 卸载c++ dll动态库 所用工具 : visual studio ; 系统:Windows
利用AppDomain实现对DLL的动态加载和卸载。
wince5.0 c#控件源码,注册表操作(创建加载卸载dll驱动)。
目前对于 Assembly, CLR 没有提供卸载 Assembly 的方法。而 Assembly 是 驻留在 Appdomain 中,Appdomain 是可以动态卸载和创建的。
在需要安装的项目文件中添加WindowsService项目的引用,在程序集中获取Service.exe的路径,使用 AssemblyInstaller类对service进行安装。在安装时,使用ServiceController判定服务是否存在,如果已存在该service,则...
可以存储为嵌入式资源,或存储为任意字节数组,并根据需要动态加载和卸载。 你为什么想做这个? 嗯,.NET 很强大,但它永远不会像编译后的 C 代码那样快。 但是包装的非托管的C DLL与您的托管C#/ VB / F#DLL常常是...
访问这个 DLL ,这样就可以实现驱动程序的动态加载以及动态启动服务和停止服务等等操作了。 而在下面呢,我也算是对以前写的那个 DLL 做一个总结,将其总结为一个 C# 类,这样以后用起来会更加方便。 整个的类,我...
但是当c#的开发者在享受c#开发便利的时候,又发现了一个严重的缺陷,那就是修改了代码想重新调试时不得不重启AutoCAD,因为.net的机制限制了c#编译的dll只能加载到进程而无法从进程卸载。为此小弟利用从内存加载的...
18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
106 <br>0175 如何检索指定条件数组中的元素 107 <br>0176 如何动态改变数组长度 108 <br>0177 如何反转数组中元素的顺序 108 <br>0178 如何排序数组中的元素的顺序 109 <br>0179 如何创建...
使用时,确保所有库和皮肤(SkinH_Net.dll, SkinH_CS.dll, skinh.she)和程序在同一目录中。 您可以在任意代码段定义SkinSharp对象并调用接口,但调用时必须保证SkinSharp对象为全局对象,推荐在程序加载时进行...
还记得Java applet和Microsoft Silverlight吗,我们必须在浏览器中安装插件来运行Java和C#代码,但是WebAssembly提供了基本标准,现在我们不需要任何插件,他的二进制格式以.wasm文件表示,能够提供接近本机的性能...
C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP.NET - 第一部分 XHTML介绍 在ASP.NET页面中推荐使用覆写(Override)而不是事件处理(Event Handler) 常用编码工具类,支持base...
Visual Assist X v10.0.1233.0 破i解版(Cracked) Visual.Assist.X是一款非常好的Visual Studio .NET 2003、2002插件,支持C/C++、C#、ASP、Visual Basic、Java和HTML等语言,也支持VC++6、VC++5,能自动识别各种...
在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET中最重要的概念---网页代码模型。 4.1 ASP.NET的网页代码模型 在ASP.NET应用程序开发...