.Net选择错误的引用程序集版本


141

我只是将现有项目复制到一台全新的机器上,以开始在该机器上进行开发,并且遇到了我所引用的程序集之一的版本问题(发生在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问题,但这似乎与我的问题完全相反。该提问者的程序正在找到错误的DLL,而不是所引用的DLL。而我的问题是,该程序正在神秘地寻找错误的DLL,而无法在bin文件夹和GAC中本地找到正确的DLL时却找不到它。

我为什么要寻找旧版本?我还能在其他地方搜索找到此不良参考?

Answers:


151

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

您可以像这样在您的web.config文件中放入绑定重定向吗?

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

12
我遇到过类似的问题,不同的版本加载/不加载。您可以尝试的另一种技巧是手动删除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files / root / 90233b18 / 10d54998文件夹中的所有文件。有时在重新编译网站时,ASP.Net不会由于某些文件锁定而清除该文件夹,而这些dll可能会挂在旧的引用上。值得一试,我知道过去对我有用。
克里斯·康威

1
您为我解决了一个相关问题-谢谢!我的C#应用​​程序中的继承表单无法在设计器中打开,因为它正在寻找参考的旧版本。原来,在参考该问题参考的旧版本时,最初已经建立了另一个参考。
山姆·斯库斯


1
谢谢克里斯!您在这里解决了我的问题: stackoverflow.com/q/11490177/7850
Shaul Behr 2012年

3
您也可以查看App.config或web.config,查看是否有现有 <dependentAssembly>条目引起了该问题。
罗伊·廷克

24

我和克里斯·康威(Chris Conway)在一起(支持他)。问题是您引用了项目中的一个telerik程序集,而该程序引用了另一个不存在的程序集。

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

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

第三,确保所有项目都使用最新的程序集。另外,还要确保他们是从本地路径而不是从GAC抓住组件。(我真的真的不喜欢GAC。在我从事的某些项目中,它没有引起任何问题)。通常,我们有一个“程序集”文件夹,所有项目都将其用作外部程序集引用。

第四,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
我的意思是“感觉”,这困扰了我好几个月了:)
Michael La Voie

21

我尝试了大多数答案,但仍然无法正常工作。这为我工作:

右键单击引用 -> 属性 -> 将“特定版本”更改为false。

在此处输入图片说明

希望这可以帮助。


30
这就是+1投票的意思。
xr280xr 2014年

7
但是有时候,简单的投票不足以总结出答案给您带来的快乐和轻松感。 ,遇到了与您尝试过的答案不同的答案,然后再繁荣起来!现在有效!毕竟,有时仅按“向上投票”按钮并不能抵消那种令人沮丧的感觉,伙计,您真的使我摆脱了这种感觉。
迈克尔·普劳兹

7

尝试:

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

那对我有用。


1
我缺少的是清理C:\ Users \ USERNAME \ .nuget \ packages \目录。非常感谢!
Herdo

要获取干净的旧nuget版本,请在基于Windows的计算机上,单击ckuck,然后开始并搜索“运行”>复制并粘贴“%userprofile%\。nuget \ packages”-这将打开nuget版本文件夹
E.Meir

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

编译程序集

addassembly = dllName,版本= 1.0.0000.0000文化=中性,PublicKeyToken =“ QWEWQERWETERY”

程序集编译

为我工作。


2
我也发现了这个噩梦-即使你从GAC组件移除它的叶子在错版引用“C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG \ machine.config中”
Evalds Urtans

3

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

开发1:

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

开发2:

解决方案和项目相同,但是魔术设置断点和解决方案中的步骤无效。到处寻找该Nuget程序包的版本重定向或其他错误引用,删除该程序包并重新安装,擦除bin,obj,Asp.Net Temp,没有任何解决方案。最后,将其重命名为Project A,运行了MVC项目-已修复。将其重命名为其原始名称,保持不变。

我没有任何解释为什么这样做有效,但是确实使我们摆脱了严重的困境。


2

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


解决方案中没有其他项目,也没有其他引用telerik的引用DLL。我只引用MS DLLs ala System。*
Michael La Voie 2010年

2

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


2

万一可以节省别人3个小时...我的情况有些不同。我的代码使用的是DevExpress v11.1 v11.1.4.0。我在代码中正确引用了所有这些内容。但是.net内存探查器在GAC中安装了DevExpress v11.1 v11.1.12.0。实际上,失败的不是我引用的组件,而是内部引用的组件。尝试一下,始终会首先检查GAC。它编译并运行良好,但我看不到Win Forms Designer,并且堆栈跟踪完全没有帮助。最终卸载了.net内存分析器,所有文件均恢复了。


2

我遇到了类似的问题,我不得不从bin和obj文件夹中删除所有内容,然后进行重建以解决我的问题。希望这可以帮助。


1

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


1

对于引用不同版本的Newtonsoft.json的不同程序集,我遇到了相同的问题。对我有用的解决方案是从Nuget软件包管理器控制台运行更新软件包。


1

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

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

缺少PlatformTarget导致此错误。


1

我得到:

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

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


是的-在我们的通用程序库中名称中包含一个版本,以避免在源代码管理中命名问题。改回名称并手动更新引用/提示路径,所有这些都起作用。
Mathew Paxinos

0

几乎就像您必须清除计算机上的旧dll一样。我已经尝试了上面的所有步骤,然后执行了额外的步骤,即删除计算机上的.DLL文件的每个实例,并从应用程序中删除所有引用。但是,它仍然可以正常编译,并且在运行时引用dll函数也可以。我开始怀疑它是否正在从某个网络驱动器引用它。


0

在引用相同DLL的不同版本的应用程序的两个版本之间切换时,我有相同的消息。尽管我在不同的文件夹中进行测试,但是我无意间将新版本复制到了旧版本上。

因此,首先要检查的是应用程序文件夹中引用的DLL的版本。以防万一。


0

也许这有帮助,也许没有。我清理了调试和发行版本,然后重命名了OBJ文件夹。这终于让我明白了。先前的步骤基本上是项目删除引用,然后将它们重新添加到项目属性中。


0

在我的Visual Studio 2015中,我确保有问题的Visual Studio项目的“引用路径”列表为空:

在此处输入图片说明


您对2个不同的问题发布了完全相同的答案?
AK47

0

这对我有用:

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


0

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


0

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

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

在此处输入图片说明

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

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

在此处输入图片说明

  1. 然后确保您已按照屏幕快照勾选了覆盖文件的复选框

在此处输入图片说明


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.