我已经在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)。我仔细检查过。
为什么会这样?
答案 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,错误就解决了。