在Windows 7解决GAC错误

调试一网站源代码出现下面的错误


错误 1 Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. D:\3layerhotel\WebSite_hotel\UserRegist.aspx 5 
下面是解决过程:

先查找GAC的定义

GAC

GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。  
   
  关于GAC本身,上面redcaff_l所引述的一段话正是MSDN中对GAC的定义。GAC全称是Global   Assembly   Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。  
   
  除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:  
  1)创建一个strong-name的Assembly,例如ToolbarComponent.dll  
  2)运行gacutil   -i   ToolbarComponent.dll,把这个Assembly添加到GAC  
  3)在程序中动态装载:  
  System.Reflection.Assembly   ass=Assembly.Load("ToolbarComponent,   Version=1.0.934.20434,   Culture=neutral,   PublicKeyToken=65f45658c8d4927f");  
  MessageBox.Show("Is   the   assembly   loaded   from   GAC?   "+ass.GlobalAssemblyCache);  
  在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil   -l"查到。  
   
  另外,上面提到了GAC中的Assembly必须是strong-name的。创建strong-name的Assembly的步骤大致如下:  
  a)   在命令行运行“sn   -k   keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。  
  b)   在VS.NET里面修改“AssemblyInfo.cs”文件:  
  [assembly:   AssemblyDelaySign(false)]    
  [assembly:   AssemblyKeyFile("..\\..\\keyPair.snk")]    
  c)   编译项目,就能得到一个strong-name的Assembly。  
   
  MSDN中有一些对GAC的介绍,您可以参考:  
  1)《Assembly   Cache   Viewer   (Shfusion.dll)》  
  2)《Global   Assembly   Cache》  
   
  .NET   Framework中附带了一些和GAC有关的工具,其中包括:  
  1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly  
  2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native   Image  
  3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。  
   
  希望以上一些介绍能够对您有帮助。

 

 

 

 

asp.net 2.0的水晶报表,在迁移机器的时候,如果目标机器没有相应的程序集,在IIS中会报错。
错误描述:Parser Error
Description: An error occurred during the parsing of a resource required to service this
request. Please review the following specific parse error details and modify your source file
appropriately.

Parser Error Message: Could not load file or assembly 'Microsoft.ReportViewer.WebForms,
Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its
dependencies. The system cannot find the file specified.

【解决方法】

进入你的开发使用机器的c:\windows\assembly目录查看,是否有以下程序集安装在GAC中(如图):



由于资源管理器是使用了shell扩展来查看GAC中安装的程序集,所以我们无法看到这些程序集当前部署的真实目录在什么地方。我们可以直接在命令行模式中进行查看,进入X:\windows\assembly目录,然后查找和水晶报表相关的程序目录(如图):



我们可以大致看到GAC的部署结构了。我们在浏览器中所看到的一个一个的assembly名称,其实对应于assembly目录下面的每一个目录命名。进入具体的目录,还有一级子目录,这个目录的命名,是根据发布到GAC的程序集的版本号加上后面的公钥标记组成。(见上图的下面的红色标记部分)

再进入子目录,我们就可以看到公有部署的程序集,所存在的真正位置了。(如图):



接下来的工作就好办了,拷贝程序集到目标机器上,然后运行gacutil /i filename,将程序集安装到GAC即可。需要拷贝的程序集如下:

1) Microsoft.ReportViewer.Common.dll

2) Microsoft.ReportViewer.ProcessingObjectModel.dll

3) Microsoft.ReportViewer.WebForms.dll
 
 
 
 
 
 
看完这么多资料后最终发现问题,原来是版本的问题,把8.0.0.0改为9.0.0.0就可以顺利通过编译,哈,爽~

你可能感兴趣的:(windows 7)