全局程序集缓存导致cs0006编译错误:找不到元数据文件错误

背景知识:

什么是全局程序集缓存

安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。

 

正文:

不知道大家有没有注意到在目录:c:\windows\assembly 目录下面的文件以这种方式显示:

 

粗略的一看也许大家会认为c:\windows\assembly文件夹下面的文件和一般的文件夹下面的文件没有什么区别,只是类型不同而已,其实不是这样的。

首先选择一个文件,右键单击出现的菜单项只有三个选项ViewUninstallProperty

很明显和普通的文件是不一样的,让我们看看c:\windows\assembly文件夹下面到底有什么文件吧,run à cmd 打开命令窗口à cd c:\windows\assembly à dir 我们看到了如下画面:

从上图可以看到实际上在c:\windows\assembly文件夹下面只有7个目录,没有文件,看来是资源管理器用另一种视图显示了该目录下面的文件,或者说资源管理器隐藏了事实。那么这个文件夹到底是做什么用的呢?

这个文件夹的用途正是本文最开始所说的概念……“全局程序集缓存”的缓存目录,里面放的是程序集的缓存。

 

相关技巧经验:

1. 如何卸载全局程序集缓存
如果想使用右键菜单中的Uninstall命令卸载程序集,通常会出现下面这个错误:


不能卸载程序集,因为它其他的应用程序需要它。

我们可以通过微软提供的工具 全局程序集缓存工具 (Gacutil.exe) 卸载程序集。

2. 如何向全局程序集中添加程序集
昨天我的经历,安装framework 3.0时失败了,当时没有在意,因为失败了安装回滚了,我觉得应该不会造成什么影响。但是当我运行Web应用程序时,却报错了,而且错误莫名其妙,大概得提示是:“error CS0006: 未能找到元数据文件 System.Web.Services.dll”,我查看了目录:C:\windows\Microsoft.NET\Framework\v2.0.50727System.Web.Services.dll安然无恙,后来还是经过一个同事的提示,发现c:\windows\assembly这个文件夹就是应用程序缓存中没有了System.Web.Services,可能是在安装framework3.0失败的时候导致应用程序缓存中的System.Web.Services程序集被卸载,而iis使用程序集的时候直接从全局程序集缓存中去取,结果取不到了,于是就报错:cs0006

解决方案是:将C:\windows\Microsoft.NET\Framework\v2.0.50727目录下面的System.Web.Services.dll文件拖到c:\windows\assembly文件夹中,这样全局程序集缓存中就有了System.Web.Services程序集,Web应用程序就可以正常执行了。

3. 如何将全局程序集缓存中的dll文件复制出来?

不可以在windows的资源管理器中复制了,我们可以通过dos命令复制

posted @ 2007-03-11 13:07  玉开  阅读(7238)  评论(1编辑  收藏  举报