- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们正在使用一个封装数值的结构,我发现当在表达式中使用该结构的可空版本时,会发生 FatalExecutionEngineError
:
Additional information: The runtime has encountered a fatal error. The address of the error was at 0x729c1e04, on thread 0x52d8. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
我正在使用 Visual Studio Premium 2013 Update 3这是源代码(C#,目标 .NET Framework 4.5):
using System;
using System.Globalization;
namespace ConsoleApplication4
{
public struct Number
{
ValueType _val;
private Number(double val)
{
this._val = val;
}
public static implicit operator double(Number val)
{
return Convert.ToDouble(val._val, CultureInfo.InvariantCulture);
}
public static implicit operator Number(double val)
{
return new Number(val);
}
}
class Program
{
static void Main(string[] args)
{
Number? b = 1.2;
var c = b - 1.2;
Number b1 = 1.2;
var c1 = b1 - 1.2;
}
}
}
请注意,添加这个可以解决问题,所以这并不紧急,但我很想知道为什么会出现这个问题。
public static implicit operator double(Number? val)
{
return Convert.ToDouble(val.GetValueOrDefault()._val, CultureInfo.InvariantCulture);
}
最佳答案
这看起来像是一个编译器错误。问题发生在 Main
的第二行。
Number? b = 1.2;
var c = b - 1.2; // The problem lies here
请注意 VS2013 生成的 IL,问题在于 IL_005C
和周围的代码,这是不必要的生成:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 116 (0x74)
.maxstack 2
.locals init (valuetype [mscorlib]System.Nullable`1<valuetype Test.Number> V_0,
valuetype [mscorlib]System.Nullable`1<float64> V_1,
valuetype [mscorlib]System.Nullable`1<valuetype Test.Number> V_2,
valuetype [mscorlib]System.Nullable`1<float64> V_3,
valuetype [mscorlib]System.Nullable`1<float64> V_4)
// Number? b = 1.2;
IL_0000: nop
IL_0001: ldloca.s V_0 //b
IL_0003: ldc.r8 1.2
IL_000c: call valuetype Test.Number Test.Number::op_Implicit(float64)
IL_0011: call instance void valuetype [mscorlib]System.Nullable`1<valuetype Test.Number>::.ctor(!0)
IL_0016: nop
IL_0017: ldloc.0
IL_0018: stloc.2 // b
// var c = b - 1.2;
IL_0019: ldloca.s V_2 // b
IL_001b: call instance bool valuetype [mscorlib]System.Nullable`1<valuetype Test.Number>::get_HasValue()
IL_0020: brtrue.s IL_002d
IL_0022: ldloca.s V_3
IL_0024: initobj valuetype [mscorlib]System.Nullable`1<float64>
IL_002a: ldloc.3
IL_002b: br.s IL_003e
IL_002d: ldloca.s V_2
IL_002f: call instance !0 valuetype [mscorlib]System.Nullable`1<valuetype Test.Number>::GetValueOrDefault()
IL_0034: call float64 Test.Number::op_Implicit(valuetype Test.Number)
// Um, what? First part of compiler bug is that it's needlessly creating a nullable float
IL_0039: newobj instance void valuetype [mscorlib]System.Nullable`1<float64>::.ctor(!0)
IL_003e: nop
IL_003f: stloc.3
IL_0040: ldloca.s V_3
IL_0042: call instance bool valuetype [mscorlib]System.Nullable`1<float64>::get_HasValue()
IL_0047: brtrue.s IL_0055
IL_0049: ldloca.s V_4
IL_004b: initobj valuetype [mscorlib]System.Nullable`1<float64>
IL_0051: ldloc.s V_4
IL_0053: br.s IL_0071
IL_0055: ldloca.s V_3
// Here's the real bug, though. It's passing float64 to a the op_Implicit that is expecting a Number struct
IL_0057: call instance !0 valuetype [mscorlib]System.Nullable`1<float64>::GetValueOrDefault()
IL_005c: call float64 Test.Number::op_Implicit(valuetype Test.Number)
IL_0061: conv.r8
IL_0062: ldc.r8 1.2
IL_006b: sub
IL_006c: newobj instance void valuetype [mscorlib]System.Nullable`1<float64>::.ctor(!0)
IL_0071: nop
IL_0072: stloc.1
IL_0073: ret
} // end of method Program::Main
Roslyn(也是使用它的 VS14 CTP)生成不存在此问题的不同 IL。代码几乎相同,只是它省略了 IL_0039
和 IL_0061
之间的 IL。
关于c# - 为什么会发生 CLR 异常 FatalExecutionEngineError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25510837/
我收到以下错误: Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\Users
今天我正在调试我的一些代码,这些代码构建了一些 ExpressionTrees,将它们编译为可调用的委托(delegate),然后在需要时调用它们。在执行此操作时,我遇到了 FatalExecutio
我在尝试将许多 DBase IV 文件中的 memofields 中的 C++ 结构读取到 C# (.Net 4) 中,然后将它们插入 MSSQL 2008 中时遇到了问题。数据正在从 DBase 文
这是我得到执行错误的行: NimbieImportedFunctions.BS_Robots_Connect( out robotCount, out robotIDs, out robotT
当我调试 ASP.NET MVC 应用程序时,KeyVaultClient 随机抛出异常: Managed Debugging Assistant 'FatalExecutionEngineError
托管调试助手“FatalExecutionEngineError”:“运行时遇到 fatal error 。错误的地址是 0x641ad419,在线程 0x5d0c 上。错误代码是 0xc000000
我需要在 C# 中使用 win32 NetLocalGroupGetMembers。我找到并测试了三种解决方案。这三个都因 FatalExecutionEngineError 而失败。框架是.net
我正在用 C# 例程试验一个我无法解决的乏味问题。我正在开发一个应用程序,它使用 GDAL 库(一个用 C++ 编写的 DLL 库来操作地理数据)打开 ESRI ShapeFile,并在 Pictur
几周(几个月?)以来,在 Visual Studio 2017/2019 Enterprise 中重新启动我的 ASP.NET 应用程序后,我有时会遇到以下异常。只有当 IIS Express 已经在
我正在开发一个连接到 MySQL 数据库的 C#.NET 应用程序,并使用一些不安全的代码来使用旧的 C++ dll。 程序一启动,就会加载dll并分配一个指针,然后初始化一些C#变量,然后删除指针。
作为我论文的一部分,我正在开发一个客户端/服务器应用程序,并选择使用 SocketAsyncEventArgs 来获得网络操作方面的最大性能。今天下午,我决定对创建 20 个线程并为每个线程发送 10
在我的程序中这一行: int value = MTEConnect(auth_string, err); 我收到这样的异常: FatalExecutionEngineError The runtime
我们正在使用一个封装数值的结构,我发现当在表达式中使用该结构的可空版本时,会发生 FatalExecutionEngineError: Additional information: The runt
我即将为用 VBScript 编写的遗留系统启动一个正在工作的迁移项目。它有一个有趣的结构,其中大部分是通过将各种组件编写为“WSC”文件来隔离的,这实际上是一种以类似 COM 的方式公开 VBScr
我正在研究无锁堆栈和队列数据结构,我可以在其中放置任意数量的添加项目并在一次调用中收集所有项目,我认为我的设计是可靠的并且它按预期工作直到我开始收到一个意外的异常,我认为这在纯 C# 环境中是不可能的
在 AnyCPU 或 x86 上,我可以运行这个程序,在 Foo 上设置一个断点,将第一个参数从 0.5f 编辑到 0.6f,然后恢复就好了。 但是,在 x64 上,它在恢复时始终因 FatalExe
我有以下基本 XAML: 当我尝试关闭包含用户控件的选项卡时,出现以下错误: Managed Debugging Assistant 'FatalExecut
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
当我尝试调试我的项目时,我不断收到此错误消息。相同的代码适用于大学机器。我目前使用 Windows 8.1 和 resharper 8.2,并在 selenium 测试中使用了最初的几种方法。我也在使
我正在尝试(为了好玩)将 String.Empty 重新定义为单个空格“”。为什么这会破坏 CLR 框架? 留言: The runtime has encountered a fatal error.
我是一名优秀的程序员,十分优秀!