Избегайте собственных ошибок.NET

Я провел последний год (неполный рабочий день), чтобы перенести мое существующее (и успешное) приложение 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-массива означает, что изменение одного элемента массива не влияет на другой массив. В режиме Release изменение одного массива также приводит к изменению другого. (Я использую последнюю версию VS 2017.)

Теперь я понял, что использование.NET Native 1.6 (что не является стандартным в VS 2017) решает эту конкретную проблему.

Но я потерял веру в.NET Native. Сколько ошибок все еще вносит.NET Native в мое приложение? Мое приложение для Windows 8.1 работает быстро и без проблем.NET Native. Так почему я должен использовать.NET Native, который, кажется, полон ошибок? (Я узнал много ошибок.NET Native за последние два дня.)

Недавно проект "UWP Desktop Bridge" позволил публиковать традиционные приложения для настольных компьютеров в App Store (им не нужно использовать.NET Native). Так почему я должен использовать.NET Native?

Есть ли способ полностью пропустить.NET Native? Если нет, могу ли я настроить компилятор.NET Native так, чтобы он вел себя не так разрушительно?

2 ответа

Решение

Это может быть ошибкой в ​​цепочке инструментов.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 здесь - извините за проблемы, с которыми вы столкнулись. Как вы сказали, проблема, с которой вы столкнулись с Array.Clone , была исправлена (непреднамеренно - как побочный эффект другого исправления) в.NET Native 1.6, и мы будем рады исправить любые другие проблемы, с которыми вы столкнулись.

Чтобы получить.NET Native, нам пришлось в значительной степени переписать все CLR (с более чем 15-летним исправлением ошибок). Мы находимся на стадии v1, и вы просто чаще сталкиваетесь с ошибкой в ​​.NET Native, чем в CLR. Большинство людей не сталкиваются с ошибками ни на одной платформе. В результате использования.NET Native пользователи Windows могут получить 30-60% улучшения времени запуска во всех приложениях UWP (по сравнению с CLR). Это может не иметь большого значения для вашей машины для разработки, но это очень важно для взаимодействия с пользователем на дешевых планшетах. В настоящее время мы не предлагаем отключить.NET Native в качестве опции.

Я подал проблему, чтобы улучшить наше тестовое покрытие для Array.Clone, чтобы это больше не повторилось (особенно потому, что мы даже не знали, что оно сломалось).

Если вы столкнетесь с проблемой в будущем:

  • Вы можете связаться с командой разработчиков напрямую по адресу dotnetnative (по адресу microsoft com)
  • Вы можете отправить исправление. .NET Native для приложений UWP сильно пересекается с репозиторием CoreRT на GitHub, и большая часть кода используется совместно.
Другие вопросы по тегам