【问题标题】:F#: Assembly reference RDotNet.dll was not found or is invalidF#:程序集引用 RDotNet.dll 未找到或无效
【发布时间】:2016-02-21 13:33:34
【问题描述】:

在尝试加载 RProvider.fsx 时,我收到一个错误,指出未找到程序集引用 RDotNet.dll 或无效

我正在关注这个演练:http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html

【问题讨论】:

  • 那么,你能找到这个程序集吗?
  • 这应该会有所帮助:How does F# Interactive #I command know about project path? 我还建议,如果您使用 VS 打开 F# 项目,请通过 VS 使用 NuGet 安装 R,在项目中添加对 R 的引用,然后打开 F# Interactive从项目中,然后该示例应该可以工作。让它工作的诀窍是正确设置__SOURCE_DIRECTORY__
  • 我在我的电脑上找到了它,但由于某种原因我无法将它添加到我的参考 && @guy 编码器中,我会尝试它
  • @GuyCoder 感谢这工作!
  • 您应该发布确切的详细信息作为答案并获得一些分数。屏幕截图很好。另请参阅答案中的另一页。也做一个printfn __SOURCE_DIRECTORY__ 来显示无效的,然后是正确的。

标签: r f# nuget .net-assembly


【解决方案1】:

使用 Visual Studio 15(我使用免费社区版)
创建新的 F# 控制台项目:UseNuGetPackage(未给出具体步骤)

下载并install R(未给出具体步骤)

安装 R 类型提供程序

在 Visual Studio 中使用解决方案资源管理器
右键单击 F# 项目,例如UseNuGetPackage
选择:管理解决方案的 NuGet 包

点击浏览
输入:RProvider
单击项目左侧的复选框

点击安装

点击确定

Visual Studio 输出窗口显示:

Attempting to gather dependencies information for package 'RProvider.1.1.15' with respect to project 'UseNuGetPackage', targeting '.NETFramework,Version=v4.5.2'
Attempting to resolve dependencies for package 'RProvider.1.1.15' with DependencyBehavior 'Lowest'
Resolving actions to install package 'RProvider.1.1.15'
Resolved actions to install package 'RProvider.1.1.15'
Adding package 'DynamicInterop.0.7.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'DynamicInterop.0.7.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'DynamicInterop.0.7.4' to 'packages.config'
Successfully installed 'DynamicInterop 0.7.4' to UseNuGetPackage
Adding package 'R.NET.Community.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.1.6.4' to 'packages.config'
Successfully installed 'R.NET.Community 1.6.4' to UseNuGetPackage
Adding package 'R.NET.Community.FSharp.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.FSharp.1.6.4' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'R.NET.Community.FSharp.1.6.4' to 'packages.config'
Successfully installed 'R.NET.Community.FSharp 1.6.4' to UseNuGetPackage
Adding package 'RProvider.1.1.15' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'RProvider.1.1.15' to folder 'c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages'
Added package 'RProvider.1.1.15' to 'packages.config'
Successfully installed 'RProvider 1.1.15' to UseNuGetPackage
========== Finished ==========

请注意,图像下方的绿色复选标记表示已安装该软件包。

请注意图片下方的项目新引用。

要使以下两个语句起作用,我们需要验证一些路径。

#I "../packages/RProvider.1.0.11"
#load "RProvider.fsx"

给出的示例特定于某个版本,并且我们知道版本会发生变化,因此请检查将使用的 DLL 的版本。

在 F# 项目中
右键单击 RProvider 参考
右键属性

这里是完整的路径,所以你不必眯着眼睛

c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\packages\RProvider.1.1.15\lib\net40\RProvider.dll

示例使用版本RProvider.1.0.11,我们有RProvider.1.1.15 所以我们需要将示例中的行更新为

#I "../packages/RProvider.1.1.15"

如果您查看大量示例,其中从 NuGet 下载包然后将其与 F# Interactive 一起使用,您将看到相同的模式来启动它。

#I "../packages/<Name_XYZ>.<Version>"
#load "<Name_XYZ>.fsx"

这是因为此代码假定您已使用 NuGet 在 VS 项目中安装所需的 DLL,并且 DLLS 位于与项目源代码相关的packages 目录中。如果您回头查看我为输出窗口提供的清单,您会看到 DLL 的复制。

它们显示在文件资源管理器中

那么,当 F# Interactive 只有相对路径时,它如何知道如何查找 DLL。

现在我们省略了神奇的缺失部分,因为它是 阴谋测试新手。 :-)

F# Interactive 具有属性__SOURCE_DIRECTORY__,它给出了 VS 项目中源目录的位置。这可以在 F# Interactive with 中看到

printfn __SOURCE_DIRECTORY__

我的例子是

c:\users\eric\documents\visual studio 2015\Projects\UseNuGetPackage\UseNuGetPackage
val it : unit = ()

如果您获得包含AppData 的目录,则重新启动 F# Interactive。

这可以通过文件资源管理器检查

果然这是项目的源目录。

更重要的是,从源目录到 NuGet 包的路径是

../packages

所以所有路径看起来都不错。

现在我们已经更新并检查了加载 DLL 的脚本行,试一试。

我们得到错误:

error FS0082: Could not resolve this reference. Could not locate the assembly "RDotNet.FSharp.dll".

问题是RProvider.fsx中提到的具体版本

// Standard NuGet locations for R.NET
#I "../R.NET.Community.1.5.16/lib/net40"
#I "../R.NET.Community.FSharp.0.1.9/lib/net40"

如果我们用

替换#load "RProvider.fsx"
#r "../packages/R.NET.Community.1.6.4/lib/net40/RDotNet.dll"
#r "../packages/R.NET.Community.FSharp.1.6.4/lib/net40/RDotNet.FSharp.dll"
#r "../packages/RProvider.1.1.15/lib/net40/RProvider.dll"
#r "../packages/RProvider.1.1.15/lib/net40/RProvider.Runtime.dll"

open RProvider
do fsi.AddPrinter(fun (synexpr:RDotNet.SymbolicExpression) -> synexpr.Print())

open System
open RDotNet
open RProvider
open RProvider.graphics
open RProvider.stats

该示例有效。例如

// Random number generator
let rng = Random()
let rand () = rng.NextDouble()

// Generate fake X1 and X2 
let X1s = [ for i in 0 .. 9 -> 10. * rand () ]
let X2s = [ for i in 0 .. 9 -> 5. * rand () ]

// Build Ys, following the "true" model
let Ys = [ for i in 0 .. 9 -> 5. + 3. * X1s.[i] - 2. * X2s.[i] + rand () ]

let dataset =
    namedParams [
        "Y", box Ys;
        "X1", box X1s;
        "X2", box X2s; ]
    |> R.data_frame

let result = R.lm(formula = "Y~X1+X2", data = dataset)

let coefficients = result.AsList().["coefficients"].AsNumeric()
let residuals = result.AsList().["residuals"].AsNumeric()

let summary = R.summary(result)
summary.AsList().["r.squared"].AsNumeric()

R.plot result

正如 Tomas 在他的回答中指出的那样,fsx 文件中的版本号存在错误,但他能够更新源代码并制作新的 alpha 版本。 :)

希望我提供了足够的详细信息,以便您下次看到这些示例中的一个使用带有 F# Interactive 的 NuGet 包并遇到问题时可以解决它。

【讨论】:

    【解决方案2】:

    RProvider.fsx 中存在一个错误,它引用了错误的 R.NET 版本。 version 1.1.16-alpha has a fix for this,但我们还没有发布新的非测试版。

    如果您安装 1.1.16-alpha,您能否检查它是否正常工作?

    【讨论】:

      【解决方案3】:

      @GuyCoder 的链接帮助了我:How does F# Interactive #I command know about project path?

      我在我的计算机上搜索了丢失的 .dll 文件,并粘贴到了源目录的父文件夹中。 之后一切正常

          #I "../packages/RProvider.1.1.15"
      (*
      #r "RDotNet.dll"
      #r "RDotNet.FSharp.dll"
      These 2 are unnecessary*)
      #load "RProvider.fsx"
      
      
      open System
      open RDotNet
      open RProvider
      open RProvider.graphics
      open RProvider.stats
      

      编辑:

      我首先下载了 nuget 包 Rdotnet 和 Rdotnet.Fsharp,然后我在我的计算机上搜索了 dll,

      然后我将这些文件复制并粘贴到我正在工作的目录中:

      您也可以通过__SOURCE_DIRECTORY__ 找到它

      【讨论】:

      • 编辑比较好,但答案是错误的。您需要删除您复制的文件,并弄清楚如何使用正确设置的__SOURCE_DIRCTORY__ 启动 F# Interactive,以便提供程序页面中给出的示例有效。这就是评论试图解释的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2015-04-09
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多