绑定C#库的重定向

时间:2015-10-23 10:50:37

标签: c#

我有一个需要绑定重定向的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运行绝对正常并读取重定向。问题是编译器抛出一个警告(冲突的程序集),因为在编译时库没有查看配置文件,所以不知道绑定重定向。

很遗憾,我的域名中没有警告。关于如何抑制它的任何想法?或者我如何强迫&#39;我的图书馆要注意重定向?

警告的类型为MSB3277。

3 个答案:

答案 0 :(得分:4)

  

库本身引用可执行文件

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

  

问题是编译器抛出警告

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

  

警告的类型为MSB3277

此警告通常包含更多有用信息,如果您看到这一点,则需要修复机器。否则,请尝试按照警告中显示的提示进行操作,并更改构建详细程度。使用工具&gt;选项&gt;项目和解决方案&gt;构建并运行&gt; “MSBuild项目构建输出详细程度”&gt;改为Diagnostic。

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

  

“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”不是。< / p>

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

general 中,如果项目具有依赖于库但不具有相同版本的库,则会显示此类警告。当它们未安装在GAC中时,这是一个问题,DLL会被复制到您的构建目录,而另一个会覆盖另一个。只有一个才能生存。

MSBuild是为了解决这个问题而编写的,它将根据“最佳猜测”选择其中一个,这可能会造成最小的麻烦。 必须告诉您这一点,而不是您应该压制的那种警告,因为您的某个项目将获得它不期望的库版本。请注意您使用的<bindingRedirect>如何抑制由此引起的正常致命的运行时错误。这是非常不健康的,需要进行彻底的测试。

摆脱警告的唯一正当方法是更改​​项目使用的依赖关系以使版本达成一致。请注意,这并不总是在您的控制之下,它可能不是您自己创建的库。特别是Nuget库的一个问题。在这种情况下,你必须字节子弹。如果公司策略禁止检查使用此警告构建的项目(并且请记住这是不是编译器警告),那么您可以做的唯一合理的事情就是停止使用第三方库。

答案 1 :(得分:2)

您是否尝试the answer that msbuild issue来查看是否还有其他可能错过的冲突?

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

答案 2 :(得分:0)

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