我刚刚将一个现有项目复制到一台全新的机器上,开始在其上开发,并遇到与我引用的程序集(即发生的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时找到它。
我为什么在寻找旧版本?我还可以在哪里搜索以找到这个不好的参考?
谢谢!相关的程序集更改使其工作。不过,我应该提到的是,在解决方案或其他DLL中没有任何其他项目引用Telerik DLL(为了仔细检查,我也对整个文件夹进行了加密)。尽管如此,我还是不能争取成功! – 2010-11-15 20:01:15
我已经有各种类似的问题与不同的版本加载/不加载。您可以尝试的另一个技巧是手动删除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998文件夹中的所有文件。有时,当重新编译网站时,ASP.Net不会清理该文件夹,因为有些文件锁定,并且这些DLL可能挂在旧的引用上。这值得一试,我知道它在过去对我有用。 – 2010-11-16 01:47:03
您为我解决了一个相关的问题 - 谢谢!我的C#应用程序中的继承形式不会在设计器中打开,因为它正在查找旧版本的引用。原来在引用问题参考的旧版本时已经创建了另一个参考。 – 2011-09-07 16:10:44