.net选错了引用的汇编版本
我只是复制一个现有的项目到一个全新的机器上开始开发,并遇到了一个我引用的程序集(一个telerik DLL,因为它发生)的版本的问题。
该项目最初引用了程序集的旧版本(让我们称之为v1.0.0.0)。 我的新机器安装了最新版本的程序集,所以我想我已经更新了它(让我们来调用新版本v2.0.0.0)。
现在,这里的问题是:如果我将旧的v1.0.0.0 dll复制到项目文件夹并添加它作为参考,网站启动没有问题。 如果我删除了该引用(并从系统中删除旧的DLL)并添加新版本(v2.0.0.0),则页面显示以下exception:
无法加载文件或程序集“XXXXXX,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = 121fae78165ba3d4”或其某个依赖关系。 定位的程序集清单定义与程序集引用不匹配。 (来自HRESULT的exception:0x80131040)
显然,代码正在寻找过时的版本,找不到它。 但为什么?
我greipe解决scheme文件夹的版本号,并找不到一个单一的参考。 我再次检查.csproj文件的文本,发现版本正确显示最新版本,HintPath正确显示新的DLL的path。 另外,因为我没有在系统上安装旧的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.
所有这一切都表明它是从寻找那个旧的assembly开始的。 我试图find一个在线解决scheme,看到这个类似的SO问题 ,但它似乎是我的问题完全相反。 该提问者的程序find了错误的DLL而不是引用的DLL。 而我的问题是,该程序神秘地寻找错误的DLL,无法find它时,可以在bin文件夹和GAC本地find正确的。
我为什么要找旧版本? 我还能在哪里find这个不好的参考?
我的猜测是,你正在使用的另一个程序集是引用旧的DLL。 您是否熟悉所有正在使用的其他项目引用,并且是否有任何引用Telerik dll?
你可以像这样在你的web.config文件中绑定redirect吗?
<dependentAssembly> <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly>
我和克里斯·康威(Chris Conway)在这一项上(upvoted)。 问题是你正在引用项目中的一个telerik程序集,它引用另一个不在那里的telerik程序集。
首先,我不会将任何供应商(即:telerik)程序集安装到GAC中。 Telerik的东西被编译成只有两个程序集(telerik.web.design和telerik.web.ui)。 只要部署这些应用程序。
其次,在每个.proj文件(如.csproj)中,都会有一个指向Telerik.Web.UI文件的<reference include..>
。 这通常包含一个版本号。 确保放入bin文件夹的程序集与该版本匹配。
第三,确保所有的项目都使用最新的程序集。 还要确保他们从本地path而不是GAC抓取程序集。 (我真的不喜欢GAC,这对我一直以来进行的项目并没有造成任何问题)。 我们通常有一个“Assemblies”文件夹,所有项目都用于外部assembly参考。
第四,每当一个网站项目被加载时,visual studio会自动search你的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。
希望这可以帮助。
尝试:
- 清理临时项目文件
- 清理构build和obj文件
- 清理安装在
C:\Users\USERNAME\.nuget\packages\
这对我有效。
在解决scheme中是否有其他项目?(可能是另一个项目引用旧版本)通常在VS中,dll依赖项跨越解决scheme中的所有项目。
我的问题是旧的程序集位于Web应用程序下的_bin_deployableAssemblies文件夹中。 这意味着在构build项目时,旧的组件会覆盖GAC程序集。
- 转到C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG
- findmachine.config文件
- 打开记事本
- find冲突的DLL
- 删除这个并保存。
编译程序集
addassembly = dllName,Version = 1.0.0000.0000 Culture = neutral,PublicKeyToken =“QWEWQERWETERY”
程序集编译
为我工作。
这不是一个明确的答案,为什么,但是我们有这个问题,这是我们的情况和解决办法:
开发1:
解决scheme包含引用NuGet包的Project A和引用Project A的MVC项目。启用NuGet Package Restore,然后更新NuGet包。 抱怨NuGet lib找不到运行时错误 – 但错误是它寻找旧的,非更新的版本。 解决scheme(这是荒谬的):在调用Project A的MVC项目的第一行代码中设置一个断点。 解决了 – 再也没有问题了。
开发2:
相同的解决scheme和项目,但魔术设置断点和解决scheme的步骤不起作用。 看到无处不在的版本redirect或其他不良的引用这个Nuget包,删除包并重新安装它,擦拭斌,obj,Asp.Net温度,没有解决它。 最后,改名为Project A,运行MVC项目 – 修复。 将其重命名为原始名称,保持不变。
我没有任何解释,为什么这个工作,但它确实让我们摆脱了严重的困境。
如果从Visual Studio环境(ASP.NET Development Server)testing和/或debugging应用程序时遇到此问题,则需要删除开发网站文件夹上的所有临时文件。 要知道文件夹的位置,请在Windows托盘图标(它应该有一个这样的标题:ASP.NET Development Server – Port ####)上findASP.NET Development Server图标,右键单击该图标并selectShow细节; 这个字段的物理path会告诉你什么是临时文件夹,应该删除所有的项目,以解决问题。 build立并重新运行网站,问题应该解决(再次,为开发环境解决)。
万一别人救了3个小时…我的情况有点不一样。 我的代码使用DevExpress v11.1 v11.1.4.0。 我已经在代码中正确引用了它。 但.net内存分析器在GAC中安装了DevExpress v11.1 v11.1.12.0。 实际上,这不是我引用的组件,而是它们内部引用的那些组件。 试试我可能会先检查GAC。 它编译和运行良好,但我无法查看赢的窗体devise器和堆栈跟踪根本没有帮助。 最后卸载.net内存分析器,全部恢复。
它几乎就像你必须摧毁你的电脑摆脱旧的DLL。 我已经尝试了上面的所有内容,然后去了删除计算机上.DLL文件的每个实例,并从应用程序中删除每个引用的额外步骤。 然而,它仍然编译得很好,当它运行它引用的dll函数就好了。 我开始怀疑它是否从networking驱动器引用它。
在引用不同版本的相同DLL的应用程序的两个版本之间切换时,我有相同的消息。 虽然我正在testing不同的文件夹,但我不小心将较新的版本复制到旧版本。
因此,首先要检查的是应用程序文件夹中引用的DLL的版本。 以防万一。
也许这有帮助,也许没有。 我清理了我的debugging版本,然后我重命名了OBJ文件夹。 这终于让我充满了希望。 以前的步骤基本上是项目删除引用,并将它们添加回到项目属性中。
引用不同版本的Newtonsoft.json的不同程序集也有同样的问题。 我的解决scheme是从Nuget Package Manager Console运行update-package。