避免.NET Native bug

我花了去年(兼职)将我现有的(并且成功的)Windows 8.1应用程序迁移到Windows 10 UWP。 现在,在将其发布到商店之前,我在“发布”构建模式(触发.NET Native)中测试了应用程序。 一切似乎都有效,直到我 – 偶然 – 注意到一个微妙但严重(因为数据妥协)的错误。 我花了两天时间将其缩减为这三行代码:

var array1 = new int[1, 1]; var array2 = (int[,])array1.Clone(); array2[0, 0] = 666; if (array1[0, 0] != array2[0, 0]) { ApplicationView.GetForCurrentView().Title = "OK."; } else { ApplicationView.GetForCurrentView().Title = "Bug."; } 

在调试模式下,克隆2D数组意味着修改一个数组项不会影响另一个数组。 在释放模式下,修改一个arrays也会改变另一个arrays。 (我正在使用最新的VS 2017.)

现在,我意识到使用.NET Native 1.6(这不是VS 2017中的默认设置),解决了这个特殊问题。

但我失去了对.NET Native的信心。 .NET Native仍然在我的应用程序中引入了多少错误? 我的Windows 8.1应用程序无需.NET Native即可快速顺畅地运行。 那么为什么我必须使用似乎充满bug的.NET Native呢? (我在过去两天里了解了很多.NET Native bug。)

最近,项目“UWP Desktop Bridge”允许将传统桌面应用程序发布到App Store(它们不必使用.NET Native)。 那为什么我必须使用.NET Native?

有没有办法完全跳过.NET Native? 如果没有,我可以将.NET Native编译器配置为不那么具有破坏性吗?

这可能是.NET Native工具链上的一个错误……

从我的测试中, Array.Copy按预期工作:

 var array1 = new int[1, 1]; var array2 = new int[1, 1]; Array.Copy(array1, array2, array1.Length); array2[0, 0] = 666; if (array1[0, 0] != array2[0, 0]) { ApplicationView.GetForCurrentView().Title = "OK."; } else { ApplicationView.GetForCurrentView().Title = "Bug."; } 

这里有.NET Native dev – 对不起您遇到的麻烦。 正如您所说,使用.NET Native 1.6修复了您使用Array.Clone遇到的问题(无意中 – 作为不同修复的副作用),我们很乐意解决您遇到的任何其他问题。

为了引入.NET Native,我们不得不重写所有的CLR(其中有15年以上的bug修复)。 我们处于v1阶段,你更有可能遇到.NET Native中的错误而不是CLR中的错误。 但是大多数人在这两个平台上都没有遇到任何漏洞。 使用.NET Native后,Windows用户可以在所有UWP应用程序中获得30-60%的启动时间改进(与CLR相比)。 在您的开发机器上可能并不重要,但对于廉价平板电脑上的用户体验而言,它非常重要。 我们目前不提供关闭.NET Native的选项。

我提出了一个问题来改进我们对Array.Clone的测试覆盖率,这样就不会再发生这种情况了(特别是因为我们甚至都不知道它已被破坏)。

如果您将来遇到问题:

  • 您可以直接通过dotnetnative(在microsoft com)联系开发团队
  • 您可以提交修复程序。 用于UWP应用程序的.NET Native与GitHub上的CoreRT repo重叠很多,并且共享了许多代码。