F#:程序集引用 RDotNet.dll 未找到或无效
F#: Assembly reference RDotNet.dll was not found or is invalid
在尝试加载 RProvider.fsx 时,我收到一条错误消息,指出程序集引用 RDotNet.dll 未找到或无效
我正在关注这个演练过程:http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html
@GuyCoder 的 link 帮助了我: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__
找到
RProvider.fsx
中存在错误,它引用了错误版本的 R.NET。 version 1.1.16-alpha has a fix for this,但我们还没有发布新的非测试版。
如果安装 1.1.16-alpha,你能检查一下它是否正常工作吗?
使用 Visual Studio 15(我使用免费社区版)
创建新的 F# 控制台项目:UseNuGetPackage(未给出具体步骤)
下载并install R(未给出具体步骤)
安装 R 类型提供程序
在 Visual Studio 中使用解决方案资源管理器
右键单击 F# 项目,例如使用NuGetPackage
Select:管理解决方案的 NuGet 包
点击浏览
输入:RProvider
单击项目左侧的复选框
单击安装
单击“确定”
Visual Studio 输出 window 显示:
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
目录中。如果您回头看看我给出的输出列表 window,您会看到 DLL 的复制。
它们显示在文件资源管理器中
那么当 F# Interactive 只有相对路径时,它如何知道如何找到 DLL。
Now for the magical missing part that we leave out because it is a
conspiracy to test newbies. :-)
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 版本。
:)
希望我提供了足够的详细信息,以便下次您看到这些关于将 NuGet 包与 F# Interactive 结合使用的示例之一并遇到问题时可以解决它。
在尝试加载 RProvider.fsx 时,我收到一条错误消息,指出程序集引用 RDotNet.dll 未找到或无效
我正在关注这个演练过程:http://bluemountaincapital.github.io/FSharpRProvider/Statistics-QuickStart.html
@GuyCoder 的 link 帮助了我: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__
找到
RProvider.fsx
中存在错误,它引用了错误版本的 R.NET。 version 1.1.16-alpha has a fix for this,但我们还没有发布新的非测试版。
如果安装 1.1.16-alpha,你能检查一下它是否正常工作吗?
使用 Visual Studio 15(我使用免费社区版)
创建新的 F# 控制台项目:UseNuGetPackage(未给出具体步骤)
下载并install R(未给出具体步骤)
安装 R 类型提供程序
在 Visual Studio 中使用解决方案资源管理器
右键单击 F# 项目,例如使用NuGetPackage
Select:管理解决方案的 NuGet 包
点击浏览
输入:RProvider
单击项目左侧的复选框
单击安装
单击“确定”
Visual Studio 输出 window 显示:
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
目录中。如果您回头看看我给出的输出列表 window,您会看到 DLL 的复制。
它们显示在文件资源管理器中
那么当 F# Interactive 只有相对路径时,它如何知道如何找到 DLL。
Now for the magical missing part that we leave out because it is a conspiracy to test newbies. :-)
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 版本。 :)
希望我提供了足够的详细信息,以便下次您看到这些关于将 NuGet 包与 F# Interactive 结合使用的示例之一并遇到问题时可以解决它。