4

想象一下下面的結構類型:的Windows Phone 8.1 C#應用程序:關鍵崩潰(ExecutionEngineException)僅真實設備在釋放模式

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 

此代碼工作完美幾乎無處不在:

  • 在桌面應用程序/服務窗口(沒試過 '地鐵' 應用程序)
  • 在任何模式下的WinPhone 8.1仿真器(發佈,調試,帶或不帶調試器)
  • 在調試模式下的真實WinPhone 8.1設備(試用於Lumia 625)

但是當我運行在釋放模式上真正的WP 8.1設備驗證碼(625的Lumia,最新更新),那麼我會在與消息An unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module.XXXExecutionEngineException例外,這個例外不能被捕獲,並且不包含任何細節 - 應用程序只是崩潰。

這是一個錯誤?或者WinPhone的已知限制?爲什麼它在仿真器上工作?而這一切的奇怪的「條件」是很重要的:

  • Token必須struct,不class
  • 它必須實現IDictionary<K,V>,沒有任何其他接口(試過IList<Token>ICollection
  • 它必須被放置在單獨的便攜式類庫。如果我將它移動到WP 8.1項目中 - 它工作正常
  • Token的實例必須放置在KeyValuePair<K,V>的內部。如果你只是token.Value.GetType() - 它工作正常

我創建了VS 2013解決方案來重現這種情況。它可以下載here

+2

嘗試在[Microsoft blackhole](https://connect.microsoft.com/) – CodesInChaos 2014-11-22 16:52:30

+0

上打開一個問題我也可以在我的Lumia 1320(Developer Preview Build 8.10.14203.306)中看到這個問題。按照「CodesInChaos」的建議 – magicandre1981 2014-11-22 19:04:19

回答

1

幾個月前,我在Microsoft Connect上創建了error report,並一直在等待響應,但它並不認爲有人在微軟有意修復此錯誤。

順便說我創建了一個更加簡單的攝製:

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%肯定它是在編譯器(一個bug C#, MDIL,NGEN,不管)與優化有關的ARM。

相關問題