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的测试覆盖率,这样就不会再发生这种情况了(特别是因为我们甚至不知道它已经坏了).
如果您将来遇到问题:
这可能是.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)