避免 .NET Native 错误
Avoid .NET Native bugs
我花了去年(兼职)时间将我现有的(并且成功)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.";
}
在调试模式下,克隆二维数组意味着修改一个数组项不会影响另一个数组。在 Release 模式下,修改一个数组也会更改另一个数组。 (我使用的是最新的 VS 2017。)
现在,我意识到使用 .NET Native 1.6(这不是 VS 2017 中的默认设置)可以解决这个特定问题。
但我对 .NET Native 失去了信心。 .NET Native 仍在我的应用程序中引入了多少错误?我的 Windows 8.1 应用程序在没有 .NET Native 的情况下运行快速流畅。那么为什么我必须使用似乎充满错误的.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 开发人员在这里 - 对于您遇到的麻烦,我们深表歉意。正如您所说,您在 .NET Native 1.6 中遇到的 Array.Clone has been fixed 问题(无意中 - 作为不同修复的副作用)我们很乐意解决您遇到的任何其他问题.
为了引入 .NET Native,我们不得不重写几乎所有的 CLR(其中包含超过 15 年的错误修复)。我们处于 v1 阶段,与 CLR 相比,您在 .NET Native 中更容易遇到错误。不过,大多数人在这两个平台上都不会遇到任何错误。由于使用 .NET Native,Windows 用户可以在所有 UWP 应用程序中享受 30-60% 的启动时间改进(与 CLR 相比)。这在您的开发机器上可能无关紧要,但对于廉价平板电脑上的用户体验来说却很重要。我们目前不提供关闭 .NET Native 作为选项。
我提交了 an issue 以提高我们对 Array.Clone 的测试覆盖率,以免再次发生这种情况(尤其是因为我们甚至不知道它已损坏)。
如果您以后遇到问题:
- 您可以通过 dotnetnative(在 microsoft com)直接联系开发团队
- 您可以提交修复。 .NET Native for UWP apps 与 GitHub 上的 CoreRT repo 有很大的重叠,并且共享了很多代码。
我花了去年(兼职)时间将我现有的(并且成功)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.";
}
在调试模式下,克隆二维数组意味着修改一个数组项不会影响另一个数组。在 Release 模式下,修改一个数组也会更改另一个数组。 (我使用的是最新的 VS 2017。)
现在,我意识到使用 .NET Native 1.6(这不是 VS 2017 中的默认设置)可以解决这个特定问题。
但我对 .NET Native 失去了信心。 .NET Native 仍在我的应用程序中引入了多少错误?我的 Windows 8.1 应用程序在没有 .NET Native 的情况下运行快速流畅。那么为什么我必须使用似乎充满错误的.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 开发人员在这里 - 对于您遇到的麻烦,我们深表歉意。正如您所说,您在 .NET Native 1.6 中遇到的 Array.Clone has been fixed 问题(无意中 - 作为不同修复的副作用)我们很乐意解决您遇到的任何其他问题.
为了引入 .NET Native,我们不得不重写几乎所有的 CLR(其中包含超过 15 年的错误修复)。我们处于 v1 阶段,与 CLR 相比,您在 .NET Native 中更容易遇到错误。不过,大多数人在这两个平台上都不会遇到任何错误。由于使用 .NET Native,Windows 用户可以在所有 UWP 应用程序中享受 30-60% 的启动时间改进(与 CLR 相比)。这在您的开发机器上可能无关紧要,但对于廉价平板电脑上的用户体验来说却很重要。我们目前不提供关闭 .NET Native 作为选项。
我提交了 an issue 以提高我们对 Array.Clone 的测试覆盖率,以免再次发生这种情况(尤其是因为我们甚至不知道它已损坏)。
如果您以后遇到问题:
- 您可以通过 dotnetnative(在 microsoft com)直接联系开发团队
- 您可以提交修复。 .NET Native for UWP apps 与 GitHub 上的 CoreRT repo 有很大的重叠,并且共享了很多代码。