Windows Phone 8.1 C# 应用:严重崩溃(ExecutionEngineException)仅在处于发布

本文关键字:ExecutionEngineException 于发布 崩溃 Phone 应用 Windows | 更新日期: 2023-09-27 18:31:43

>想象一下以下结构类型:

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 */
}

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

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

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

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

  • 在桌面应用程序/Windows 服务中(尚未尝试"地铁"应用程序)
  • 在任何模式下的 WinPhone 8.1 模拟器上(发布、调试、带或不带调试器)
  • 调试模式下在真正的 WinPhone 8.1 设备上(在 Lumia 625 上试用)

但是当我在真正的 WP 8.1 设备(Lumia 625,最新更新)上以发布模式运行此代码时,ExecutionEngineException我在第 XXX 行出现异常,并显示消息An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module. 此异常无法捕获且不包含任何详细信息 - 应用程序只是崩溃。

这是一个错误吗?还是WinPhone的已知局限性?为什么它可以在模拟器上运行?所有这些奇怪的"条件"都很重要:

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

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

Windows Phone 8.1 C# 应用:严重崩溃(ExecutionEngineException)仅在处于发布

几个月

前我在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% 确定它是编译器(C#、MDIL、NGEN 等)中的一个错误对于 ARM 来说与优化有某种关系。