【问题标题】:Building with .NET Native tool chain causes error with missing property in dynamic object使用 .NET Native 工具链构建会导致动态对象中缺少属性的错误
【发布时间】:2017-08-27 18:44:18
【问题描述】:

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

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

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

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

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

System.Reflection.MissingMetadataException: ''Microsoft.CSharp.RuntimeBinder.CSharpGetMemberBinder' is missing metadata. For more information, please visit http://go.microsoft.com/fwlink/?LinkID=392859'

【问题讨论】:

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


    【解决方案1】:

    为 dynamic 关键字提供支持的子系统有各种在 .NET Native 上运行不佳的极端情况。这个问题在 2 月份报告给我们,您可以在 CoreFX GitHub here 上看到一些讨论。

    一般的想法是 dynamic 关键字导致大量机器在 API 中徘徊,并且框架的某些部分没有适当的暗示说“这不是你需要反思的事情”。因为我们的编译器分析表明您在运行时不需要这种类型,但这个特定的组件却需要,所以我们最终抛出了这个异常。

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

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

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

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

    【讨论】:

    • 我的项目中有Dynamic="Required All",但它从来没有工作过......任何时候我使用反射或动态它总是在我身上崩溃......也许这是这个线程提到的边缘情况.
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2011-05-14
    • 2016-04-17
    相关资源
    最近更新 更多