我正在尝试Infer.Net(An F# Library for Probabilistic Programming) 在VS11 Beta中运行示例会导致错误:
无法加载文件或程序集'FSharp.Core,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个 依赖。系统找不到指定的文件。
如果我打开dll使用Reflector中的infer.net样本,一个,probcomp.dll,说它无法自动找到“FSharp.Core,Version = 4.0.0.0”,我需要手动选择位置
这两件事是否相关? 是否有可能使用“固定路径”引用编译probcomp.dll,现在它在我的机器上是不一样的?
PS:当然fsharp项目从头开始工作正常......
PS2:visual studio中引用的dll没有显示任何未找到它们的迹象。我可以在对象浏览器中打开它们。
更新
在程序开始时错误发生,没有时间看到任何东西。 然而,它发生在程序内:如果没有调用以下行
let coinsD = inferExpr <@ coins @>
然后错误不会发生。 有了它,在另一个例子中引发了以下错误 不出所料,它来自dll,它在反射器中的行为很奇怪。
无法加载文件或程序集'FSharp.Core,Version = 4.0.0.0, Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个 依赖。 找到的程序集的清单定义没有 匹配程序集引用。 (HRESULT异常:0x80131040)
在对象浏览器中,所述函数的签名非常奇怪:
public static IDistribution<b>inferExpr<b>(**unknown-type e**)
YET,在反射器之后我告诉他在打开dll后在哪里可以找到Fsharp 4.0.0,它有签名
public static IDistribution<b> inferExpr<b>(FSharpExpr<b> e);
这个dll必须有某种奇怪的硬链接依赖关系,而且反射器比VS更聪明(或者不是......)来解决它。
为了从坏事中获益,如果你对这个dll中可能发生的事情有所了解,这可能是一个学习的机会。
答案 0 :(得分:8)
带有
的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="4.0.0.0" newVersion="4.3.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
会解决问题。
答案 1 :(得分:3)
我能够在VS11中以.NET 4.0为目标并使用FSharp.Core 4.0.0.0运行该示例。我在针对.NET 4.5 并将FSharp.Core更改为 4.3.0.0 版本时遇到错误。
所以问题不是dll之间的硬连接依赖关系。将项目属性中的目标框架更改为.NET 4.0,并在参考对话框中小心添加FSharp.Core 4.0.0.0(注意有各种版本的FSharp.Core可用)将解决问题。
在您的情况下,由于缺少F#2.0运行时,请在执行上述步骤之前先安装它。