【问题标题】:How do I make assembly redirection work in a .net 4.0 web app如何使程序集重定向在 .net 4.0 Web 应用程序中工作
【发布时间】:2025-12-17 20:35:01
【问题描述】:

我正在使用 asp.net 4.0 开发基于 Web 的应用程序。

我在 GAC 中使用了一些 dll,它们对旧的 dll 有一些嵌入式依赖项。

我已经配置了程序集,以便依赖项重定向到我机器上正确版本的 dll。这在 3.5 或更低版本的应用程序中完美运行,但是,当我尝试基于相同的 dll 构建 asp.net 4.0 应用程序时,它会出现如下错误:

Could not load file or assembly 'ControlReferencedByMyDll, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=XXXXXXXXXXXXXXXX' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference. 
(Exception from HRESULT: 0x80131040) 

我的 ControlReferencedByMyDll 版本是 2.0.1.0。

我找不到 .net 4.0 的 GAC 配置实用程序,但在我的 machine.config(在 .net 4.0 的 Framework 和 Framework64 文件夹中)我添加了类似的内容:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="ControlReferencedByMyDll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

看看这是否是问题所在。

我什至尝试将 applyTo="v2.0.50727" 属性添加到 assemblyBinding 以查看它是否有所作为。

但好像没有。

还有其他人遇到过这个问题吗?更重要的是,谁能帮我解决这个问题?

【问题讨论】:

  • 好的,我发现了一些似乎可行的方法,尽管如果存在更好的答案,我仍然有兴趣看到更好的答案,也许有人可以告诉我为什么这样做。我只是将上面显示的代码直接放入我的 web.config 中,一切都很好。

标签: asp.net .net-4.0 asp.net-4.0 gac


【解决方案1】:

不知过了这么久有没有帮助,但我遇到了以下问题。

我有一个类似的重定向:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="test.dll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

而且,虽然它在以前的版本中可以工作,但在 4.0 上也不能工作。

我从名称中删除了“.dll”,现在它可以工作了!!!

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="test" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

希望它可以帮助下一个让他头疼了几个小时的可怜人。

【讨论】:

  • 谢谢!我不得不从 assemblyBinding 中删除“appliesTo”属性,因为它引用了 .NET 2
  • 谢谢,我有相反的情况,必须在名称中添加“dll”。
【解决方案2】:

好的,我没有看到任何额外的反馈,此时,我还没有确定 .config 文件是否/在哪里被 machine.config 和 web.config 覆盖,但这是可行的。

我添加类似于以下的代码:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="ControlReferencedByMyDll" PublicKeyToken="XXXXXXXXXXXXXXXX"/>
      <bindingRedirect oldVersion="1.0.0.0-9.9.9.9" newVersion="2.0.1.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

直接到我的 web.config 文件。

我提交此内容是为了回答我自己的问题,但如前所述,如果您碰巧知道更好的方法,或者知道是什么导致 machine.config 和 web.config 之间断开连接,请分享。

谢谢

【讨论】:

    最近更新 更多