【问题标题】:Binding redirect for C# libraryC# 库的绑定重定向
【发布时间】:2016-01-22 21:14:39
【问题描述】:

我有一个需要绑定重定向的 C# 库。库本身引用了一个可执行文件,我已将重定向放在该可执行文件将使用的配置文件中:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="null" culture="neutral"/>
        <bindingRedirect oldVersion="0.1" newVersion="0.2"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

exe 运行得非常好并读取重定向。问题是编译器会抛出警告(程序集冲突),因为在编译时库不查看配置文件,因此不知道绑定重定向。

很遗憾,我的域中没有警告。关于如何抑制它的任何想法?或者我如何“强制”我的图书馆知道重定向?

警告的类型为 MSB3277。

【问题讨论】:

  • 尝试添加一个 app.config 只重定向到你的库项目。您也可以简单地取消项目设置中的警告。
  • 谢谢,不幸的是 app.config 接近失败(编译器仍然没有读取文件)。我没有运气在 Proj Properties -> Build -> Supress 警告中抑制警告,这可能仅适用于代码级警告吗?尝试输入 MSB3277 和 3277。
  • 我也遇到过类似的问题,但在我的情况下,它是我的解决方案中链接到同一个库的其他库之一,对我来说,我只是删除了它,因为它没有在该库中使用跨度>
  • 警告是好的,一般来说绑定重定向是个坏主意。主要原因是它们让我们回到 DLL 地狱,只能在运行时看到。要调试这些类型的问题,您必须使用 Fusion 日志,并且可能需要很长时间才能弄清楚。我的投票是包括使用 NUGET 的本地副本存储“已批准的 Dll”所需的程序集这更多的是“为什么我们决定将绑定重定向作为最佳实践的替代”......您的环境可能不允许这样做,祝你好运。

标签: c#


【解决方案1】:

您是否尝试过the answerthat msbuild issue,看看是否还有其他您可能遗漏的冲突?

其他工具在该线程中,例如 AsmSpy。

【讨论】:

    【解决方案2】:

    库本身引用了一个可执行文件

    这似乎不太可能,肯定是 EXE 项目引用了该库。

    问题是编译器抛出警告

    这似乎不太可能,这看起来像是 MSBuild 显示的警告,而不是编译器。

    警告的类型为 MSB3277

    这个警告通常包含更多有用的信息,如果你看到的只有这些,你需要修理你的机器。否则,请尝试遵循警告中显示的提示并更改构建详细程度。使用 Tools > Options > Projects and Solutions > Build and Run > "MSBuild project build output verbosity" > 更改为 Diagnostic。

    使用 Build > Rebuild,您现在将在“输出”窗口中获得跟踪。您现在应该会看到类似于以下内容的诊断消息:

    “foobar, Version=1.42.0.0, Culture=neutral, PublicKeyToken="null" 和“foobar, Version=1.666.0.0, Culture=neutral, PublicKeyToken="null" 之间存在冲突。

    “foobar, Version=1.42.0.0, Culture=neutral, PublicKeyToken="null" 被选中,因为它是主要的,而“foobar, Version=1.666.0.0, Culture=neutral, PublicKeyToken="null" 不是。

    或者一些这样的措辞,显然你看到的确切文本对于决定下一步做什么非常重要,当你向任何人寻求帮助时绝不应该省略。


    general中,当您的项目依赖于某个库但该库的版本不同时,就会显示这种警告。当它们没有安装在 GAC 中时,这是一个问题,DLL 被复制到您的构建目录,并且其中一个会覆盖另一个。只有一个可以存活。

    MSBuild 是为解决这个问题而编写的,它会根据“最佳猜测”选择其中一个,哪个可能会造成最少的麻烦。它必须告诉你这一点,而不是那种你应该禁止的警告,因为你的一个项目将获得一个它没有预料到的库版本。请注意您使用的&lt;bindingRedirect&gt; 是如何抑制由此导致的通常致命的运行时错误。它非常不健康,需要彻底测试。

    摆脱警告的唯一体面方法是更改​​项目使用的依赖项,以便版本一致。请注意,这并不总是在您的控制之下,它可能不是您自己创建的库。特别是 Nuget 库的问题。在这种情况下,您确实必须咬紧牙关。如果公司政策禁止签入带有此警告的项目(请记住,这不是编译器警告),那么您可以做的唯一合理的事情就是停止使用 3rd 方库。

    【讨论】:

    • 这没有抓住问题的重点。问题是您如何让 MSBuild 了解您打算为 dll 项目执行的重定向,因为 MSBuild 对其执行版本冲突验证任务,但您无法向 dll 提供 app.config(因为 app.config 用于可执行文件只要)。更改依赖项并不总是一种选择,尤其是在使用 3rd 方引用时,因此发出警告并诉诸重定向是合理的情况,但您不能告诉 MSBuild 对于 dll 项目也不能抑制警告。跨度>
    【解决方案3】:

    尝试 CopyLocal = true 并检查特定版本设置。

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2011-04-25
      • 1970-01-01
      • 2019-02-11
      • 2016-10-31
      相关资源
      最近更新 更多