避免.NET Native bug

eik*_*kuh 3 c# compiler-optimization .net-native uwp

我花了去年(兼职)将我现有的(并且成功的)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.";
}
Run Code Online (Sandbox Code Playgroud)

在调试模式下,克隆2D数组意味着修改一个数组项不会影响另一个数组.在发布模式下,修改一个阵列也会改变另一个阵列.(我使用的是最新的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编译器配置为不那么具有破坏性吗?

小智 8

.NET Native dev here - 对不起您遇到的麻烦.至于你说的,你打与Array.Clone问题已得到修复(无意中-为不同的修复的副作用)与.NET 1.6原住民,我们将竭诚为您解决所遇到的任何其他问题.

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

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

如果您将来遇到问题:

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

  • 感谢您的诚实回答并提交问题!我相信,你们所有人都做得很好。但是正如你所说:短时间内不可能有一个成熟的产品。那么为什么我们被迫使用 .NET Native?我的应用程序从早期的 Windows 8 开始就一直存在。我的应用程序(Win 8、8.1)甚至在旧的超慢 SurfaceRT 上也能快速启动。所以,不要告诉我我需要 .NET Native。我认为作为一种选择当然很棒。但是为什么要强迫我们呢?(作为一个副作用,不需要 .NET Native 将使 F# 成为可能用于 UWP。) (2认同)

Ped*_*mas 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.";
}
Run Code Online (Sandbox Code Playgroud)