【问题标题】:Cannot resolve dependency to assembly FSharp.Core 4.4.1.0 when using VS 2017使用 VS 2017 时无法解析对程序集 FSharp.Core 4.4.1.0 的依赖
【发布时间】:2018-09-18 17:24:14
【问题描述】:

我已经在 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,版本=4.4.1.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的依赖,因为它尚未预加载。使用 ReflectionOnly API 时,依赖程序集必须预先加载或通过 ReflectionOnlyAssemblyResolve 事件按需加载。

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

为什么会这样?

【问题讨论】:

    标签: f# visual-studio-2017 f#-4.1


    【解决方案1】:

    我搜索“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,版本=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 中仍然可以正常工作。

    【讨论】:

    • 上述问题出现在使用 F# 库的 C# 程序中。今天我在VS 2017中使用F# 4.0.0.0的F#程序也遇到了类似的问题。没有编译错误,只有上面的运行时错误。我通过使用 bindingRedirect 解决了它,如此处所述。我不明白为什么这只发生在我的某些程序中。
    • 似乎我无法在调试过程中检查表达式。添加手表会显示错误:错误 CS1705:具有标识“x”的程序集“x”使用“FSharp.Core,版本=4.4.1.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”,其版本高于引用的程序集“FSharp。核心',身份为 'FSharp.Core, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
    • 有趣的是,我一遍又一遍地回到自己的解决方案。我已经数不清了。这次是“应用程序处于中断模式/类型初始化异常未处理”在启动时,甚至在它进入主程序之前,我已经花了 1.5 小时删除所有其他可能的来源,然后再次登陆这里......使用 FsXaml 时会发生这种情况。几个月后问题就消失了,但又像回旋镖一样卷土重来。呸!
    • 注意:如果您使用 .NET Framework 4.6.* 和 F# 4.1,您的问题可能只是需要添加对 FSharp.Core 4.4.1.0 的引用(不是 Microsoft.FSharp.. .) 在出现此错误的 C# 项目中。
    【解决方案2】:

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

    在我的例子中,原因是我的一些在 FSharp.Core 上具有传递依赖的 C# 项目直接引用了安装在我的系统上的运行时程序集,而不是使用 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>
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 2014-06-09
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        相关资源
        最近更新 更多