.NET 运行时尝试加载 FSharp.Core 4.3.0,即使所有项目都引用 4.3.1

.NET runtime tries to load FSharp.Core 4.3.0 even if all projects reference 4.3.1

我在 F# 中创建了一个面向 F# 3.1 运行时(即 FSharp.Core 版本 4.3.1)的项目。然后我创建了一个控制台 C# 应用程序,添加了对我的 F# 项目的项目引用,添加了对 FSharp.Core.dll 4.3.1.

的引用

一切都可以编译,没有任何错误或警告,但是当我尝试使用 F# 项目中的任何类型时,运行时会抛出此错误:

System.IO.FileLoadException : Could not load file or assembly 'FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference.

当我所有的项目都引用 4.3.1 时,为什么它搜索 FSharp.Core 4.3.0?如果我将所有项目引用从 4.3.1 更改为 4.3.0,一切都会正常工作,但是版本 4.3.1 怎么了?

P.S。这两个项目都以 .NET 4.5.1 为目标。我使用的是 Microsoft Visual Studio 2013

这是一个大胆的猜测,但根据您得到的异常,您的项目中可能还有其他 FSharp 程序集。

所以错误表明您正在使用的依赖项之一需要 FSharp.Core 4.3.0.0。假设您的项目引用了其他 FSharp 依赖项,例如 FSharp.Data 2.2.0.0。即使,如果您在自己的项目中添加了对 FSharp.Core 4.3.1.0 的显式引用,这也不会起作用,因为 FSharp.Data 2.2.0.0 是针对 FSharp.Core 4.3.0.0 构建的。要解决这个问题,您需要将 bindingRedirect 添加到您的项目配置文件 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="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

这应该可以解决问题。