What's Shadow Copying?

我们安装一个应用程序并启动后,我们是无法更新应用程序安装目录中程序集文件的。如果强制替换会提示文件正在使用,如下图所示。

那你可能会问,为什么会无法更新呢?

因为启动应用程序时,CLR会首先创建应用程序域,然后在应用程序域中加载程序集并将其锁定。因此在卸载程序集之前是无法更新文件的。而卸载程序集的唯一办法就是卸载加载程序集的应用程序域。

到这里,你可能会好奇,为什么在开发ASP.NET网站时,我们却可以持续编译项目,而不会报这个提示呢?毕竟我们是从编译目录起的站点啊,而且我们每次编译会更新程序集的啊?!!!

这个疑问的答案就是我们本文的主题——Shadow Copying(卷影复制)。

Shadow copying enables assemblies that are used in an application domain to be updated without unloading the application domain. This is particularly useful for applications that must be available continuously, such as ASP.NET sites.

卷影复制机制允许我们更新正在被应用程序域中使用的程序集而不需要卸载应用程序域。这个机制对必须保持持续可用的应用程序来说特别有用,比如ASP.NET网站开发。

ASP.NET使用了卷影复制这种技术,允许资源保持连续可用,而不会干扰AppDomain中的代码执行。

在ASP.NET应用程序启动时,它会将应用程序路径中的程序集文件复制到另外一个路径,然后从另外一个路径加载程序集并锁定。这样原来路径的程序集文件就不会锁定,从而可以更新。

Where the file copied to?

Shadow Cope的文件存储在C盘的Temporary ASP.NET Files目录,可能在C:\Users\{UserName}\AppData\Local\Temp下,也可能在C:\Windows\Microsoft.NET\Framework下。找不到可以网上下载search everything工具搜索。

Which files are shadow copied?

默认来说,应用程序目录及其子目录中的程序集会被Shadow Copy。但位于GAC(全局应用程序集缓存)中的程序集不会被复制。

The disadvantage of Shadow Copying

当ASP.NET 应用程序有很多资源和程序集时,它的启动将会耗时很长,而这也正是由于Shadow Copying导致的。

Disabling shadow copying

即然Shadow Copying会导致大体量的ASP.NET应用启动很慢,那有没有办法改进呢?

第一种就是关闭Shadow Copying:将<hostingEnvironment shadowCopyBinAsmblies ="false"/>配置节点添加到Web.Config文件下的System.Web下即可。

第二种就是手动指定CLR的应用程序基础子目录,以便在加载程序集时进行搜索:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Bin;Bin\TestPlugIn" />
</assemblyBinding>

probing节点下的privatePath中指定的子目录是不会进行Shadow Copying的。

Reference

What is the “Temporary ASP.NET Files” folder for?

Shadow Copying Assemblies

重温.NET下Assembly的加载过程

ASP.NET, APPDOMAINS, AND SHADOW-COPYING

Shadow Copying导致ASP.NET应用启动很慢的解决办法的更多相关文章

  1. linux下tomcat启动很慢的解决办法

    1.用vim编辑器打开tomcat的bin目录下的catalina.sh [root@iz09a32x1sghz3z bin]# vi /usr/local/src/java/tomcats/tomc ...

  2. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  3. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  4. dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法

    dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...

  5. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  6. WIN8.1的安装和打开"这台电脑"速度很慢的解决办法

    WIN8.1的安装和打开"这台电脑"速度很慢的解决办法 对于非服务器用的电脑,如果电脑的内存在2G或更高,首推的操作系统是 WINDOWS8.1 64位企业版,用了就知道,没有比这流畅懂事的操作系统. ...

  7. 【转】android中重复连接ble设备导致的连接后直接返回STATE_DISCONNECTED的解决办法---不错不错,重新连接需要花费很长的时间

    原文网址:http://bbs.eeworld.com.cn/thread-438571-1-1.html /*                         * 通过使用if(gatt==null ...

  8. Tomcat几种启动报错及解决办法

    今天真跪了,tomcat的错想到想不到的都遇到了.不记录一下都愧对今天愁掉的hair 在此之前分享一个集错网站,应该是程序员必备的网站之一,不过纯英文,小酸爽 Tags - Stack Overflo ...

  9. zynq中uboot的qspi启动报错及解决办法

    问题描述: 用u-boot-xlnx-v2016.3版本编译的uboot通过qspi flash启动出现如下错误: 尝试在uboot命令行输入"sf probe 0 0 0"挂载q ...

随机推荐

  1. hibernate-第二章-关系映射

    一,持久化类 持久化类就是之前写过的实体类 持久化类必须符合javabean规范,属性必须有set和get方法; 持久化类的属性类型可以是8种基本类型或对应的包装类,通常定义包装类型,因为包装类型可以 ...

  2. Docker commit 命令保存的镜像文件太大的问题

    基础镜像: centos7.5 进入容器后, 先后安装了 jdk1.8, maven3.6.0, git, rocketmq4.3.2 安装完成后使用 docker commit 命令保存为镜像 结果 ...

  3. .net基础学java系列(二)IDE

    上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net ...

  4. 重磅推出:AutoProject Studio 自动化项目生成器

    AutoProject Studio 自动化项目生成器 核心架构图 AutoProject Studio 自动化项目生成器是一款基于C#.Net Framework 4.0为平台自主研发.专为软件设计 ...

  5. oracle中nvarchar2查询结果显示总是少一位

    问题: 有个表的字段是nvarchar2(32),但是在plsql中查询显示结果发现一直少一位. 修改方法: 在plsql里的首选项-连接里有个选项: 在oci8上强制使用oci7, 把这个勾上就ok ...

  6. 咸鱼入门到放弃12--Filter(过滤器)*

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  7. 手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----Softmax回归模型 # regression import os import tensorflow as tf from tensorflow.examples.tut ...

  8. [转]webpack中require和import的区别

    webpack中可以写commonjs格式的require同步语法,可以写AMD格式的require回调语法,还有一个require.ensure,以及webpack自己定义的require.incl ...

  9. JAVA基础复习与总结<七> File类_基本的IO概念_输入输出

    File类 1.操作目录  mkdir() 创建目录,必须确保父目录存在,如果不存在,创建失败 mkdirs() list() 文件:目录字符串形式 ,只返回目录和文件的名称 listFiles()  ...

  10. 阿里云服务器 yii2执行composer提示报错

    未解决 composer installLoading composer repositories with package informationUpdating dependencies (inc ...