。选择错误的引用汇编版本

我只是复制了一个现有的项目到一个全新的机器上开始开发,并遇到了一个问题与版本的一个参考程序集(一个 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 T: 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.

它所说的一切都是从寻找那个古老的组合开始的。我曾试图在网上找到一个解决方案,并看到了类似的 有个问题,但它似乎是我的问题的完全相反。那个提问者的程序找到的是错误的 DLL 而不是引用的 DLL。然而我的问题是,程序神秘地寻找错误的 DLL,当正确的 DLL 可以在 bin 文件夹和 GAC 中本地找到时,却无法找到它。

为什么我的搜索引擎在寻找旧版本? 我还可以在哪里搜索找到这个错误的引用?

238488 次浏览

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

你能像这样在你的 web.config 文件中放入一个绑定重定向吗?

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

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

在这个问题上我支持克里斯 · 康威(支持他)。问题是,您正在引用您的项目中的一个 telerik 程序集,该程序集引用另一个不存在的程序集。

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

第二,在你的每一个。工程项目档案(如。Csproj)会有一个指向 Telerik 的 <reference include..>。用户界面文件。这通常包含一个版本号。确保放入 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>

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

这几乎就像你必须清除你的电脑,以摆脱旧的 dll。我已经尝试了上面的所有方法,然后我进行了额外的步骤,只删除。我的计算机上的 DLL 文件,并删除应用程序中的每个引用。但是,它仍然可以很好地编译,并且在运行时引用 dll 函数也很好。我开始怀疑它是不是从某个网络驱动器上引用的。

如果在 Visual Studio 环境(ASP.NET Development Server)中测试和/或调试应用程序时遇到此问题,则有必要删除开发网站文件夹中的所有临时文件。要知道该文件夹在哪里,查找 Windows 托盘图标上的 ASP.NET Development Server 图标(它应该有这样的标题: ASP.NET Development Server-Port # # #) ,右键单击该图标并选择 Show Details; 然后,字段 Physical path 会告诉你临时文件夹是什么,所有项目都应该删除,以解决问题。重新建立和运行网站和解决问题(再次,为开发环境解决)。

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

编译程序集

AddAssembly = dllName,Version = 1.0.0000.0000 Culture = Central,PublicKeyToken = “ QWEWQERWETERY”

程序集编译

我没问题。

我尝试了大部分的答案,但仍然不能得到它的工作。这为我工作:

右键点击参考 -> 物业-> < strong > 将“具体版本”更改为 false。

enter image description here

希望这个能帮上忙。

以防节省别人3个小时... 我的情况有点不同。我的代码使用 DevExpress v11.1 v11.1.4.0。我在代码中正确地引用了它们。但是。Net 内存分析器在 GAC 中安装了 DevExpress v11.1 v11.1.12.0。事实上,失败的不是我引用的组件,而是他们内部引用的组件。不管我怎么努力,总是先检查 GAC。它编译并运行良好,但我无法查看 win 表单设计器和堆栈跟踪没有任何帮助。终于卸载了。网络内存剖析器和所有恢复。

这个问题的原因并不清楚,但我们遇到了这个问题,以下是我们的处境和解决办法:

发展1:

解决方案包含项目 A 引用 NuGet 包,MVC 项目引用项目 A 启用 NuGet 包还原,然后更新 NuGet 包。运行时发生错误,抱怨找不到 NuGet 库——但错误在于它在寻找旧的、未更新的版本。解决方案(这很荒谬) : 在调用 ProjectA 的 MVC 项目的第一行代码上设置一个断点。解决了,再也没有问题了。

德文2:

同样的解决方案和项目,但神奇的设置断点和解决方案中的步骤不起作用。到处寻找对这个 Nuget 包的版本重定向或其他错误引用,删除包并重新安装它,擦除 bin、 obj、 Asp。网络临时工,什么都解决不了。最后,重命名为项目 A,运行 MVC 项目-修复。重新命名为它的原名,它保持固定。

我不知道这为什么有用,但它确实让我们摆脱了困境。

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

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

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

对于引用不同版本的 Newtonsoft.json 的不同程序集,我遇到了同样的问题。对我有效的解决方案是从 Nuget Package Manager 控制台运行 update-Package。

试试:

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

这招对我管用。

我也有类似的问题,我必须删除 bin 和 obj 文件夹中的所有内容,然后重新构建来解决这个问题。希望这个能帮上忙。

在 MyVisualStudio2015中,我确保错误的 VisualStudioProject 的参考路径列表为空:

enter image description here

这就是对我有效的方法:

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

在我的情况下,我有3个项目,1个主要项目和2个子项目所参考的主要项目。.所以我更新了主项目,省略了子项目。这就是矛盾所在。在我更新了我所有的项目之后,一切都很顺利。

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

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

缺少 PlatformTarget导致此错误。

在 VS2017中,我们已经尝试了上面所有的解决方案,但是没有一个是有效的。

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

enter image description here

  1. 选择那个长期让你抓狂的项目

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

enter image description here

  1. 然后确保您已经勾选了覆盖文件的复选框

enter image description here

我得到的是:

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

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

在我的例子中,我意外地从 nuget 中选择了错误版本的 Telerik 软件包,然后 nuget 用错误版本替换了我引用的每个软件包。然后它插入一个绑定重定向到不正确的版本,这样即使我用正确的版本替换了所有内容,它仍然在寻找不正确的版本。