相同程序集的冲突版本

时间:2015-07-29 20:55:29

标签: visual-studio visual-studio-2013 f# assembly-binding-redirect

我正在Visual Studio中创建一个F#项目,我对项目中的每个.fs文件都收到以下警告:

warning FS0082: Found conflicts between different versions of the same dependent assembly. In Visual Studio, double-click this warning (or select it and press Enter) to fix the conflicts; otherwise, add the following binding redirects to the "runtime" node in the application configuration file: <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="FSharp.Core" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" /><bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" /></dependentAssembly></assemblyBinding> (Code=MSB3247)

warning FS0082: No way to resolve conflict between "FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" and "FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a". Choosing "FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" arbitrarily. (Code=MSB3243)

我已经彻底阅读了一些处理同样问题的帖子,但我仍然无法解决问题。在我看到的每一个案例中,该问题都涉及通过NuGet安装的软件包。只需卸载然后重新安装和重新引用软件包即可处理这些情况。但是,由于FSharp.Core是一个无法卸载的内置包,我不知道如何解决这个问题。任何帮助将不胜感激。

编辑(回应马克答案):

我看了一下我的app.config文件,起初它看起来如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="2.0.0.0" newVersion="4.3.0.0" />
        <bindingRedirect oldVersion="2.3.5.0" newVersion="4.3.0.0" />
        <bindingRedirect oldVersion="4.0.0.0" newVersion="4.3.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

然后,我修改它看起来完全像下面的答案。不幸的是,我仍然收到与上面发布的相同的错误消息。然后我注意到我的app.config文件中的代码与下面发布的代码之间存在一些轻微的结构差异,因此我将重定向移动到我的原始配置文件中,如下所示(基本上用一个替换三个绑定重定向): / p>

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="4.3.0.0"
                     newVersion="4.3.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
</configuration>

不幸的是,在运行程序时,我仍然会收到相同的警告消息。我不确定这是否是问题,但链接中的示例似乎处理FileNotFound异常,而我的构建似乎能够找到两个文件,当它真的只需要一个。但是,我真的不太了解F#或Visual Studio,所以差异可能无关紧要。

2 个答案:

答案 0 :(得分:3)

假设您已安装F#3.1,请按以下方式redirect FSharp.Core 4.3.0 to FSharp.Core 4.3.1

将其添加到app.config或web.config文件中:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core"
                          publicKeyToken="b03f5f7f11d50a3a"
                          culture="neutral"/>
        <bindingRedirect oldVersion="4.3.0.0"
                         newVersion="4.3.1.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

答案 1 :(得分:1)

回应Avery的编辑:

对于涉及不同版本的FSharp.Core的项目,我遇到了类似的问题。关键问题是VS并不总是正确地放置FSharp.Core.dll。最可能发生的是:

  • 您的项目输出目录包含FSharp.Core.dll - 它的某个版本。
  • 您构建项目。由于程序集重定向,引用错误消失了。所有代码都是针对4.3.1.0版本构建的
  • 构建的程序集放在输出目录中。 FSharp.Core.dll不会再次放置,VS认为它已经存在。
  • 您运行代码。此时,它找到了错误版本的FSharp.Core。

解决方案是在构建之前清理项目输出目录。你通过创建一个新项目隐含地做到了这一点,之后你看到一切正常。

我现在通常使用包含FSharp.Core的.props文件创建所有F#项目。该props文件在我的存储库中的所有项目之间共享。如果有语言升级,我只需要更改道具文件,让我的所有项目都使用FSharp.Core的一致版本。