[英]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
这段代码几乎可以在任何地方正常工作:
但是,当我在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
) 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.