首页 文章

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

提问于
浏览
124

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

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

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

19 回答

  • 0

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

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

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

    我和Chris Conway在一起(赞成他) . 问题是你引用了项目中的一个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>
    
  • 2

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

    right click on reference - > properties - > change 'Specific Version' to false.

    enter image description here

    希望这可以帮助 .

  • 3

    尝试:

    • 清理临时项目文件

    • 清理构建和obj文件

    • 清除安装在 C:\Users\USERNAME\.nuget\packages\ 的旧版本

    这对我有用 .

  • 0
    • 转到C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG

    • 查找machine.config文件

    • 在记事本中打开

    • 找到冲突dll

    • 删除此并保存 .

    编译程序集addassembly = dllName,Version = 1.0.0000.0000 Culture = neutral,PublicKeyToken =“QWEWQERWETERY”程序集编译

    适合我 .

  • 0

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

  • 0

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

  • 23

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

    开发1:

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

    开发2:

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

    我没有任何解释为什么这样有效,但它确实让我们摆脱了严重的困境 .

  • 132

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

  • 1

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

  • 0

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

  • 17

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

  • 0

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

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

  • 0

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

  • 2

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

  • 6

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

    enter image description here

  • 2

    这对我有用:

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

  • 0

    在我的情况下,我有3个项目,1个主项目和2个主项目引用的子项目 . 所以我更新了主项目,省略了子项目 . 这就是冲突所在 . 在我更新了所有项目后,一切正常 .

  • 1

    这个错误有点误导 - 我正在加载一些需要指定x64架构的DLL . 在 .csproj 文件中:

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

    缺少 PlatformTarget 导致此错误 .

相关问题