2010-11-15 52 views
110

我刚刚将一个现有项目复制到一台全新的机器上,开始在其上开发,并遇到与我引用的程序集(即发生的telerik DLL)版本相关的问题。.net拣选错误的引用程序集版本

该项目最初引用程序集的旧版本(让我们称之为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)

显然,代码寻找过时的版本,并不能找到它。但为什么?

我为该版本号的grep解决方案文件夹找不到一个引用。我再次检查了.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时找到它。

我为什么在寻找旧版本?我还可以在哪里搜索以找到这个不好的参考?

回答

124

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

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

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

谢谢!相关的程序集更改使其工作。不过,我应该提到的是,在解决方案或其他DLL中没有任何其他项目引用Telerik DLL(为了仔细检查,我也对整个文件夹进行了加密)。尽管如此,我还是不能争取成功! – 2010-11-15 20:01:15

+9

我已经有各种类似的问题与不同的版本加载/不加载。您可以尝试的另一个技巧是手动删除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998文件夹中的所有文件。有时,当重新编​​译网站时,ASP.Net不会清理该文件夹,因为有些文件锁定,并且这些DLL可能挂在旧的引用上。这值得一试,我知道它在过去对我有用。 – 2010-11-16 01:47:03

+1

您为我解决了一个相关的问题 - 谢谢!我的C#应用​​程序中的继承形式不会在设计器中打开,因为它正在查找旧版本的引用。原来在引用问题参考的旧版本时已经创建了另一个参考。 – 2011-09-07 16:10:44

2

你有在该解决方案的任何其他项目?(可能是另一个项目是引用的是旧版本),通常在VS,DLL依赖性跨越溶液中的所有项目。

+0

解决方案中没有其他项目,也没有其他引用telerik的引用DLL。我只参考MS DLL ala System。* – 2010-11-15 19:51:13

22

我与克里斯康威在这一个(upvoted他)。问题在于你引用了项目中的一个telerik程序集,它引用了另一个不在那里的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部分,您可以使用像这需要每一个Telerik的组件部署在2008年向前它指向一个非常特别的版本如下:

<dependentAssembly> 
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" /> 
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" /> 
    </dependentAssembly> 
+1

感谢您的优点。我摔倒了,我必须首先给@Chris Conway解决方案,但你的回答也很有帮助。 – 2010-11-15 20:02:00

+1

@迈克尔:很高兴有帮助。顺便说一句,我upvoted他也;) – NotMe 2010-11-15 20:03:16

+2

我的意思是“感觉”,这一直困扰着我好几个月:) – 2011-04-06 17:23:49

2

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

+0

Thx队友,为我工作 – Albernazf 2015-03-31 00:17:25

0

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

1

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

2
  1. 转到C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG
  2. 找到machine.config文件
  3. 在记事本中打开
  4. 找到冲突的dll
  5. 删除这一点,保存。

汇编组件

addassembly = DLLNAME,版本= 1.0.0000。0000文化=中性公钥= “QWEWQERWETERY”

组件编译

为我工作。

+1

我也发现了这个恶梦 - 即使你从GAC中删除程序集,它在“C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config”中留下错误的版本引用。 – 2015-08-26 07:13:21

16

我尝试了大部分的答案,但仍然无法让它工作。这为我工作:

参考上点击右键 - >性能 - >变化 '特定版本' 为假。

enter image description here

希望这有助于。

+3

+1。它帮助我 – 2013-11-08 06:28:07

+28

这就是投票+1的意思。 – xr280xr 2014-06-11 15:03:08

+4

但是有时候,简单的upvote并没有充分总结出回答多么高兴和松了一口气 - 在花费数小时和数小时试图解决一个甚至不应该成为问题的愚蠢问题之后,您尝试使用Google搜索它方式,遇到不同的答案比你以前尝试,并繁荣!它现在有效!毕竟,有时只需按下upvote按钮并不能对这种压倒性的感觉做出正确的判断,老兄,你真的让我摆脱这个困扰。 – 2017-12-16 03:47:13

1

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

2

这不是一个明确的答案,为什么,但我们有这个问题,以下是我们的环境,什么解决它:

开发1:

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

开发2:

相同的解决方案和项目,但魔法设置断点和步骤的解决方案不起作用。看到无处不在的版本重定向或其他对此Nuget包的不良引用,删除包并重新安装它,擦除bin,obj,Asp.Net Temp,没有任何解决方法。最后,更名为Project A,运行MVC项目 - 修复。将它重命名为原来的名称,它保持不变。

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

0

当在引用不同版本的相同DLL的应用程序的两个版本之间切换时,我有相同的消息。尽管我在不同的文件夹中测试,但我不小心将较新版本复制到旧版本。

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

0

也许这有帮助或可能没有。我清理了我的调试版本和发布版本,然后重命名了OBJ文件夹。这终于让我充满了希望。之前的步骤基本上是项目移除参考,并将它们添加回项目属性中。

0

我对引用不同版本的Newtonsoft.json的不同程序集有同样的问题。我工作的解决方案是从Nuget Package Manager Console运行update-package。

4

尝试:

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

为我工作。

+0

清理C:\ Users \ USERNAME \ .nuget \ packages \目录是我所缺少的。非常感谢! – Herdo 2017-08-19 13:13:04

0

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

0

在我的Visual Studio 2015年,我保证有问题的Visual Studio项目的参考路径列表为空:

enter image description here

+0

为什么downvotes?至少解释!!!! – crazyTech 2018-02-27 19:47:33

+0

您对2个不同的问题发布了完全相同的答案? – AK47 2018-02-28 00:55:13

相关问题