使用.NET Native工具链构建会导致动态对象中缺少属性的错误

时间:2017-04-03 01:59:24

标签: c# dynamic json.net .net-native

我有一段代码获取JSON响应并检查是否存在.error字段

extension UIImage {

    func getPixelColor(pos: CGPoint) -> UIColor {

        let pixelData = self.cgImage!.dataProvider!.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x) ) * 4

        let r = CGFloat( data[pixelInfo] ) / CGFloat(255.0)
        let g = CGFloat( data[pixelInfo+1] ) / CGFloat(255.0)
        let b = CGFloat( data[pixelInfo+2] ) / CGFloat(255.0)
        let a = CGFloat( data[pixelInfo+3] ) / CGFloat(255.0)

        return UIColor(red: r, green: g, blue: b, alpha: a)
    }

}

当它没有使用.NET Native工具链编译时成功运行,但在使用它生成时会产生错误(在jsonResponse.error上)。

这是什么原因?与本机代码有任何其他类似的不兼容行为?

编辑:事实证明,即使JSON中存在“错误”键,我们仍然会收到错误。例外是:

dynamic jsonResponse = JsonConvert.DeserializeObject(responseString);
if (jsonResponse.error != null) { error = jsonResponse.error; }
else
{
  success = true;
}

1 个答案:

答案 0 :(得分:3)

为动态关键字提供动力的子系统具有各种不能在.NET Native上运行良好的极端情况。这个特殊问题已于2月份向我们报告,您可以在CoreFX GitHub here上看到一些讨论。

一般的想法是,动态关键字会导致大量机制漫游API并且框架的某些部分没有适当的暗示说出来#34;这不是你的事情。需要思考。&#34;因为我们的编译器分析说你在运行时不需要这个类型,但是这个特定的组件确实如此,我们最终会抛出这个异常。

异常中的链接试图帮助构建运行时指令(将其视为.NET Native编译器的提示),以便我们知道您在运行时需要类型信息。对于这种特殊情况,它看起来像:

<Type Name="Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder" Dynamic="Required All"/>

如果将其添加到文件Properties \ Default.rd.xml中,我希望此错误消失。您可能会遇到此类型的其他错误,但它们应该能够以类似的方式解决。

我们已经在我们这边记录了一个错误,以便在将来某个时候解决这个问题,但在此期间您需要这个解决方法。