加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows Phone 8.1 C#app:仅在发布模式下的真实设备上发生严重

发布时间:2020-12-14 05:43:23 所属栏目:Windows 来源:网络整理
导读:想象一下以下结构类型: public struct Token : IDictionarystring,Token{ public readonly object Value; public Token(string str) { Value = str; } public Token(IDictionarystring,Token dict) { Value = dict; } /* IDictionarystring,Token implement
想象一下以下结构类型:

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服务中(尚未尝试’metro’应用程序)
>在任何模式下的WinPhone 8.1模拟器上(发布,调试,有或没有调试器)
>在调试模式下,在真正的WinPhone 8.1设备上(在Lumia 625上试过)

但是当我在RELEASE模式下在真正的WP 8.1设备(Lumia 625,最新更新)上运行此代码时,我在第XXX行获得了ExecutionEngineException异常,并显示消息未知模块中出现未处理的类型为“System.ExecutionEngineException”的异常.此异常无法捕获,并且不包含任何详细信息 – 应用程序只是崩溃.

这是一个错误吗?或者WinPhone的已知限制?为什么它适用于模拟器?所有这些奇怪的“条件”都很重要:

>令牌必须是结构,而不是类
>它必须实现IDictionary< K,V>,而不是任何其他接口(试过IList< Token>,ICollection)
>它必须放在单独的便携式类库中.如果我在WP 8.1项目中移动它 – 它工作正常
>令牌实例必须放在KeyValuePair< K,V>内.如果你只做token.Value.GetType() – 它工作正常

我创建了VS 2013解决方案来重现这种情况.它可以下载here.

解决方法

我在几个月前在Microsoft Connect创建了 error report并且一直在等待响应但是看起来微软的某些人并不想修复这个bug.

顺便说一句,我创建了一个更简单的repro:

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行.它们(令牌定义和用法)可以位于一个程序集中.

我还注意到将MethodImpl(MethodImplOptions.NoOptimization)属性添加到使用Token的方法中可以解决问题,因此即使考虑到我不是.NET大师,我也99%确定它是编译器中的错误(C# ARM,MDIL,NGEN,无论如何都与优化有关.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读