F#:程序集引用RDotNet.dll未找到或无效

时间:2016-02-21 13:33:34

标签: r f# nuget .net-assembly

尝试加载RProvider.fsx时,收到程序集引用RDotNet.dll未找到或无效的错误

我跟随这个漫步:http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html

2 个答案:

答案 0 :(得分:2)

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

enter image description here

下载并install R(未给出确切的步骤)

安装R类型提供程序

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

enter image description here

点击浏览
输入:RProvider
单击项目

左侧的复选框

enter image description here

单击“安装”

enter image description here

单击“确定”

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 ==========

请注意下图中标有包装已安装的绿色复选标记。

enter image description here

请注意下图中新项目的参考资料。

enter image description here

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

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

给出的示例特定于版本,因为我们知道版本更改,因此请检查将使用的DLL的版本。

在F#项目中 右键单击RProvider引用
右键单击属性

enter image description here

enter image description here

这是完整路径,因此您不必眯眼

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。

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

enter image description here

那么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。

可以使用文件资源管理器

检查

enter image description here

确定这是项目的源目录。

更重要的是,从源目录到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

该示例有效。 e.g。

// 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包时遇到其中一个示例并遇到问题,您可以解决它。

答案 1 :(得分:0)

@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

My directory

编辑:

我首先下载了nuget软件包Rdotnet&amp; Rdotnet.Fsharp,然后我在我的电脑上搜索了dll,

然后我复制了这些文件并将其粘贴到我正在使用的目录中:

您也可以使用__SOURCE_DIRECTORY__找到