使用 VS 2017 时无法解析对程序集 FSharp.Core 4.4.1.0 的依赖

Cannot resolve dependency to assembly FSharp.Core 4.4.1.0 when using VS 2017

我在 VS 2015 和 F# 4.0 (4.4.0.0) 中开发已经有一段时间了。

随着 VS 2017 的发布,我想在最新的 VS 中打开解决方案进行开发工作,但仍然暂时将项目保留为 VS 2015、F# 4.0、.NET 4.5.2。构建服务器还必须使用 VS 2015 一段时间。

在我的记忆中,这种场景在早期的VS版本升级中并没有出现问题,但后来我想我当时没有使用F#。

我打开解决方案并尝试编译。我在 C# 应用程序项目中遇到此错误。 (还有其他 C# 应用程序,至少有一个引用了 F# 库。)

未知构建错误,'无法解析对程序集 'FSharp.Core, Version=4.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 的依赖性,因为它尚未预加载。使用 ReflectionOnly API 时,必须通过 ReflectionOnlyAssemblyResolve 事件预加载或按需加载依赖程序集。

我在解决方案中的所有 F# 项目都是 4.0 (4.4.0.0)。我仔细检查了。

为什么会这样?

我搜索“4.4.1.0”,发现 C# 项目的 "obj" 文件夹中有一个与 app.config 不同的 .exe.config 文件。它具有不在项目 app.config 中的额外信息。

<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.4.1.0" newVersion="4.4.1.0" />
      </dependentAssembly>
    </assemblyBinding>

为什么它会自动附加,为什么只在这个特定的 C# 项目中附加?

我试图将该部分复制到项目的 app.config,并在两个地方都将其更改为 4.4.0.0,但这没有用。也试过用“4.4.1.0”作为旧版本的上限,用“4.4.0.0”作为新版本,但还是不行。相同的编译器错误。

然后我删除了那部分,并在 C# 项目中引用了 FSharp.Core 4.4.0.0。那终于摆脱了编译错误。

我运行的程序。它因此异常而崩溃。

未处理的异常:无法加载文件或程序集 'FSharp.Core, Version=4.4.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

我重新插入了带有重定向的部分,现在程序运行正常。

总结一下,我添加了对 FSharp.Core 4.0 的引用,重定向看起来像这样

<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" />

通过这些修改,该解决方案在 VS 2015 中仍能按预期工作。

检查消息中程序集的程序集引用。对我来说,我有一个对程序集 X 的引用,它对 Y 有一个引用。因为缺少 Y,所以我得到了这个错误。通过引用 Y,错误已为我解决。

我遇到了同样的问题,也许这对某人有帮助:

就我而言,原因是我的一些 C# 项目对 FSharp.Core 具有传递依赖性,它们引用了直接安装在我系统上的运行时程序集,而不是使用 NuGet 包。 IE。该引用没有指向 NuGet 包文件夹的提示路径,因此从 F# SDK 中选择 C:\Program Files\FSharp\... 的程序集。我通过删除引用并重新安装 FSharp.Core NuGet 包解决了这个问题。

所以这个:

<Reference Include="FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

变成:

<Reference Include="FSharp.Core, Version=4.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\..\..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll</HintPath>
  <Private>True</Private>
</Reference>