避免.NET Native bug

时间:2017-06-30 16:16:55

标签: c# uwp compiler-optimization .net-native

我花了去年(兼职)将我现有的(并且成功的)Windows 8.1应用程序迁移到Windows 10 UWP。现在,在将其发布到商店之前,我在“Release”构建模式(触发.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数组意味着修改一个数组项不会影响另一个数组。在发布模式下,修改一个阵列也会改变另一个阵列。 (我正在使用最新的VS 2017。)

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

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

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

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

2 个答案:

答案 0 :(得分:8)

.NET Native dev here - 对不起您遇到的麻烦。正如你所说,你使用.NET Native 1.6遇到了Array.Clone has been fixed(无意中 - 作为不同修复的副作用)的问题,我们很乐意解决你遇到的任何其他问题。< / p>

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

我提交了an issue来改进我们对Array.Clone的测试覆盖率,这样就不会再发生这种情况了(特别是因为我们甚至不知道它已经坏了)。

如果您将来遇到问题:

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

答案 1 :(得分:7)

这可能是.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.";
}