随着Microsoft 在ASP.net MVC 领域的频繁更新,导致版本不一致也只主要发生的问题,下面我们来看一个典型的dll引用版本不一致导致的异常问题;
“/”应用程序中的服务器错误。
未能加载文件或程序集“System.Web.WebPages”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“System.Web.WebPages”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
源错误:
执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 |
程序集加载跟踪: 下列信息有助于确定程序集“System.Web.WebPages”未能加载的原因。
堆栈跟踪:
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.6.1038.0
[FileLoadException: 未能加载文件或程序集“System.Web.WebPages”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)] [FileLoadException: 未能加载文件或程序集“System.Web.WebPages, Version=3.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +36 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +21 System.Reflection.Assembly.Load(String assemblyString) +28 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38 [ConfigurationErrorsException: 未能加载文件或程序集“System.Web.WebPages, Version=3.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)] System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +738 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +217 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +130 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +170 System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +92 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +290 System.Web.Compilation.BuildManager.ExecutePreAppStart() +157 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +531 [HttpException (0x80004005): 未能加载文件或程序集“System.Web.WebPages, Version=3.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9942412 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +90 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +261 |
版本信息: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.6.1038.0
以上是发现的版本异常问题,一大堆,说到底就是 dll 引用文件与声明的文件版本不一致的问题;
所以简单来说, 就是保证 在项目中声明所引用 dll 文件要 与实际添加引用的文件版本一致;
1. 我们以引用的 system.web.mvc 抛出了以上问题为例, 运行环境为 Visual Studio 2012或者visual studio 2013(含update 5);
项目的引用中添加了system.web.mvc, 但是版本问题需要我们查看;
选中发生异常的引用,右键单击,查看属性;
于是乎我们看到了这个,
现在问题来了, 我们需要关注的 是三个参数, 名称、版本和路径;
说好的 mvc 4.0 没有错啊,就是4.0 非常正确,咋个就还报错了,路径虽然说是C盘的,但是打开来看,文件还是存在的呀,木有问题啊??
那他为什么还报这个错呢?
好, 亲们,关键点来了,且 容我先看哈 至关重要的 web.config 文件是怎么配置的一说;
好, 亲们,关键点来了,且 容我先看哈 至关重要的 web.config 文件是怎么配置的一说;
噢噢, 这个版本范围有点大了哈,1.0 - 5.2.3 这个版本够多了,当然 4.0也在里面了;
但是,亲 注意了,我们一定不能忘了啊 自从visual studio 2012 开始,mvc项目在建立解决方案的时候 多会默认地生成一个packages文件夹啊,
我们去看哈,怎么回事;
各位看官 可看好了哈,
红框框里面的可看好了 ,这个路径是项目所在解决方案的路径啊, 不再是原来C盘项目的引用了,而是直接引用 packages包里面的dll文件了,只要保证实际引用的dll 与配置的dll 路径,版本编号一致就欧了呗,
NO. NO. NO,
既然 引入了packages引用文件夹,可定别忘了 还有另外一个玩意儿 那就是,项目中的 packages 配置文件;这个可就是你实际引用的列表了;可不能漏了,,
我们打开来看哈, 什么东东来着,
哇 这么多。。。。。原来他就是与引用的东西一致那个文件列表,主要就是 引用文件名称,版本号,应用.NET目标框架版本等基本信息;
那在对照着看一下,更明确了;
基本是文件夹里面有什么, 配置文件里面有啥,并且都是 一致一致的,
各位亲,看到这应该明白为什么了吧,
引用的文件要与实际标明的版本号一致哦;;
说完这这个 我们来拓展一下,
如果哪天我想自己加一个自定义的 dll文件咋办呢?
好的,先建立一个引用文件夹, 然后添加一个引用的dll 文件,
XXX.Folder1.0.0 ----> XXX.Folder.dll
在配置文件添加相应的 配置节点
<package id="XXX.Folder" version="1.0.0" targetFramework="net45" />
接下来就是 添加"引用"了,这就不用我多说了吧,亲。。。。
浏览打开 你的packages文件夹 添加你刚才定义的dll文件就OK了,
重新生成项目,项目跑起来,妥妥的!!!!!