.Net采摘错误引用的汇编版本

Mic*_*oie 136 asp.net dll

我刚刚将一个现有的项目复制到一台全新的机器上,开始对它进行开发,并且遇到了我引用的程序集之一的版本问题(发生了一个telerik DLL).

该项目最初引用了旧版本的程序集(我们称之为v1.0.0.0).我的新机器安装了最新版本的程序集,所以我想我已经更新了它(让我们调用新版本的v2.0.0.0).

现在问题是:如果我将旧的v1.0.0.0 dll复制到项目文件夹并将其添加为参考,则网站启动时没有问题.如果我删除该引用(并且还从我的系统中删除旧DLL)并添加新版本(v2.0.0.0),该页面将显示以下异常:

无法加载文件或程序集"XXXXXX,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 121fae78165ba3d4"或其中一个依赖项.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

显然,代码正在寻找过时的版本而无法找到它.但为什么?

我为该版本号编制了解决方案文件夹,但找不到一个引用.我仔细检查.csproj文件的文本,发现版本正确显示最新版本,HintPath正确显示新DLL的路径.此外,因为我没有在系统上安装旧的DLL,它不会出现在我的GAC中(尽管v2.0.0.0正如预期的那样).

然后,我启用了融合日志查看器,试图找出它为什么要查找旧版本,但没有运气:

Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.


=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
 (Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Run Code Online (Sandbox Code Playgroud)

所有这一切都说它是从寻找旧组件开始的.我试图在网上找到一个解决方案,并看到了类似的问题,但它似乎与我的问题完全相反.该提问者的程序是找到错误的DLL而不是引用的DLL.虽然我的问题是该程序神秘地寻找错误的DLL并且无法在bin文件夹和GAC中找到正确的DLL时找到它.

我为什么要寻找旧版本?我还能在哪里找到这个不好的参考?

Chr*_*way 144

我的猜测是你正在使用的另一个程序集引用了旧的dll.您是否熟悉正在使用的所有其他项目引用,并且其中任何一个都引用了Telerik dll吗?

你能在这个web.config文件中加入绑定重定向吗?

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

  • 我有各种类似的问题,加载/不加载不同的版本.您可以尝试的另一个技巧是手动删除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998文件夹中的所有文件.有时在重新编译网站时,由于某些文件锁定,ASP.Net不会清除该文件夹,并且这些dll可能会挂在旧引用上.值得一试,我知道它过去对我有用. (11认同)
  • 您还可以查看App.config或web.config,看看现有的`<dependentAssembly>`条目是否导致了问题. (3认同)
  • 你为我解决了一个相关的问题 - 谢谢!我的 C# 应用程序中的继承表单不会在设计器中打开,因为它正在寻找旧版本的引用。原来在引用问题参考的旧版本时,最初构建了另一个参考。 (2认同)
  • 如果您在语法上徘徊:http://msdn.microsoft.com/en-us/library/0ash1ksb.aspx (2认同)
  • 谢谢克里斯!您在这里解决了我的问题:http://stackoverflow.com/q/11490177/7850 (2认同)

Not*_*tMe 24

我和Chris Conway在一起(赞成他).问题是你引用了项目中的一个telerik程序集,它引用了另一个不存在的程序集.

第一件事:我不会将任何供应商(即:telerik)程序集安装到GAC中.Telerik的东西无论如何都被编译成两个程序集(telerik.web.design和telerik.web.ui).只需部署应用程序.

其次,在每个.proj文件(如.csproj)中都会有一个<reference include..>指向Telerik.Web.UI文件的文件.这通常包含版本号.确保放在bin文件夹中的程序集与该版本匹配.

第三,确保所有项目都使用最新的程序集.还要确保它们从本地路径而不是GAC抓取程序集.(我真的不喜欢GAC.它已经导致我一直在进行的一些项目的问题没有结束).我们通常有一个"Assemblies"文件夹,所有项目都用于外部程序集引用.

第四,visual studio会在每次加载网站项目时自动搜索您的gac,如果它在gac中找到某些内容,则会重新定位装配位置.我不记得它是否曾经为Web应用程序项目做过这样的事情,但是我很久没有遇到这个问题了.这可能会在部署期间导致类似问题.

第五,您可以在web.config中重新绑定程序集的版本号.在本runtime/assemblybinding节中,您可以使用以下内容,将2008年部署的每个telerik程序集转发并指向一个非常特殊的版本:

  <dependentAssembly>
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
  </dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是"感觉",这几个月来一直困扰着我:) (2认同)

Ray*_*ess 21

我尝试了大部分答案,但仍无法使其发挥作用.这对我有用:

右键单击引用 - > 属性 - > 将"特定版本"更改为false.

在此输入图像描述

希望这可以帮助.

  • 这就是投票+1意味着什么. (29认同)
  • 但有时简单的upvote并没有充分总结答案让你感到高兴和放心 - 在花了几个小时试图修复一个甚至不成问题的愚蠢问题之后,你尝试用不同的方式用Google搜索,遇到一个不同于你以前尝试过的答案,并且热潮!它现在有效!毕竟,有时简单地按下upvote按钮并不能完全理解那种压倒性的感觉,伙计,你真的把我从这个中拯救出来. (6认同)

小智 6

尝试:

  • 清理临时项目文件
  • 清理构建和obj文件
  • 清理旧版本安装在 C:\Users\USERNAME\.nuget\packages\

这对我有用.


Chr*_*ini 5

这并不是一个明确的答案,但我们遇到了这个问题,这是我们的情况以及解决方法:

开发1:

解决方案包含引用 NuGet 包的项目 A 和引用项目 A 的 MVC 项目。启用 NuGet 包还原,然后更新 NuGet 包。出现运行时错误,抱怨找不到 NuGet lib - 但错误是它正在寻找较旧的、未更新的版本。解决方案(这很荒谬):在调用项目 A 的 MVC 项目中的第一行代码上设置一个断点。使用 F11 进入。解决了——再也没有出现过问题。

开发2:

相同的解决方案和项目,但解决方案中的神奇设置断点和步骤不起作用。到处寻找版本重定向或对此 Nuget 包的其他错误引用,删除包并重新安装它,擦除 bin、obj、Asp.Net Temp,但没有解决问题。最后,更名为项目A,运行MVC项目——修复。将其重命名回原来的名称,它保持不变。

我没有任何解释为什么它会起作用,但它确实让我们摆脱了严重的困境。