【c#/MVC】未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral……

今天在学习MVC模式时碰到了一个问题,在网上搜索后没有解决,最后才发现是一个很白痴的问题……

不过倒是借机学会了很多新的东西……

所以在此给与后来人一个指示。

如果想直接看最后的解决办法,可以直接翻到最后。

问题:VS创建默认MVC项目后,运行时报错:未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。

原因:访问的程序路径中包含了(#)号,导致无法访问,这个(#)往往是上一级目录。

以下为个人查询原因的经历,记录一下供自己以后回顾。

——————————————————————————————————————
首先我们来看报错:

“/”应用程序中的服务器错误。

未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) 
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

源错误: 

执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 

程序集加载跟踪: 下列信息有助于确定程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”未能加载的原因。


=== 预绑定状态信息 ===
日志: DisplayName = System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 (Fully-specified)
日志: Appbase = file:///D:/#测试/MVC/MVC/
日志: 初始 PrivatePath = D:\#测试\MVC\MVC\bin
调用程序集: Microsoft.AspNet.TelemetryCorrelation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35。
===
日志: 此绑定从 default 加载上下文开始。
日志: 未找到应用程序配置文件。
日志: 使用主机配置文件: C:\Users\tr27\Documents\IISExpress\config\aspnet.config
日志: 使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 的计算机配置文件。
日志: 策略后引用: System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///D:/#测试/MVC/MVC/bin/System.Diagnostics.DiagnosticSource.DLL。
警告: 比较程序集名称时发生不匹配: 修订号
错误: 未能完成程序集的安装(hr = 0x80131040)。探测终止。

堆栈跟踪: 


[FileLoadException: 未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)]
   Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.Application_BeginRequest(Object sender, EventArgs e) +0
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +200
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +132
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +73

看到这个错误,最吸引我们注目的内容肯定是

未能加载文件或程序集“System.Diagnostics.DiagnosticSource, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040) 

根据以往对“未能加载文件或程序集”的错误处理,我们会下意识的认为,是DLL文件的引用错误问题。

于是我们会自然而然的开始检查这三个地址:

日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///C:/Users/tr27/AppData/Local/Temp/Temporary ASP.NET Files/vs/26b9e87d/284b9cf9/System.Diagnostics.DiagnosticSource/System.Diagnostics.DiagnosticSource.DLL。
日志: 尝试下载新的 URL file:///D:/#测试/MVC/MVC/bin/System.Diagnostics.DiagnosticSource.DLL。

如果我们去找了,我们会惊讶的发现,这三个地址里都有“System.Diagnostics.DiagnosticSource”这个DLL文件啊??

这是怎么回事?

如果你像我一样,也许此时就会开始猜测文件的版本问题。

于是开始搜索“System.Diagnostics.DiagnosticSource”这个DLL文件的版本问题。

如果你搜索到这个页面

那么,恭喜你,你接触到了NuGet包的使用方法。

如何把这个包引入到自己的工程里呢?

重新打开VS,搜索之后,工具》NuGet包管理器》程序包管理控制台,打开之后,在控制台输入命令……咦,为什么不能成功的下载?

然后经过搜索后,你发现:

  • NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展。
  • 在使用Visual Studio开发基于.NET Framework的应用时,NuGet能够令你在项目中添加、移除和更新引用的工作变得更加快捷方便。
  • 通过NuGet你可以很容易的访问到其他开发者发布的软件包,你也可以创建、分享或者发布自己的包到NuGet。
  • 微软的EntityFramework、ASP.NET MVC等或者一些常用到的第三方软件包:Json.NET、NUnit等都托管到NuGet上。

原来,NuGet它是用来添加引用的!只能在项目中添加!它不会影响你没有添加过这些包的其他项目!

明白了这些的你打开项目,继续打开NuGet程序包管理控制台,继续在控制台输入命令:

PM>Install-Package System.Diagnostics.DiagnosticSource -Version 4.5.1

大概两三秒,添加完成,你信心满满的运行程序……

未能加载文件或程序集……

咳咳,忘记了具体是什么错误……

之后,根据百度到的各种信息,我们有了以下的收获。

  1. 未能加载文件或程序集……除了版本问题和丢失问题外,还有一种是因为系统X86和X64版本引发的问题,想要修改,可以对项目的解决方案-右键-属性,生成-平台目标:any cpu/x64/x86
  2. 当我们通过NuGet引用包后,有时也会出现这个问题,“未能加载文件或程序集“WebGrease, Version=1.5.1.25624, Culture=neutral, Publ”,这可能是程序集版本不兼容引起的,可以通过NuGet先把程序包删除,然后再安装最新或某个版本的程序包。通过"uninstall-package -f WebGrease"先卸载,然后通过"install-package WebGrease"再下载最新版本,问题解决

————————————————————————————————————————————

真正原因与解决方案:

就在我找了很多方案,按着上述行为不断重试并不断出现新的错误的时候,我没有发现一个很关键的信息。

“/”应用程序中的服务器错误。

以及

D:/#测试/MVC

这个路径。

也就是说,IIS也很明显的给出了错误原因(“/”应用程序中的服务器错误)。

我喜欢在项目路径中放一个以“#”开头的文件夹,以保证起其的置顶效果。

如果看到这里的您也出现了这个搜便全网页找不到的错误的话,多半和我一样也是这个原因了。

如果想要保持置顶效果,将“#test”改成“01test”也有同样的效果~~~~

如果觉得对您有帮助,请右上角点个赞并评论一句吧~~~~~~

附注:

值得一提的是,在我另外一台电脑上我同样将项目安放在了带有“#”命名的文件目录下,此时通过浏览器加载IIS后,并没有出现问题。

不知道是因为之前已经运行过(在没有带“#”的另一个文件夹中)的原因,还是“.NET Framework”版本的问题,还是其他组件的影响(有怀疑是IIS部署器的版本问题)。

另外浏览器也有关系,chorem和IE的表现显著比edge要好。

你可能感兴趣的:(c#,c#.net)