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解决方案来重现这种情况。可以在此处下载。
前我在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 来说与优化有某种关系。