如何查找引用错误版本的程序集并进行修复?

3

各位开发者,

我在我的开发环境中遇到了一个问题。我创建了一个项目,使用了EntityFramework和ASP.NET Identity,然后创建了一些其他的项目,比如WCF服务和引用第一个项目的WebForms站点。这些项目编译并工作良好,但是当我尝试在包管理器控制台中使用"Update-Database"来更新我的迁移启用数据库时,我得到以下错误信息:

System.Data.Entity.Core.MetadataException: Schema specified is not valid. Errors: (0,0) : error 0004: Could not load file or assembly 'Microsoft.AspNet.Identity.EntityFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我在每个项目中引用的Microsoft.AspNet.Identity.EntityFramework的版本都是2.0.0.0(我曾经使用NuGet升级过它)。如何找出是谁在查找旧版本并解决这个问题呢?

我尝试了以下步骤:

  • 在Visual Studio中手动检查每个项目的引用。它们都指定了正确的版本(2.0.0.0)和DLL路径,并将"Specific version"属性设置为"False"。

  • 清除了我的AppData和C:\Windows...中的"Temporary ASP.NET Files"

  • 当然,也清除了整个解决方案(删除了bin和obj文件夹)

  • 手动检查每个*.csproj文件中是否存在无效的引用

  • 使用NuGet重新安装包(Update-Package -includePrerelease -reinstall)

  • 在每个App.config/Web.config中包含程序集绑定重定向:

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.AspNet.Identity.EntityFramework" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>
  • 获取了Fusion日志:
***程序集绑定日志记录 (2014-04-18 @ 01:10:23) ***
操作失败。 绑定结果: hr = 0x80131040。无可用描述。
程序集管理器从此加载:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 在可执行文件下运行:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe ---跟随一个详细的错误日志。
=== 预绑定状态信息 === LOG: DisplayName = Microsoft.AspNet.Identity.EntityFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35(完全指定) LOG: Appbase = file:///C:/Developer/sharp/projects/ShadowServer/DataModel/bin/Debug/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = NULL 调用程序集:(未知)。 === LOG: 此绑定在默认加载上下文中开始。 LOG: 使用应用程序配置文件: C:\Developer\sharp\projects\ShadowServer\DataModel\tmp2BEF.tmp LOG: 使用主机配置文件: LOG: 使用来自C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config的机器配置文件。 LOG: 后策略引用: Microsoft.AspNet.Identity.EntityFramework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 LOG: GAC查找失败。 LOG: 正在尝试下载新的URL文件:///C:/Developer/sharp/projects/ShadowServer/DataModel/bin/Debug/Microsoft.AspNet.Identity.EntityFramework.DLL。 LOG: 程序集下载成功。正在尝试设置文件:C:\Developer\sharp\projects\ShadowServer\DataModel\bin\Debug\Microsoft.AspNet.Identity.EntityFramework.dll LOG: 进入下载缓存设置阶段。 LOG: 程序集名称为:Microsoft.AspNet.Identity.EntityFramework,Version=2.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35 WRN: 比较程序集名称导致不匹配: 主要版本号 ERR: 程序集引用与找到的程序集定义不匹配。 ERR: 设置失败,hr = 0x80131040。 ERR: 程序集设置失败(hr = 0x80131040)。探测终止。

提前抱歉我的英语 :)


使用调试器。在“调试+异常”中,勾选CLR异常的“抛出”复选框,以使其在加载失败时停止。堆栈跟踪窗口会告诉你是谁犯了错。 - Hans Passant
但是异常是在Visual Studio内置的Package Manager控制台中抛出的。具体来说,当使用“Update-Database”命令时,您确定我可以使用调试器吗? 我的应用程序(网站和Web服务)在任何时候都没有运行时问题,也不会抛出异常。 - Michael K. Sondej
是的,请启动 Visual Studio 的另一个实例。从工具菜单中选择“附加到进程”,以便它可以调试第一个实例。 - Hans Passant
1个回答

0
在我的情况下,我遇到了以下错误:
无法加载文件或程序集'Microsoft.AspNet.Identity.EntityFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'或其依赖项。定位的程序集清单定义与程序集引用不匹配。
我意识到我的主UI启动项目默认安装了旧版本的Microsoft.AspNet.Identity.EntityFramework...(而在其他数据层项目中,我手动获取了最新的库),所以只需从NUGet更新主项目即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接