4

次の構造体型を想像してください。

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で試用)

しかし、このコードを実際の WP 8.1 デバイス (Lumia 625、最新の更新) で RELEASE モードで実行すると、ExecutionEngineException行で例外が発生XXXしますAn unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module.。この例外はキャッチできず、詳細が含まれていません - アプリはただクラッシュします。

これはバグですか?または、WinPhone の既知の制限はありますか? なぜエミュレータで動作するのですか?そして、この奇妙な「条件」はすべて重要です。

  • Tokenである必要がありますstructclass
  • IDictionary<K,V>他のインターフェイスではなく、を実装する必要があります ( 、 を試しましIList<Token>ICollection)
  • 別のポータブル クラス ライブラリに配置する必要があります。WP 8.1プロジェクトで移動すると、正常に動作します
  • のインスタンスはToken内に配置する必要がありますKeyValuePair<K,V>。あなただけの場合token.Value.GetType()- それはうまくいきます

この状況を再現するために、VS 2013 ソリューションを作成しました。ここからダウンロードできます。

4

1 に答える 1

1

数か月前に 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定義と使用法) を 1 つのアセンブリに配置できます。

MethodImpl(MethodImplOptions.NoOptimization)また、使用するメソッドに属性を追加するTokenと問題が解決することにも気付きました。.NET の達人ではないことを考慮しても、コンパイラ (C#、MDIL、NGEN など) のバグであると 99% 確信しています。何らかの形で最適化に関連するARMの場合。

于 2015-01-28T04:59:29.300 に答える