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

时间:2010-11-15 19:13:26

标签: asp.net dll

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

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

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

  

无法加载文件或程序集   'XXXXXX,版本= 1.0.0.0,   文化=中性,   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.

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

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

22 个答案:

答案 0 :(得分:140)

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

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

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>

答案 1 :(得分: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>

答案 2 :(得分:21)

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

右键点击参考 - &gt; 属性 - &gt; 将“特定版本”更改为false。

enter image description here

希望这有助于。

答案 3 :(得分:6)

尝试:

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

这对我有用。

答案 4 :(得分:3)

  1. 转到C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
  2. 查找machine.config文件
  3. 在记事本中打开
  4. 发现冲突dll
  5. 删除此并保存。
  6.   

    编译程序集

         

    addassembly = dllName,Version = 1.0.0000.0000 Culture = neutral,PublicKeyToken =“QWEWQERWETERY”

         

    程序集编译

    适合我。

答案 5 :(得分:2)

您在该解决方案中是否还有其他项目?(可能是另一个项目引用了旧版本)通常在VS中,dll依赖项跨越解决方案中的所有项目。

答案 6 :(得分:2)

我的问题是旧程序集位于Web应用程序下的_bin_deployableAssemblies文件夹中。 这意味着旧的程序集在构建项目时会覆盖GAC程序集。

答案 7 :(得分:2)

这不是一个明确的答案,为什么,但我们有这个问题,这是我们的情况和解决它的原因:

开发1:

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

Dev 2:

相同的解决方案和项目,但魔术设置断点和解决方案中的步骤不起作用。随处可见版本重定向或其他对此Nuget包的错误引用,删除包并重新安装它,擦除bin,obj,Asp.Net Temp,没有解决它。最后,重命名为Project A,运行MVC项目 - 修复。将其重命名为原始名称,它保持固定。

我没有解释为什么这样有效,但确实让我们陷入了严重的困境。

答案 8 :(得分:1)

万一拯救别人3个小时......我的情况有点不同。我的代码使用了DevExpress v11.1 v11.1.4.0。我在代码中正确引用了它。但.net内存分析器在GAC中安装了DevExpress v11.1 v11.1.12.0。事实上,它不是我引用的组件,而是它们内部引用的组件失败。尽可能地尝试,首先检查GAC。它编译并运行良好,但我无法查看win表单设计器,堆栈跟踪根本没有帮助。最后卸载.net内存分析器并恢复了所有内容。

答案 9 :(得分:1)

我有类似的问题,我不得不从bin和obj文件夹中删除所有内容并重建以解决我的问题。希望这会有所帮助。

答案 10 :(得分:1)

我在使用不同版本的Newtonsoft.json的不同程序集时遇到了同样的问题。适合我的解决方案是从Nuget Package Manager Console运行update-package。

答案 11 :(得分:1)

如果在从Visual Studio环境(ASP.NET Development Server)测试和/或调试应用程序时遇到此问题,则必须删除开发网站文件夹中的所有临时文件。要知道该文件夹的位置,请在Windows托盘图标上查找ASP.NET Development Server图标(它应该具有如下标题:ASP.NET Development Server - Port ####),右键单击图标并选择Show细节;然后,字段物理路径将告诉您临时文件夹是什么,应删除所有项目以解决问题。建立并再次运行网站,问题应该解决(再次,为开发环境解决)。

答案 12 :(得分:0)

在VS2017中,尝试了上述所有解决方案,但没有任何效果。我们正在使用Azure devops进行版本控制。

  1. 从团队资源管理器>源代码管理资源管理器

enter image description here

  1. 选择长时间困扰您的项目

  2. 右键单击分支或解决方案>高级>获取特定版本

enter image description here

  1. 然后确保您已选中根据屏幕快照覆盖文件的复选框

enter image description here

答案 13 :(得分:0)

我得到了:

  

无法加载文件或程序集“ XXX-new-3.3.0.0”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自HRESULT的异常:0x80131040)

这是因为我将程序集的名称从XXX.dll更改为XXX-new-3.3.0.0.dll。将名称恢复为原始名称可修复错误。

答案 14 :(得分:0)

就我而言,我不小心从nuget中选择了Telerik软件包的错误版本,然后nuget用不正确的版本替换了我引用的每个软件包。然后,它将插入的重定向重定向插入到错误的版本,以便即使在我用正确的版本替换所有内容之后,它仍在寻找错误的版本。

答案 15 :(得分:0)

此错误有点令人误解-我正在加载一些需要指定x64体系结构的DLL。在.csproj文件中:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
    <OutputPath>bin\Release-ABC</OutputPath>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

缺少PlatformTarget导致此错误。

答案 16 :(得分:0)

在我的情况下,我有3个项目,1个主项目和2个由主项目引用的子项目。因此,我更新了主项目,而忽略了子项目。那就是冲突所在。更新完所有项目后,一切正常。

答案 17 :(得分:0)

这对我有用:

我在类库项目中使用Microsoft.IdentityModel.Clients.ActiveDirectory版本3.19,但在实际的ASP.NET Web应用程序项目中只安装了版本2.22。在Web应用程序项目中升级到3.19让我超越了错误。

答案 18 :(得分:0)

在我的Visual Studio 2015中,我确保违规的Visual Studio项目的参考路径列表为空:

enter image description here

答案 19 :(得分:0)

也许这会有所帮助,也可能不会。我清理了我的调试和发布版本,然后我重命名了OBJ文件夹。这终于让我感到震惊。以前的步骤基本上是删除引用的项目,并将它们添加回项目属性中。

答案 20 :(得分:0)

在引用同一DLL的不同版本的应用程序的两个版本之间切换时,我有相同的消息。虽然我在不同的文件夹中进行测试,但我不小心将旧版本复制到旧版本上。

所以要检查的第一件事是应用程序文件夹中引用的DLL的版本。以防万一。

答案 21 :(得分:0)

它几乎就像你必须消灭你的电脑以摆脱旧的DLL。我已经尝试了上面的所有内容,然后我执行了额外的步骤,即删除计算机上的.DLL文件的每个实例,并从应用程序中删除每个引用。但是,它仍然编译得很好,当它运行时,它正好引用了dll函数。我开始怀疑它是否正在从网络驱动器中引用它。