首页 > 解决方案 > R.NET 适用于 x86 但不适用于 x64

问题描述

我正在尝试在 R.NET 的教程页面上构建和运行 Hello World 示例。当我强制程序以 x86 模式运行时,它似乎没问题。但是,当我在 x64 中运行时,它很早就停止了消息,“[程序] 以代码 1073740791 退出”我在The R Project安装了最新版本的 R并运行了故障排除步骤。我从故障排除程序中得到的输出是:

我已经验证存在一个文件R.dll,它推断它应该是“C:\Program Files\R\R-4.0.3\bin\x64”。当我逐步使用我的反编译器时,它似乎被 REngine.cs 中的第 400 行显示为我所看到的内容,在函数“初始化”下this.GetFunction<setup_Rmainloop>()(); 它似乎没有抛出异常,它只是停止. 老实说 - 我不确定这条线应该做什么......

有什么想法吗?如果必须,我可以在 x86 模式下运行,但如果可能的话,我想使用 x64。

标签: c#r.net

解决方案


我对此进行了分析并跟踪了其中一个 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 的惊人分析,有助于了解正在发生的事情。


推荐阅读