想象一下下面的結構類型:的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.
線XXX
ExecutionEngineException
例外,這個例外不能被捕獲,並且不包含任何細節 - 應用程序只是崩潰。
這是一個錯誤?或者WinPhone的已知限制?爲什麼它在仿真器上工作?而這一切的奇怪的「條件」是很重要的:
Token
必須struct
,不class
- 它必須實現
IDictionary<K,V>
,沒有任何其他接口(試過IList<Token>
,ICollection
) - 它必須被放置在單獨的便攜式類庫。如果我將它移動到WP 8.1項目中 - 它工作正常
Token
的實例必須放置在KeyValuePair<K,V>
的內部。如果你只是token.Value.GetType()
- 它工作正常
我創建了VS 2013解決方案來重現這種情況。它可以下載here。
嘗試在[Microsoft blackhole](https://connect.microsoft.com/) – CodesInChaos 2014-11-22 16:52:30
上打開一個問題我也可以在我的Lumia 1320(Developer Preview Build 8.10.14203.306)中看到這個問題。按照「CodesInChaos」的建議 – magicandre1981 2014-11-22 19:04:19