在 C# 控制台应用程序中加载 rdotnet 在 macOS 上失败并出现未知错误
Loading rdotnet in C# console application fails with an unknown error on macOS
我在 macOS 上有一个非常基本的 C# 控制台应用程序,下面粘贴了代码。当我尝试 运行 此代码时,对 REngine.GetInstance() 的调用失败并出现以下异常:
Unhandled exception. System.ArgumentException: This 64-bit process failed to load the library libR.dylib. No further error message from the dynamic library loader
at DynamicInterop.UnmanagedDll.ThrowFailedLibraryLoad(String dllFullName, String nativeError)
at DynamicInterop.UnmanagedDll.ReportLoadLibError(String dllName, String nativeError)
at DynamicInterop.UnmanagedDll..ctor(String dllName)
at RDotNet.REngine..ctor(String id, String dll)
at RDotNet.REngine.CreateInstance(String id, String dll)
at RDotNet.REngine.GetInstance(String dll, Boolean initialize, StartupParameter parameter, ICharacterDevice device)
at RTest.Program.Main(String[] args) in /Users/.../Projects/RTest/RTest/Program.cs:line 14
我已经确定系统上没有安装多个 R。此外,尝试在 M1 机器和基于 Intel 的 Mac.
上执行相同的代码
代码如下:
using System;
using RDotNet;
namespace RTest
{
class Program
{
static void Main(string[] args)
{
var e = REngine.GetInstance();
e.Initialize();
}
}
}
我还尝试使用 REngine.SetEnvironmentVariables(rPath: "/usr/local/Cellar/r/4.1.2_1/[=25= 明确指定 R_HOME 和 R_PATH ]", rHome: "/usr/local/Cellar/r/4.1.2_1");但无济于事。
任何帮助将不胜感激。
谢谢
您是否确认设置了两个环境变量。通过终端还是通过您的 IDE 环境变量设置机制?
根据记忆,你需要的两个是:
export LD_LIBRARY_PATH=/Library/Frameworks/R.framework/Libraries/:$LD_LIBRARY_PATH
和
export PATH=/Library/Frameworks/R.framework/Libraries/:$PATH
可以从这里 https://cran.r-project.org/bin/macosx/ 或使用 brew 从 CRAN(综合 R 存档网络)为 macOS 安装 R - 也可以进行混合安装。
我还添加了行
Console.WriteLine($"is running: {e.IsRunning}");
将成功案例的命令行输出到您的 C# 测试程序。
要获取相关的 R
主目录,您可以执行以下操作:
- 在命令行输入
R
- 输入
R.home(component = "home")
CRAN 安装
通过 CRAN 安装,它会给你 /Library/Frameworks/R.framework/Resources
。
检查ls /Library/Frameworks/R.framework/Resources/lib
(注意附加的路径部分lib
)里面是否有libR.dylib
。
然后在命令行输入:
export DYLD_LIBRARY_PATH=/Library/Frameworks/R.framework/Resources/lib
并再次尝试在命令行上启动您的 .NET 应用程序。现在大概会显示:
Fatal error: R home directory is not defined
但是我们从上面的 R
命令中知道主目录。所以下一个命令是:
export R_HOME=/Library/Frameworks/R.framework/Resources
现在当你尝试在命令行启动C#测试程序时,应该会出现is running: True
的信息,这意味着这次成功了。
brew 安装
R
命令 R.home(component = "home")
在我的机器上用 brew 输出:/usr/local/Cellar/r/4.1.3/lib/R
.
有趣的是,在那台机器上我最初得到了一个不同的错误:DirectoryNotFoundException: Directory '/Library/Frameworks/R.framework/Resources'
。所以我尝试只使用
export R_HOME=/usr/local/Cellar/r/4.1.3/lib/R
随后在命令行上调用 C# 测试程序 - 它成功了。
CRAN 安装截图
brew 安装截图
一个显着的区别是我必须在 CRAN 安装中显式设置 DYLD_LIBRARY_PATH
,而 brew
安装则不需要。
REngine.SetEnvironmentVariables
也不适合我。所以我使用命令行来设置环境变量。
但是,正如您在屏幕截图中所见,这两种安装类型都可以 运行 成功。
我在 macOS 上有一个非常基本的 C# 控制台应用程序,下面粘贴了代码。当我尝试 运行 此代码时,对 REngine.GetInstance() 的调用失败并出现以下异常:
Unhandled exception. System.ArgumentException: This 64-bit process failed to load the library libR.dylib. No further error message from the dynamic library loader
at DynamicInterop.UnmanagedDll.ThrowFailedLibraryLoad(String dllFullName, String nativeError)
at DynamicInterop.UnmanagedDll.ReportLoadLibError(String dllName, String nativeError)
at DynamicInterop.UnmanagedDll..ctor(String dllName)
at RDotNet.REngine..ctor(String id, String dll)
at RDotNet.REngine.CreateInstance(String id, String dll)
at RDotNet.REngine.GetInstance(String dll, Boolean initialize, StartupParameter parameter, ICharacterDevice device)
at RTest.Program.Main(String[] args) in /Users/.../Projects/RTest/RTest/Program.cs:line 14
我已经确定系统上没有安装多个 R。此外,尝试在 M1 机器和基于 Intel 的 Mac.
上执行相同的代码代码如下:
using System;
using RDotNet;
namespace RTest
{
class Program
{
static void Main(string[] args)
{
var e = REngine.GetInstance();
e.Initialize();
}
}
}
我还尝试使用 REngine.SetEnvironmentVariables(rPath: "/usr/local/Cellar/r/4.1.2_1/[=25= 明确指定 R_HOME 和 R_PATH ]", rHome: "/usr/local/Cellar/r/4.1.2_1");但无济于事。
任何帮助将不胜感激。
谢谢
您是否确认设置了两个环境变量。通过终端还是通过您的 IDE 环境变量设置机制?
根据记忆,你需要的两个是:
export LD_LIBRARY_PATH=/Library/Frameworks/R.framework/Libraries/:$LD_LIBRARY_PATH
和
export PATH=/Library/Frameworks/R.framework/Libraries/:$PATH
可以从这里 https://cran.r-project.org/bin/macosx/ 或使用 brew 从 CRAN(综合 R 存档网络)为 macOS 安装 R - 也可以进行混合安装。
我还添加了行
Console.WriteLine($"is running: {e.IsRunning}");
将成功案例的命令行输出到您的 C# 测试程序。
要获取相关的 R
主目录,您可以执行以下操作:
- 在命令行输入
R
- 输入
R.home(component = "home")
CRAN 安装
通过 CRAN 安装,它会给你 /Library/Frameworks/R.framework/Resources
。
检查ls /Library/Frameworks/R.framework/Resources/lib
(注意附加的路径部分lib
)里面是否有libR.dylib
。
然后在命令行输入:
export DYLD_LIBRARY_PATH=/Library/Frameworks/R.framework/Resources/lib
并再次尝试在命令行上启动您的 .NET 应用程序。现在大概会显示:
Fatal error: R home directory is not defined
但是我们从上面的 R
命令中知道主目录。所以下一个命令是:
export R_HOME=/Library/Frameworks/R.framework/Resources
现在当你尝试在命令行启动C#测试程序时,应该会出现is running: True
的信息,这意味着这次成功了。
brew 安装
R
命令 R.home(component = "home")
在我的机器上用 brew 输出:/usr/local/Cellar/r/4.1.3/lib/R
.
有趣的是,在那台机器上我最初得到了一个不同的错误:DirectoryNotFoundException: Directory '/Library/Frameworks/R.framework/Resources'
。所以我尝试只使用
export R_HOME=/usr/local/Cellar/r/4.1.3/lib/R
随后在命令行上调用 C# 测试程序 - 它成功了。
CRAN 安装截图
brew 安装截图
一个显着的区别是我必须在 CRAN 安装中显式设置 DYLD_LIBRARY_PATH
,而 brew
安装则不需要。
REngine.SetEnvironmentVariables
也不适合我。所以我使用命令行来设置环境变量。
但是,正如您在屏幕截图中所见,这两种安装类型都可以 运行 成功。