AppDomain加载与释放dll
我与很多人都在找这问题的答案。还好,我很幸运,没有进入很多人都进入的死胡同而漫长的讨论中。因为我找到了这篇文章
黄天不负有心人,终于全身而退,哈哈
文章说得很明白,我去掉其他设置,只使用以下代码时
AppDomain.CurrentDomain.SetShadowCopyFiles();
在文章发布的几天后,我在微软的MSDN上发现了这文章。似乎阐述得更为系统
http://www.microsoft.com/china/msdn/library/langtool/vcsharp/csharp05162002.mspx
在加载dll时有一个奇怪现象,以下代码会报错
object objBuild = pJobDomain.CreateInstanceAndUnwrap(strDllFilePath,strClassName);
说没找到dll或依赖的项,看报错提示的路径却是实实在在有这个dll的。
于是使用以下代码
System.Reflection.Assembly asm = pJobDomain.Load(str[1]);object objBuild = asm.CreateInstance(str[0]);if(objBuild==null)Mag.Windows.Interface.Log.AddErr("buildWorker","创建对象失败");elseiDo = (Mag.Windows.Interface.IDo)objBuild;
Unload后是可以重新编译dll的。
上面的代码还有一个问题,就是我UnLoad程序域后,重新编译dll,也看到dll成功更新了。应用程序域检测到配置被修改后,重新使用上面的代码载入dll,但程序结果并不是我期待的!!程序行为还是上面版本dll的。估计是使用了缓存的dll。尝试换用以下代码
System.Runtime.Remoting.ObjectHandle objHandle = pJobDomain.CreateInstanceFrom(strDllFilePath,strClassName);
object objBuild = objHandle.Unwrap();
问题解决。汗,我以为上面的代码可以用CreateInstanceAndUnwrap来代替。
设置SetShadowCopyFiles后,程序运行期间,程序文件是可以随意更新的,不过不会应用这些变化,除非重新启动程序。不过在我的项目中这个不是问题。因为主程序是极小去更新的,但相关的dll就需要不断的修正,并重新加载到程序域中。所以上文的提示已很足够了。以下是我的代码
//创建 AppDomainSetup 对象AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;setup.ShadowCopyDirectories = "true";//主程序很少更新,可以不设置,但考虑还要有可能,//设置后,更新完文件直接通知网管重启就可以了。不需要先关再上传文件,再通知开启这么麻烦AppDomain.CurrentDomain.SetShadowCopyFiles();//新域的 config 和本域公用一个。不使用默认的配置文件。// setup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;//安全级别相同System.Security.Policy.Evidence adevidence = AppDomain.CurrentDomain.Evidence;//创建新的辅程序域this.domainJob = AppDomain.CreateDomain("Mag.Web.MainSrv.Jobs",adevidence,setup);//辅程序域,dll都加载在这,更新频繁,这是一定要设置的。this.domainJob.SetShadowCopyFiles();
加载dll
private Mag.Windows.Interface.IDo buildWorker(System.AppDomain pJobDomain,string config){string [] str = config.Split(',');string strDllFilePath = string.Format("{0}{1}.dll",AppDomain.CurrentDomain.BaseDirectory,str[1]);string strClassName = str[0];if(!System.IO.File.Exists(strDllFilePath)){//throw new Exception("指定的文件不存在");Mag.Windows.Interface.Log.AddErr("buildWorker","指定的文件不存在" + strDllFilePath);return null;}Mag.Windows.Interface.IDo iDo=null;try{ //使用当前程序域加载
// System.Runtime.Remoting.ObjectHandle objHandle = Activator.CreateComInstanceFrom(strDllFilePath,strClassName);
// object objBuild = objHandle.Unwrap();//建立对像System.Runtime.Remoting.ObjectHandle objHandle = pJobDomain.CreateInstanceFrom(strDllFilePath,strClassName);object objBuild = objHandle.Unwrap();//会引起找到不dll或依赖的项的错误。
// object objBuild = pJobDomain.CreateInstanceAndUnwrap(strDllFilePath,strClassName);//会首先使用缓存中的dll
// System.Reflection.Assembly asm = pJobDomain.Load(str[1]);
// object objBuild = asm.CreateInstance(str[0]);if(objBuild==null)Mag.Windows.Interface.Log.AddErr("buildWorker","创建对象失败");elseiDo = (Mag.Windows.Interface.IDo)objBuild; }catch(Exception ee){// throw ee;Mag.Windows.Interface.Log.AddErr("buildWorker",ee);}return iDo;}
AppDomain加载与释放dll相关推荐
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集...
本博客中以"C#.Net 如何动态加载与卸载程序集(.dll或者.exe)"开头的都是引用莫问奴归处 微软装配车的大门似乎只为货物装载敞开大门,却将卸载工人拒之门外.车门的钥匙只有 ...
- C#中动态加载和卸载DLL
在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...
- 通过应用程序域AppDomain加载和卸载程序集之后,如何再返回原来的主程序域
实现目的:动态加载dll,执行完毕之后可以随时卸载掉,并可以替换这些dll,以在运行中更新dll中的类. 其实就是通过应用程序域AppDomain加载和卸载程序集. 在这方面微软有篇文章http:// ...
- C++ windows已在xxx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug。
windows已在xxx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug. 原因也可能是用户在xx.exe具有焦点时按下了F12. 输出窗口可能提 ...
- 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug
1.代码如下: string src ="abcdabcd"; char* dst = new char[8]; strcpy(dst,src.c_str()); delete[] ...
- 可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug
今天遇到一个很奇怪的问题, 当代码如下时: char* s = (char*)malloc(20*sizeof(char)); string buffer; const char* conchar; ...
- 无法加载登录用户界面DLL MyGina.dll 解决
有一台机器负责24小时摄录的,出了问题如下: 无法加载登录用户界面DLL c:\WINDOWS\system32\logUser.dll请与系统管理员联系,以替换DLL文件或还原原DLL" ...
- 启动outlook时报错:mapi无法加载信息服务msncon.dll
今天这个Office2010 outlook搞的让人蛋疼,老是说启动outlook时报错:mapi无法加载信息服务msncon.dll. 百度了一下,如下解决方案: 安装路径为D:\NEW Windo ...
- C++加载lib和dll的方法
C++加载lib的方法: 方法1.直接添加lib项目的引用 方法2.在属性-连接器-输入-里添加要使用的lib,在连接器-常规-附加库目录添加lib的目录 C++加载dll的方法(参考网址https: ...
最新文章
- 百度面试题:生产者 消费者问题
- AES和TKIP的区别
- linux migrations病毒守付进程分析
- C#-文件只读时进行拷贝或删除报错, 对路径不允许访问
- Android如何在测试程序中删除被测应用私有的原始数据
- (03)Verilog HDL模块例化
- node.val java_LeetCode——21. 合并两个有序链表(Java)
- UtIL DBUtil
- 转帖: 如何备份和恢复BIG-IP V9.0
- Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据
- [ECCV2022]3D face reconstruction with dense landmarks
- 酒水知识(六大基酒之白兰地_Brandy)
- ArcGIS JS API实现地图场景视频融合
- 【论文翻译】联合学习对齐和翻译的神经机器翻译
- 费纸箱手工制作机器人_如何DIY用纸盒制作机器人方法图解
- matlab抓取网页信息,如何利用Matlab抓取网页数据
- 计算机网络连接显示678是什么意思,宽带连接错误678,教您宽带连接出现错误提示代码678怎么解决...
- 增压撬启停控制优化及纳入GE UCP控制系统可行性研究
- 激光雷达和3D点云算法
- 人以善感,天以福应,人以恶感,天以灾应,原来天就是自己的镜子呀!
热门文章
- QtCreator+Arm开发和联机调试
- bond网卡模式设置
- 预制发票付款到期日取值
- vbs脚本实现在聊天窗口连续发送信息
- 网路游侠:稳捷网络BeSecure WEB安全网关试用
- 软考高级 系统分析—论文理论知识
- java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看...
- 基于WEB的办公自动化管理系统的设计与实现
- 玫琳凯宣布可持续发展战略:美力永续 提出2030年全球目标
- java之yield(),sleep(),wait()区别详解-备忘笔记[转]