簡體   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