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

当某个程序集文件被载入AppDomain,该文件在AppDomain.Unload之前是不能被替换和删除的。
使用AppDomainSetup的影像复制功能可以实现在不卸载程序的情况下替换或者删除程序集文件。

AppDomain domain = AppDomain.CreateDomain("a");
domain.ExecuteAssembly(@"loads\test.exe");
File.Delete(@"loads\test.exe");

上述代码没有在删除文件前调用 AppDomain.Unload(domain); ,所以会出现"拒绝访问"的异常。
接下来我们打开影像复制功能,你会发现目标程序集文件被正确删除。

AppDomain domain = AppDomain.CreateDomain("a");

// 打开影像复制。
domain.SetShadowCopyFiles();
// 设置要进行影像设置的程序集路经。
domain.SetShadowCopyPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "loads"));

domain.ExecuteAssembly(@"loads\test.exe");
File.Delete(@"loads\test.exe");

我们在"loads\test.exe"中使用"Assembly.GetExecutingAssembly().Location"查看,你会发现程序集文件被复制到"c:\documents and settings\user1\local settings\application data\assembly\dl2\6e9nkvqy.yol\dhp83obd.j9j\9730b8d1\00fb5179_6d04c601\test.exe"这样一个目录中,这也是程序集被正确删除的根本原因(^_^)。正因为目标程序集的位置发生变化,因此我们要做更进一步的设置,否则目标程序集在加载动态引用或者读取配置文件时出错。

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "loads");
setup.ConfigurationFile = Path.Combine(setup.ApplicationBase, "test.exe.config");
setup.ShadowCopyFiles = "true";
setup.ShadowCopyDirectories = setup.ApplicationBase;

AppDomain domain = AppDomain.CreateDomain("a", null, setup);
domain.ExecuteAssembly(@"loads\test.exe");

File.Delete(@"loads\test.exe");

ok, 这回没问题了。

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

  1. spi 动态加载、卸载_理解 ServiceLoader类与SPI机制

    对于Java中的Service类和SPI机制的透彻理解,也算是对Java类加载模型的掌握的不错的一个反映. 了解一个不太熟悉的类,那么从使用案例出发,读懂源代码以及代码内部执行逻辑是一个不错的学习方式 ...

  2. 【Android 逆向】类加载器 ClassLoader ( 使用 DexClassLoader 动态加载字节码文件 | 拷贝 DEX 文件到内置存储 | 加载并执行 DEX 字节码文件 )

    文章目录 一.拷贝 Assets 目录下的 classes.dex 字节码文件到内置存储区 二.加载 DEX 文件并执行其中的方法 三.MainActivity 及执行结果 四.博客资源 一.拷贝 A ...

  3. J版 OpenStack动态加载菜单图片详解

    首先,需要了解OpenStack Horizon动态加载.注册dashboard.PanelGroup.Panel的原理流程 一.这里大致说下与加载左侧菜单相关的几个文件 1. /usr/lib/py ...

  4. iphone开发中使用动态库(dylib)和动态加载framework (获取iphone的IMSI和设置飞行模式)

    在iphone上使用动态库的多为dylib文件,这些文件使用标准的dlopen方式来使用是可以的.那相同的在使用framework文件也可以当做动态库的方式来动态加载,这样就可以比较自由的使用appl ...

  5. Flask+jQuery:AJAX技术动态加载网页

    hello,大家好,我是wangzirui32,今天我们来学习如何使用jQuery实现AJAX动态加载网页. 学习目录 1. 准备工作 1.1 搭建测试网站 1.2 数据文件 1.3 网页模板 1.4 ...

  6. JavaScript网页实例:在网页里动态加载JavaScript

    把一些逻辑独立的JavaScript脚本文件单独加载,是一种常见的JavaScript动态加载技术.这样做的好处有很多,比如可以减少不必要的JavaScript脚本文件的加载,以提高网页浏览速度. 补 ...

  7. Android一键生成包含.dex的Jar及动态加载方案

    Android一键生成包含.dex的Jar及动态加载方案 背景:谈到动态加载相信很多小伙伴都会想到 热更新 及 动态加载dex 的技术,最近也因为项目重构的需求,折腾了下这方面的技术点,以前研究过但时 ...

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

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

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

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

最新文章

  1. 接口入参形式_某小公司RESTful、共用接口、前后端分离、接口约定的实践
  2. SAP MM 供应商Rebate中的财务配置
  3. 每日一道面试题(第7期)---Android补间动画与属性动画的区别
  4. mysql算法优化原则_Mysql优化原则_小表驱动大表IN和EXISTS的合理利用
  5. linux修改mac ethtool,ethtool命令
  6. 下列叙述正确的是( )
  7. 使用的postman心得
  8. 一个网络资深者发起的思考
  9. 分析一段H264视频数据
  10. matlab非同秩矩阵相乘_线性代数精华——讲透矩阵的初等变换与矩阵的秩
  11. F问题3-7:以太网使用载波监听多点接入碰撞检测协议CSMA/CD。频分复用FDM才使用载波。以太网有没有使用频分复用?...
  12. 实现QQ代理上网 如何写?
  13. Android触控屏幕Gesture(GestureDetector和SimpleOnGestureListener的使用教程) 分类:Androidandroid实例...
  14. 安卓开发笔记——探索EventBus(转)
  15. matlab数据栅格化,新手求卫星降水数据CMORPH_V1.0数据完整处理方法,有matlab打开的代码但是不会处理...
  16. 2022高压电工考试试题及在线模拟考试
  17. iOS设备使用Airplayer投屏
  18. mantis apache mysql_Windows上基于Apache+Mysql+PHP安装集成Mantis+Testlink
  19. 技术前沿与经典文章20:历史上54位伟大物理学家、科学家的专属LOGO(六)
  20. 第 5 章 数据结构

热门文章

  1. 正确使用stl vecotr erase函数
  2. 莫德友_去哪儿酒店交易系统架构实践
  3. SendDlgItemMessage
  4. 完整恢复模式下的备份/恢复
  5. redis详解(四)-- 高可用分布式集群
  6. Oracle提示已连接到空闲的实例
  7. 父窗口控制弹出窗口快捷键ctrl+c关闭
  8. 用树莓派从0开始打造属于自己的服务器
  9. 【转载】浅谈缺陷截图处理
  10. 浅谈Javascript中的void操作符