程序集绑定重定向不起作用

时间:2010-08-16 03:05:45

标签: c# .net binding assemblies reference

我正在尝试使用以下app.config设置程序集绑定重定向:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.AnalysisServices"
                          PublicKeyToken="89845dcd8080cc91" />
        <bindingRedirect oldVersion="10.0.0.0"
                         newVersion="9.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我正在使用指定的公钥令牌在GAC中使用版本9.0.242.0的计算机上运行该程序。 CLR似乎甚至没有尝试重定向绑定以使用该版本。

以下是我在fuslogvw.exe中的内容:

LOG: This bind starts in default load context. LOG: Using application configuration file: \Debug\AssemblyRedirectPOC.exe.Config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: Post-policy reference: Microsoft.AnalysisServices, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.DLL. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices.EXE. LOG: Attempting download of new URL /Debug/Microsoft.AnalysisServices/Microsoft.AnalysisServices.EXE. LOG: All probing URLs attempted and failed.

当我尝试将9.0.242.0版本的dll放在探测路径中时,我得到了这个:

LOG: Assembly download was successful. Attempting setup of file: \Debug\Microsoft.AnalysisServices.dll LOG: Entering run-from-source setup phase. LOG: Assembly Name is: Microsoft.AnalysisServices, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 WRN: Comparing the assembly name resulted in the mismatch: Major Version ERR: The assembly reference did not match the assembly definition found. ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

请注意,我也尝试将重定向更改为在app.config中使用“9.0.242.0”而不是“9.0.0.0”,但这不起作用,尽管我认为它不应该有任何区别。< / p>

根据我的理解,重定向绑定的重点是使用与程序构建的版本不匹配的版本。我在这里完全遗漏了什么吗?我正在尝试做什么,如果是的话,任何想法为什么它不起作用?

干杯, 亚当

16 个答案:

答案 0 :(得分:25)

配置xml中的任何拼写错误都可能是原因。加载器无法看到您的配置。 我还有一个小时的头痛,直到我意识到错误在模式名称中的字符“=”而不是“ - ”:

<assemblyBinding xmlns="urn:schemas=microsoft-com:asm.v1">

仔细检查所有属性名称和值。我猜“PublicKeyToken”应该是“publicKeyToken”

这应该有效:

<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.AnalysisServices" publicKeyToken="89845dcd8080cc91" />
            <bindingRedirect oldVersion="10.0.0.0" newVersion="9.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>

答案 1 :(得分:16)

确保您的<configuration>代码无名称空间属性。否则,将忽略任何<assemblyBinding>标记。

错:

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

右:

<configuration>

(来自https://stackoverflow.com/a/12011221/150370

答案 2 :(得分:11)

我遇到程序集绑定重定向无法正常工作,因为assemblyBinding元素上缺少名称空间。

<强>正确

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>

<强>不正确

注意缺少:xmlns =“urn:schemas-microsoft-com:asm.v1”

<assemblyBinding>
  <dependentAssembly>
    <assemblyIdentity name="TIBCO.Rendezvous" publicKeyToken="1a696d1f90f6158a"/>
    <bindingRedirect oldVersion="1.0.0.0-1.0.3191.28836" newVersion="1.0.3191.28836"/>
  </dependentAssembly>

答案 3 :(得分:4)

在我的情况下,我不得不删除

appliesTo="v2.0.05727" 

<assemblyBinding appliesTo="v2.0.05727" xmlns="urn:schemas-microsoft-com:asm.v1">

答案 4 :(得分:3)

当我将绑定重定向配置移动到machine.config文件时,我的问题得以解决。

答案 5 :(得分:3)

我有类似的问题,将bindingredirects移动到Machine.Config是唯一有效的方法。这在我的winform应用程序中并不理想,因为我将我的应用程序分发给客户。

<强>解决方案:

确保.config文件位于运行应用程序的目录中。例如如果您的AppName是“MyApp”,则重定向应该位于应用程序目录中的“MyApp.exe.Config”文件中。

即使在我的解决方案中使用第三方dll的代码在不同的dll中并且添加.dll.config也没有帮助,我必须这样做。

答案 6 :(得分:1)

偏心密码策略也会导致配置中的assemblyBinding项被忽略。像'&amp;'这样的人物并且在配置文件中显然不允许使用'^'。 Notepad ++中的XML工具在使用程序集绑定日志查看器进行了几个小时的调整后向我展示了这一点。

答案 7 :(得分:1)

如果安装不带ASP.NET开发工具的Visual Studio 2017,它仍将加载Web项目并进行编译和构建。它只会发出有关NuGet软件包版本的警告,因为它不知道如何处理web.config文件,因此看不到绑定重定向。

修复安装后,我的问题解决了,但花了很长时间才弄清楚。

Visual Studio Installer screenshot

答案 8 :(得分:0)

如果它对任何人有任何帮助,我遇到了这个,因为我没有将完整版本用于newVersion。即,我有newVersion="3.0.1"而不是newVersion="3.0.1.0"

答案 9 :(得分:0)

检查是否有错误 xxx上的显式绑定重定向,Culture = neutral,PublicKeyToken = xxx“与自动生成的绑定重定向冲突

出现在输出窗口中(它不会出现在错误窗口中)

答案 10 :(得分:0)

非常感谢你的答案,特别是来自伯劳鸟的答案。我有一个应用程序在开发中工作,但在部署版本中没有。当我仔细观察时,我在生产中有这个,它与开发不匹配:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly xmlns="">
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

dependentAssembly xmlns =“”是罪魁祸首。一旦我将我的答案与你的答案进行比较,并解决了这个问题,它就有效了。谢谢你的帮助

答案 11 :(得分:0)

还为那些挣扎中的人们提供了另一种解决方案

确保每个<dependentAssembly>只有一个<assemblyIdentity>和一个<bindingRedirect>。在我的场景中,我是二合一的,这会导致多个绑定重定向的级联失败

<dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />

        <assemblyIdentity name="SimpleInjector" publicKeyToken="984cb50dea722e99" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.2.0" newVersion="4.4.2.0" />
</dependentAssembly>

这意味着不是我的SimpleInjector绑定到4.4.2.0,而是绑定到5.2.3.0,这导致错误告诉我它无法正确地绑定System.Web.Mvc,从而掩盖了真实的问题< / p>

答案 12 :(得分:0)

我将身份冒充设置为true,将其更改为false并为我工作

答案 13 :(得分:0)

好吧,在我的情况下,我在dependentAssembly节点之外有一个assemblyBinding节点。错误的复制粘贴。

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>    
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
    </dependentAssembly>

  </runtime>

答案 14 :(得分:0)

即使culture="neutral"(或您的情况下不管它的值)在此处或其他地方的某些答案中也没有出现,对我而言,这是至高无上的:当我添加它时,一切都很好。

发帖人从未说过他的问题是什么,所以也尝试一下。

答案 15 :(得分:0)

我正在尝试提供清单以及解决问题的工具。

  1. 目标 newVerion 程序集应正确定位。使用 Sysinternals(link) 的“进程监视器”工具来跟踪程序集的搜索方式
  2. 检查目标程序集的版本是如何解析的。按照this帖子中的步骤启用Fusion(.NET Framework的程序集加载器)的日志输出,然后检查具有目标程序集名称的文件
  3. 注意解析目标程序集时 Fusion 读取的配置文件的名称。