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

Building with .NET Native tool chain causes error with missing property in dynamic object

我有一段代码可以得到 JSON 响应并检查是否有 .error 字段

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

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

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

编辑:事实证明,即使 JSON 中有一个 "error" 键,我们仍然会收到错误消息。例外情况是:

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

为 dynamic 关键字提供支持的子系统有各种在 .NET Native 上表现不佳的极端情况 运行。这个特殊问题是在 2 月份向我们报告的,您可以在 CoreFX GitHub here.

上看到一些讨论

一般的想法是 dynamic 关键字导致大量机器在 API 中漫游,并且框架的某些部分没有正确的提示 "This isn't a thing you need to reflect on." 因为我们的编译器分析表明你赢了' 在 运行 时需要此类型,但此特定组件确实需要,我们最终抛出此异常。

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

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

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

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