使用VS 2017

时间:2017-03-08 08:00:13

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

我已经在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)。我仔细检查过。

为什么会这样?

3 个答案:

答案 0 :(得分:17)

我搜索了" 4.4.1.0",并发现" obj" C#项目的文件夹有一个与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,但这并不起作用。还尝试使用&#34; 4.4.1.0&#34;作为旧版本的上限,并且具有&#34; 4.4.0.0&#34;作为新版本,但仍然没有工作。相同的编译器错误。

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

我跑了这个节目。它因此异常而崩溃。

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

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

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

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

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

答案 1 :(得分:2)

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

在我的情况下,原因是我的一些与FSharp.Core具有传递依赖关系的C#项目正在直接引用安装在系统上的运行时程序集,而不是使用NuGet包。即该引用没有指向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>

答案 2 :(得分:-2)

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