无法在infer.net中加载FSharp.Core版本4.0.0有趣//在dll中使用硬链接依赖?

时间:2012-03-10 12:27:26

标签: .net dll .net-4.0 f# reflector

我正在尝试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中可能发生的事情有所了解,这可能是一个学习的机会。

2 个答案:

答案 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运行时,请在执行上述步骤之前先安装它。