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一致的异常 - 应用程序只是崩溃了。XXXAn 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 解决方案来重现这种情况。可以在这里下载。

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>没关系,异常发生在 line XXX。它们(Token定义和用法)可以位于一个程序集中。

我还注意到将MethodImpl(MethodImplOptions.NoOptimization)属性添加到使用Token解决问题的方法中,所以即使考虑到我不是 .NET 专家,我也 99% 确定这是编译器中的错误(C#、MDIL、NGEN 等)对于与优化有关的 ARM。

于 2015-01-28T04:59:29.300 回答