gpt4 book ai didi

c# - Windows Phone 8.1 C# 应用程序 : critical crash (ExecutionEngineException) only on real device in release mode

转载 作者:行者123 更新时间:2023-11-30 12:44:45 25 4
gpt4 key购买 nike

想象一下下面的结构类型:

public struct Token : IDictionary<string, Token>
{
public readonly object Value;
public Token(string str) { Value = str; }
public Token(IDictionary<string, Token> dict) { Value = dict; }

/* IDictionary<string, Token> implementation is here */
}

不要问我它的作用。实现无关紧要,您可以在所有方法/属性中抛出 NotImplementedException。它被放置在单独的可移植类库中。

然后想象一下这个结构体的用法:

var token = new Token("111");
var kvp = new KeyValuePair<string, Token>("aaa", token);
var val = kvp.Value.Value;
var t = val.GetType(); // XXX

这段代码几乎在任何地方都能完美运行:

  • 在桌面应用程序/Windows 服务中(还没有尝试过“metro”应用程序)
  • 在任何模式下的 WinPhone 8.1 模拟器上(发布、调试、有或没有调试器)
  • 在真正的 WinPhone 8.1 设备上(在 Lumia 625 上试过)的 Debug模式

但是当我在真实的 WP 8.1 设备(Lumia 625,最新更新)上以 RELEASE 模式运行这段代码时,我得到 ExecutionEngineException XXX 行异常留言An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module.此异常无法捕获且不包含任何详细信息 - 应用只是崩溃。

这是一个错误吗?或者 WinPhone 的已知限制?为什么它适用于模拟器?所有这些奇怪的“条件”都很重要:

  • Token必须是 struct , 不是 class
  • 它必须实现IDictionary<K,V> ,而不是任何其他接口(interface)(尝试过 IList<Token>ICollection )
  • 它必须放在单独的可移植类库中。如果我在 WP 8.1 项目中移动它 - 它工作正常
  • 实例Token必须放在KeyValuePair<K,V>里面.如果你只做 token.Value.GetType() - 效果很好

我创建了 VS 2013 解决方案来重现这种情况。可以下载here .

最佳答案

我创建了 error report几个月前在 Microsoft Connect 上,一直在等待响应,但看起来 Microsoft 中没有人有兴趣修复此错误。

顺便说一句,我创建了一个更简单的重现:

public struct Token : IDictionary<string, Token>
{
/* IDictionary<string, Token> implementation is here */
}
public static class Test
{
//[MethodImpl(MethodImplOptions.NoOptimization)]
public static void Method()
{
var dict = new Dictionary<string, Token> { { "qwe", new Token() } };
var arr = dict.ToArray(); // XXX
}
}

实现IDictionary<string, Token>没关系,异常发生在XXX行.它们(Token 定义和用法)可以位于一个程序集中。

我还注意到添加 MethodImpl(MethodImplOptions.NoOptimization)属性到使用 Token 的方法解决了这个问题,所以即使考虑到我不是 .NET 专家,我也有 99% 的把握认为这是 ARM 的编译器(C#、MDIL、NGEN 等)中的一个错误,与优化有某种关联。

关于c# - Windows Phone 8.1 C# 应用程序 : critical crash (ExecutionEngineException) only on real device in release mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27079564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com