我与很多人都在找这问题的答案。还好,我很幸运,没有进入很多人都进入的死胡同而漫长的讨论中。因为我找到了这篇文章

黄天不负有心人,终于全身而退,哈哈

文章说得很明白,我去掉其他设置,只使用以下代码时
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相关推荐

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

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

  2. C#中动态加载和卸载DLL

    在C++中加载和卸载DLL是一件很容易的事,LoadLibrary和FreeLibrary让你能够轻易的在程序中加载DLL,然后在任何地方卸载.在C#中我们也能使用Assembly.LoadFile实 ...

  3. 通过应用程序域AppDomain加载和卸载程序集之后,如何再返回原来的主程序域

    实现目的:动态加载dll,执行完毕之后可以随时卸载掉,并可以替换这些dll,以在运行中更新dll中的类. 其实就是通过应用程序域AppDomain加载和卸载程序集. 在这方面微软有篇文章http:// ...

  4. C++ windows已在xxx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug。

    windows已在xxx.exe中触发一个断点,其原因可能是堆被损坏,这说明xx.exe中或它所加载的任何DLL中有bug.  原因也可能是用户在xx.exe具有焦点时按下了F12.  输出窗口可能提 ...

  5. 其原因可能是堆被损坏,这也说明 xxx.exe 中或它所加载的任何 DLL 中有 bug

    1.代码如下: string src ="abcdabcd"; char* dst = new char[8]; strcpy(dst,src.c_str()); delete[] ...

  6. 可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug

    今天遇到一个很奇怪的问题, 当代码如下时: char* s = (char*)malloc(20*sizeof(char)); string buffer; const char* conchar; ...

  7. 无法加载登录用户界面DLL MyGina.dll 解决

    有一台机器负责24小时摄录的,出了问题如下: 无法加载登录用户界面DLL c:\WINDOWS\system32\logUser.dll请与系统管理员联系,以替换DLL文件或还原原DLL" ...

  8. 启动outlook时报错:mapi无法加载信息服务msncon.dll

    今天这个Office2010 outlook搞的让人蛋疼,老是说启动outlook时报错:mapi无法加载信息服务msncon.dll. 百度了一下,如下解决方案: 安装路径为D:\NEW Windo ...

  9. C++加载lib和dll的方法

    C++加载lib的方法: 方法1.直接添加lib项目的引用 方法2.在属性-连接器-输入-里添加要使用的lib,在连接器-常规-附加库目录添加lib的目录 C++加载dll的方法(参考网址https: ...

最新文章

  1. 百度面试题:生产者 消费者问题
  2. AES和TKIP的区别
  3. linux migrations病毒守付进程分析
  4. C#-文件只读时进行拷贝或删除报错, 对路径不允许访问
  5. Android如何在测试程序中删除被测应用私有的原始数据
  6. (03)Verilog HDL模块例化
  7. node.val java_LeetCode——21. 合并两个有序链表(Java)
  8. UtIL DBUtil
  9. 转帖: 如何备份和恢复BIG-IP V9.0
  10. Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据
  11. [ECCV2022]3D face reconstruction with dense landmarks
  12. 酒水知识(六大基酒之白兰地_Brandy)
  13. ArcGIS JS API实现地图场景视频融合
  14. 【论文翻译】联合学习对齐和翻译的神经机器翻译
  15. 费纸箱手工制作机器人_如何DIY用纸盒制作机器人方法图解
  16. matlab抓取网页信息,如何利用Matlab抓取网页数据
  17. 计算机网络连接显示678是什么意思,宽带连接错误678,教您宽带连接出现错误提示代码678怎么解决...
  18. 增压撬启停控制优化及纳入GE UCP控制系统可行性研究
  19. 激光雷达和3D点云算法
  20. 人以善感,天以福应,人以恶感,天以灾应,原来天就是自己的镜子呀!

热门文章

  1. QtCreator+Arm开发和联机调试
  2. bond网卡模式设置
  3. 预制发票付款到期日取值
  4. vbs脚本实现在聊天窗口连续发送信息
  5. 网路游侠:稳捷网络BeSecure WEB安全网关试用
  6. 软考高级 系统分析—论文理论知识
  7. java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看...
  8. 基于WEB的办公自动化管理系统的设计与实现
  9. 玫琳凯宣布可持续发展战略:美力永续 提出2030年全球目标
  10. java之yield(),sleep(),wait()区别详解-备忘笔记[转]