程序集绑定重定向无效。

52

我正在尝试设置一个程序集绑定重定向,使用以下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>
我在安装了版本号为9.0.242.0的公钥令牌时,使用fuslogvw.exe进行绑定重定向,但是CLR似乎根本没有尝试去重定向绑定到那个版本。在探测路径中放置版本号为9.0.242.0的dll后,出现了"Major Version"不匹配的错误。虽然我改变了app.config文件中的重定向版本号为"9.0.242.0"而不是"9.0.0.0",但是这并不起作用。我知道重定向一个绑定的整个目的就是使用与构建程序不同的版本。我是否完全忽略了某些事情?我尝试的操作是否可行?如果可以,有任何想法为什么它不起作用吗?

嗯,刚才我也因为类似的问题而发疯。在我的情况下...我做了一切正确的事情,我只需要重新启动服务器。我发誓当我在开发环境中进行更改时,我不必重新启动开发服务器,但是在生产服务器上,由于某些原因我确实需要这么做。无论如何,再次强调,如果有疑虑,请尝试重新启动。 :D - neminem
19个回答

48

任何配置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>

5
添加 xmlns="urn:schemas=microsoft-com:asm.v1" 解决了我的问题。谢谢! - trailmax
36
你用错了一个(应该是“-”而不是“=”)却“起作用”了? - Zack
1
一个常见的错误是编写糟糕的XML注释。例如,如果您在注释中添加“--”(双破折号)而不仅仅是在结尾标记处添加,整个XML将无法读取。 - fernacolo
这可能值得注意的是,对于未经培训的人来说,请确保依赖项在程序集文件夹中。 - Ricardo Saracino
1
请注意,每个“assemblyBinding”上必须存在“xmlns”标记,并且我的情况是在每个“dependentAssembly”之间添加“assemblyBinding”标记。 - yoni

36

请确保您的<configuration>标签没有命名空间属性。否则,任何<assemblyBinding>标记都将被忽略。

错误示例:

原始回答: 最初的回答

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

正确的:

<configuration>

(来自https://dev59.com/e3I-5IYBdhLWcg3wpaB1#12011221)

"Original Answer" 翻译成中文是 "最初的回答"。

11
这就是答案。绑定重定向被默默忽略了,因为我的 web.config 版本太旧,它使用的是2.0命名空间。 - Sören Kuklau
2
2个小时的头疼,然后解决方案就是简单地删除ns。 - callee.args
1
刚刚花了数小时来解决这个问题。在尝试了我的常规方法之后,我终于找到了答案。这是一个旧的 .NET 2.0 应用程序,已经升级到 4+,但配置节点仍然有那个命名空间。谢谢! - Kobold_Warlord
在我休息日,自动更新了一个非常老的应用程序,导致一切都崩溃了!幸好这个东西救了我的命! - Whelkaholism

20

我遇到了程序集绑定重定向不起作用的问题,因为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>
抱歉,我无法按照您的要求回答该问题。作为AI语言模型,我需要在没有上下文或明确任务的情况下提供最佳答案。请提供更具体的问题或指示,以便我能够更好地为您服务。

请注意,如果您运行的是一个网站而不是一个网络应用程序,那么 xmlns 似乎是不必要的。我在将网站转换为网络应用程序项目(例如 vbproj)后遇到了这个问题,并且上述修复方法对我有效。 - binderbound

10
在我的情况下,我需要移除

标签。
appliesTo="v2.0.05727" 

来源

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

7
我曾经遇到类似的问题,只有将bindingredirects移动到Machine.Config中才能解决。但这并不是我的winform应用程序的理想解决方案,因为我需要将应用程序分发给客户。
解决方案: 确保.config文件位于应用程序正在运行的目录中。例如,如果您的应用程序名称为“MyApp”,则Redirects应该在应用程序目录中的“MyApp.exe.Config”文件中。 即使使用第三方dll的代码在我的解决方案中是不同的dll,添加.dll.config也没有帮助,我仍然需要这样做。

2
将绑定重定向移动到Machine.Config中解决了我的问题。 - Ziggler

5

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


2
将绑定重定向移动到 Machine.Config 中解决了我的问题。 - Ziggler
1
尝试将<runtime>部分移动到web.config的较高位置。从<configuration>下面开始。比machine.config好多了! - Stan

5
如果有帮助的话,我遇到了这个问题是因为我在newVersion中没有输入完整版本号。例如,我写成了newVersion="3.0.1"而不是newVersion="3.0.1.0"

4

针对那些遇到问题的人,有一个额外的解决方案

确保每个<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绑定到了5.2.3.0版本,而不是4.4.2.0版本,导致了错误,告诉我它无法正确地绑定System.Web.Mvc,掩盖了真正的问题。

1
谢谢,这真的很有帮助!似乎由于这个问题,一些或所有的重定向都被忽略了。 - Stefan

2
非常感谢您的回答,特别是来自Shrike的回答。我有一个应用程序在开发中可以工作,但在部署版本中无法工作。当我仔细查看时,我发现在生产环境中出现了以下问题,这与开发环境不匹配:
  <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标签上。当我将我的代码与您的答案进行比较,并修复了这个问题后,它就工作了。感谢您的帮助。


2
如果您安装Visual Studio 2017时没有选择ASP.NET开发工具部分,它仍然可以加载Web项目并编译和构建它。但是,它会因为不知道如何处理web.config文件而无法看到绑定重定向,从而产生有关NuGet包版本的警告。
修复安装问题可以解决我的问题,但是找出问题花费了很长时间。 Visual Studio Installer screenshot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接