Избегайте собственных ошибок.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, и большая часть кода используется совместно.