Asp.net .Net拾取错误的引用程序集版本

Asp.net .Net拾取错误的引用程序集版本,asp.net,dll,Asp.net,Dll,我刚刚将一个现有的项目复制到一台全新的机器上开始开发,但我的一个引用程序集(一个telerik DLL)的版本出现了问题 该项目最初引用了程序集的旧版本(我们称之为v1.0.0.0)。我的新机器安装了最新版本的程序集,所以我想我已经更新了它(我们称之为新版本v2.0.0.0) 现在问题来了:如果我将旧的v1.0.0.0 dll复制到项目文件夹中,并将其添加为引用,那么网站将毫无问题地启动。如果删除该引用(同时从系统中删除旧DLL)并添加新版本(v2.0.0.0),则页面会显示以下异常: 无法加载

我刚刚将一个现有的项目复制到一台全新的机器上开始开发,但我的一个引用程序集(一个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的异常:0x8013100)

显然,代码正在寻找过时的版本,但找不到它。但是为什么呢

我在解决方案文件夹中搜索该版本号,但找不到任何引用。我仔细检查了.csproj文件的文本,发现该版本正确地显示了最新版本,HintPath正确地显示了新DLL的路径。此外,因为我没有在系统上安装旧的DLL,所以它没有显示在我的GAC中(尽管v2.0.0.0如预期的那样显示)

然后,我启用了fusion log viewer,试图找出它为什么要查找旧版本,但运气不好:

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中本地找到时,却找不到它


为什么我的要找旧版本?我还可以在哪里搜索以找到此错误引用?

我猜您正在使用的另一个程序集正在引用旧的dll。您是否熟悉正在使用的所有其他项目参考资料,其中是否有任何项目参考资料涉及Telerik DLL

您能像这样在web.config文件中放入绑定重定向吗

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


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

我支持Chris Conway的这一点(支持他)。问题是,您正在引用项目中的一个telerik程序集,而该程序集引用了另一个不存在的程序集

第一件事:我不会将任何供应商(即telerik)的组件安装到GAC中。Telerik的东西被编译成两个程序集(Telerik.web.design和Telerik.web.ui)。只需将它们与应用程序一起部署即可

其次,在每个.proj文件(如.csproj)中都会有一个指向Telerik.Web.UI文件的
。这通常包含一个版本号。确保放入bin文件夹的程序集与该版本匹配

第三,确保所有项目都使用最新的程序集。还要确保他们从本地路径而不是GAC抓取程序集。(我真的很不喜欢GAC。它在我参与的一些项目中引起了无穷无尽的问题)。我们通常有一个“Assemblies”文件夹,所有项目都将其用于外部程序集引用

第四,每当加载网站项目时,VisualStudio都会自动搜索gac,如果在gac中找到了某些内容,则会重新定位程序集位置。我不记得它是否曾经在web应用程序项目中这样做过,但我已经很久没有遇到这个问题了。这可能会在部署期间导致类似问题

第五,您可以在web.config中重新绑定程序集的版本号。在
运行时/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_deployableAssemblies文件夹中。
这意味着在构建项目时,旧程序集正在覆盖GAC程序集。

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

如果在Visual Studio环境(ASP.NET Development Server)中测试和/或调试应用程序时遇到此问题,则必须删除开发网站文件夹中的所有临时文件。要知道该文件夹的位置,请在Windows任务栏图标上查找ASP.NET开发服务器图标(其标题应如下所示:ASP.NET开发服务器-端口#####),右键单击该图标并选择“显示详细信息”;thn,字段物理路径将告诉您临时文件夹是什么,应该删除其中的所有项目以解决问题。重新构建并运行网站,问题应该得到解决(同样,针对开发环境)

  • 转到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG
  • 查找machine.config文件
  • 在记事本中打开
  • 查找冲突dll
  • 删除此文件并保存
  • 编译程序集

    addassembly=dllName,版本=1.0.0000.0000 C
    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
        <OutputPath>bin\Release-ABC</OutputPath>
        <PlatformTarget>x64</PlatformTarget>
    </PropertyGroup>