.Net采摘错误的引用程序集版本

我只是将一个现有的项目复制到一台全新的机器上,开始对其进行开发,并且遇到了一个我引用的程序集版本(一个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 = MyCompme
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 DocumentsVisual Studio 2010ProjectsCoolProjWebAppbin
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 DocumentsVisual Studio 2010ProjectsCoolProjWebAppweb.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:WINDOWSMicrosoft.NETFrameworkv4.0.30319configmachine.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时找到它。

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


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

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

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

我与克里斯康威在这一个(upvoted他)。 问题在于你引用了项目中的一个telerik程序集,它引用了另一个不在那里的telerik程序集。

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

其次,在你的每个.proj文件(比如.csproj)中都会有一个指向Telerik.Web.UI文件的<reference include..> 。 这通常包含一个版本号。 确保放入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>

我尝试了大部分答案,但仍然无法实现。 这对我有效:

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

在这里输入图像描述

希望这可以帮助。

链接地址: http://www.djcxy.com/p/44483.html

上一篇: .Net picking wrong referenced assembly version

下一篇: Possible security hole using SetDllDirectory?