[英]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.