Устранение неполадок при переносе со среды выполнения Windows 8.x на UWP

Предыдущий раздел назывался Перенос проекта.

Мы настоятельно рекомендуем прочитать до конца это руководство по переносу, но мы также понимаем, что вы жаждете двигаться вперед и добраться до этапа, на котором выполняется построение и запуск вашего проекта. До этого момента вы можете достичь временного прогресса с помощью комментирования и создания заглушек для любого ненужного кода, а затем вернуться, чтобы уплатить этот долг позже. Таблица симптомов и средств устранения неполадок в этом разделе может быть полезна на этом этапе, хотя она не является заменой прочтению следующих нескольких разделов. Вы всегда можете обратиться к таблице по мере продвижения по последующим разделам.

Отслеживание проблем

Исключения синтаксического анализа XAML иногда трудно диагностировать, особенно они не содержат полезных сообщений об ошибке. Убедитесь, что отладчик настроен для перехвата первых исключений. Вы сможете проверить переменную исключения в отладчике, чтобы определить, содержат ли HRESULT или сообщение полезные данные. Также изучите сообщения об ошибке от средства синтаксического анализа XAML в окне вывода Visual Studio.

Если ваше приложение завершает работу и вы знаете только то, возникло необработанное исключение во время анализа разметки XAML, следовательно оно является результатом ссылки на отсутствующий ресурс (то есть, ключ ресурса существует для универсальных приложений версии 8.1, а не для приложений Windows 10, например, некоторые системные ключи стиля TextBlock). Кроме того, это может быть исключение, созданное внутри Элемента управления UserControl, пользовательского элемента управления или пользовательской панели макета.

Крайняя мера — это двоичное разделение. Удалите примерно половину разметки со страницы и запустите приложение еще раз. Затем вы узнаете, находится ли ошибка внутри половины, которую вы удалили (которую теперь следует восстановить в любом случае) или в половине, которую вы не удалили. Повторите процесс, разделяя половину, которая содержит ошибку и дальше, пока вы не сможете обнаружить проблему.

TargetPlatformVersion

В этом разделе объясняется, что делать, если при открытии проекта Windows 10 в Visual Studio отображается сообщение "Требуется обновление Visual Studio. Для одного или нескольких проектов требуется пакет SDK <версия>, который не установлен или не включен в обновление Visual Studio».

  • Сначала определите номер версии установленного пакета SDK для Windows 10. Перейдите в папку C:\Program Files (x86)\Windows Kits\10\Include\<versionfoldername> и запишите <имя>_папки_версии, которое будет иметь четырехугольную нотацию "Major.Minor.Build.Revision".
  • Откройте файл проекта для правки и найдите элементы TargetPlatformVersion и TargetPlatformMinVersion . Измените их следующим образом, заменив <versionfoldername> номером версии четырехмерной нотации, который вы нашли на диске:
   <TargetPlatformVersion><versionfoldername></TargetPlatformVersion>
    <TargetPlatformMinVersion><versionfoldername></TargetPlatformMinVersion>

Признаки и средства устранения неполадок

Данные средства устранения неполадок в таблице предназначены для того, чтобы предоставить вам достаточно информации для самостоятельного устранения неполадки. Вы найдете дополнительные сведения о каждой из этих проблем при чтении последующих разделов.

Симптом Средство
При открытии проекта Windows 10 в Visual Studio вы увидите сообщение "Требуется обновление Visual Studio. Для одного или нескольких проектов требуется пакет SDK <версия>, который не установлен или не включен в обновление Visual Studio». См. подраздел TargetPlatformVersion.
При вызове метода InitializeComponent в файле xaml.cs создается исключение System.InvalidCastException. Это может случиться, если несколько XAML-файлов (по крайней мере один из которых MRT-совместимый) совместно используют один файл xaml.cs, а элементы имеют атрибуты x:Name, не совместимые между двумя XAML-файлами. Попробуйте добавить одно имя одинаковым элементам в обоих XAML-файлах или не используйте имена вовсе.
При запуске на устройстве приложение завершает работу или при запуске из Visual Studio отображается сообщение об ошибке "Не удалось активировать приложение среда выполнения Windows 8.x [...]. Сбой запроса на активацию с ошибкой "Windows не удалось связаться с указанным приложением. Обычно это указывает на то, что обработка указанного приложения прервана. […]”. Проблема может крыться в императивном коде, работающем в ваших Страницах, или в привязанных свойствах (или других типах) во время инициализации. Эта ошибка также может происходить при анализе XAML-файла, который должен был отобразиться, когда приложение завершилось (при запуске из Visual Studio это будет стартовая страница). Найдите неверные ключи ресурса или воспользуйтесь рекомендациями из подраздела «Отслеживание проблем».
Средство синтаксического анализа, компилятор XAML, или исключение во время выполнения, выдает ошибку "Ресурс "<resourcekey>" не может быть разрешен.". Данный ключ ресурса не применяется к приложениям универсальной платформы для Windows (UWP) (например, это относится к некоторым ресурсам Windows Phone). Найдите правильный эквивалентный ресурс и обновите разметку. Примеры, с которыми вы можете столкнуться уже сейчас — это системные ключи, такие как PhoneAccentBrush.
Компилятор C# выдает ошибку "Тип или имя пространства имен "<name>" не может быть найдено [...]" или "Тип или имя пространства имен "<name>" не существует в пространстве имен [...]" или "Тип или имя пространства имен "<name>" не существует в текущем контексте". Скорее всего, это значит, что данный тип реализован в SDK расширения (хотя иногда устранить проблему не так просто). Используйте справку по API-интерфейсам Windows, чтобы определить, в каком SDK расширения реализован API, а затем используйте команду Visual Studio Добавить>Ссылку, чтобы добавить ссылку на SDK в проект. Если приложение предназначено для набора API-интерфейсов, известного как семейство универсальных устройств, очень важно использовать класс ApiInformation для тестирования присутствия SDK расширения перед их вызовом (это называется адаптивным кодом). Если существует универсальный API-интерфейс, тогда желательно всегда его использовать вместо API-интерфейса в SDK расширения. Подробнее см. в разделе SDK расширения.

Следующий раздел называется Перенос XAML и пользовательского интерфейса.