c# - R.NET 适用于 x86 但不适用于 x64
问题描述
我正在尝试在 R.NET 的教程页面上构建和运行 Hello World 示例。当我强制程序以 x86 模式运行时,它似乎没问题。但是,当我在 x64 中运行时,它很早就停止了消息,“[程序] 以代码 1073740791 退出”我在The R Project安装了最新版本的 R并运行了故障排除步骤。我从故障排除程序中得到的输出是:
- 这个过程是 64 位的吗?真的
- 信息:调用者提供 rPath=null,rHome=null 信息:R.NET 寻找预设的 R_HOME 环境。变种。发现空
- 信息:找到 Windows 注册表项 RDotNet.NativeLibrary.WindowsRegistryKey
- 信息:找到 Windows 注册表项 RDotNet.NativeLibrary.WindowsRegistryKey
- 信息:在 RDotNet.NativeLibrary.WindowsRegistryKey 下找到子键 InstallPath
- 信息:密钥 RDotNet.NativeLibrary.WindowsRegistryKey 的 InstallPath 值:C:\Program Files\R\R-4.0.3
- 信息:R.NET 寻找特定于平台的方式(例如 win 注册表)。找到 C:\Program Files\R\R-4.0.3
- 信息:R.NET 试图根据 rHome 查找 rPath;推导出 C:\Program Files\R\R-4.0.3\bin\x64
- C:...\bin\x64\Debug\net5.0\ConsoleNet5R.exe(进程 33500)退出,代码为 -1073740791。
我已经验证存在一个文件R.dll,它推断它应该是“C:\Program Files\R\R-4.0.3\bin\x64”。当我逐步使用我的反编译器时,它似乎被 REngine.cs 中的第 400 行显示为我所看到的内容,在函数“初始化”下this.GetFunction<setup_Rmainloop>()();
它似乎没有抛出异常,它只是停止. 老实说 - 我不确定这条线应该做什么......
有什么想法吗?如果必须,我可以在 x86 模式下运行,但如果可能的话,我想使用 x64。
解决方案
我对此进行了分析并跟踪了其中一个 RDotNet GitHub 问题中的发现(https://github.com/rdotnet/rdotnet/issues/139#issuecomment-898699993)。
这似乎与 Windows 10 中启用的Control Flow Guard 安全功能有关。R 程序本身不会发生这种情况,因为它们是使用与 Microsoft 不同的编译器(gcc via mingw)编译的。setjmp
但是,为 .NET 二进制文件启用了 CFG 功能,并且在 R 4.0.3 in /longjmp
调用中的更改中有一些东西(对不起,我不知道实际的潜在根本原因)导致崩溃(请参阅: https: //github.com/wch/r-source/blob/trunk/src/gnuwin32/fixed/h/psignal.h#L44-L51)。
尽管您实际上会禁用安全功能,但我现在在编译后修改程序时有一些运气(您可以将其设置为构建后事件)。您将需要运行类似: 的东西link /EDIT /GUARD:NO <yourapp>.exe
,它会禁用 CFG。
感谢https://github.com/dotnet/runtime/issues/11899#issuecomment-502195325提供此解决方法所需的说明,以及https://www.trendmicro.com/en_us/research/16/j/control -flow-guard-improvements-windows-10-anniversary-update.html提供了对 CFG 的惊人分析,有助于了解正在发生的事情。
推荐阅读
- nginx - Kubernetes nginx 入口多路径
- openssl - 从十六进制 DER 返回二进制私钥 secp256k1
- python-2.7 - 我正在尝试使用请求包从使用 Python 的 API 获得响应
- tensorflow - 如何使张量具有四个维度?
- docker - npm build dockerfile 需要深度依赖树的帮助
- time-complexity - 查找以下代码的运行时间
- python - Django POST 请求嵌套对象主键
- java - 让反射在单元测试中工作的问题
- qt - 如何强制 QtQuick 列重新布局?.forceLayout() 不起作用
- ios - iOS 13 Share Sheet:更改字幕/项目描述