繁体   English   中英

Windows Phone 8.1 C#应用:严重崩溃(ExecutionEngineException)仅在发布模式下的真实设备上

[英]Windows Phone 8.1 C# app: critical crash (ExecutionEngineException) only on real device in release mode

想象以下结构类型:

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服务中(尚未尝试过“地铁”应用程序)
  • 在WinPhone 8.1仿真器上的任何模式下(发行版,调试版,带有或不带有调试器)
  • 在调试模式下的实际WinPhone 8.1设备(在Lumia 625上试用)上

但是,当我在RELEASE模式下在实际的WP 8.1设备(Lumia 625,最新更新)上运行此代码时,我在XXX行上收到ExecutionEngineException异常,消息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解决方案来重现这种情况。 可以在这里下载。

我几个月前在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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM