Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
Сведения об установке и использовании C++/WinRT расширения Visual Studio (VSIX) см. в поддержке Visual Studio для C++/WinRT.
Эта тема вынесена на передний план, чтобы вы были сразу в курсе; даже если она вам пока не нужна. Таблица симптомов и методов устранения неполадок, приведенных ниже, может оказаться полезной для вас, если вы пишете новый код или переносите существующее приложение. Если вы переносите проект и стремитесь двигаться вперед, чтобы достичь этапа, где проект компилируется и выполняется, то вы можете временно продвинуться вперед, закомментировав или заглушив любой несущественный код, который вызывает проблемы, а затем вернуться, чтобы выплатить этот долг позже.
Список часто задаваемых вопросов см. в .
Отслеживание проблем XAML
Исключения синтаксического анализа XAML могут быть сложными для диагностики, особенно если в исключении нет значимых сообщений об ошибках. Убедитесь, что отладчик настроен для перехвата исключений первого шанса (чтобы попытаться и поймать исключение синтаксического анализа на ранней стадии). Вы можете проверить переменную исключения в отладчике, чтобы определить, имеет ли HRESULT или сообщение любую полезную информацию. Кроме того, проверьте окно вывода Visual Studio на сообщения об ошибках, сгенерированные анализатором XAML.
Если ваше приложение завершается, и всё, что вы знаете, это то, что было вызвано необработанное исключение во время синтаксического анализа разметки XAML, то это может быть результатом ссылки (по ключу) на отсутствующий ресурс. Или это может быть исключение, возникающее внутри UserControl, пользовательского элемента управления или настраиваемой панели макета. Последнее средство — это двоичное разделение. Удалите около половины разметки на странице XAML и повторно запустите приложение. Затем вы узнаете, находится ли ошибка где-то в половине, которую вы удалили (которая теперь должна восстановиться в любом случае) или в половине, которую вы не удалили. Повторите процесс, разделив половину, содержащую ошибку, и так далее, пока не сосредоточитесь на проблеме.
Симптомы и средства правовой защиты
Симптом | Лекарство |
---|---|
Исключение создается во время выполнения со значением HRESULT REGDB_E_CLASSNOTREGISTERED. | См. раздел "Почему я получаю исключение "класс не зарегистрирован"?. |
Компилятор C++ создает ошибку "implements_type": не является членом любого прямого или косвенного базового класса проецируемого< типа>". | Это может произойти при вызове функции make с именем типа вашей реализации без указания пространства имен (например,MyRuntimeClass), если вы не включили файл заголовка этого типа. Компилятор интерпретирует MyRuntimeClass как проецируемый тип. Решение заключается в том, чтобы включить заголовок для типа реализации (MyRuntimeClass.h например. |
Компилятор C++ выдает ошибку "при попытке ссылаться на удаленную функцию". | Это может произойти при вызове функции make, если тип реализации, который вы передаете в качестве параметра шаблона, имеет конструктор = delete по умолчанию. Измените файл заголовка типа реализации и измените его = delete на = default . Вы также можете добавить конструктор в IDL для класса среды выполнения. |
Вы реализовали INotifyPropertyChanged, но привязки XAML не обновляются (и пользовательский интерфейс не подписывается на PropertyChanged). | Не забудьте задать Mode=OneWay (или TwoWay) в выражении привязки в разметке XAML. См. элементы управления XAML; привязка к свойству C++/WinRT. |
Вы привязываете элемент управления элементами XAML к наблюдаемой коллекции, и исключение создается во время выполнения с сообщением "Параметр является неверным". | В вашей IDL и её реализации объявите любую наблюдаемую коллекцию как тип Windows.Foundation.Collections.IVector<IInspectable>. Но возвращает объект, реализующий Windows.Foundation.Collections.IObservableVector<T>, где T является типом элемента. См. элементы управления XAML; привязка к коллекции C++/WinRT. |
Компилятор C++ выдает ошибку вида "'MyImplementationType_base<MyImplementationType>': нет доступного конструктора по умолчанию". | Это может произойти, если вы наследуете от типа с нетривиальным конструктором. Конструктор производного типа должен передавать параметры, необходимые конструктору базового типа. Пример выполнения см. в разделе о выводе из типа с нетривиальным конструктором. |
Компилятор C++ выдает ошибку "не удается преобразовать из 'const std::vector<std::wstring,std::allocator<_Ty>>' в 'const winrt::param::async_iterable<winrt::hstring> &'". | Это может произойти при передаче std::vector std::wstring в API среды выполнения Windows, который ожидает коллекцию. Дополнительные сведения см. в разделе стандартные типы данных C++ иC++/WinRT. |
Компилятор C++ создает ошибку "не удается преобразовать из 'const std::vector<winrt::hstring,std::allocator<_Ty>>' в 'const winrt::param::async_iterable<winrt::hstring> &'". | Это может произойти при передаче std::vector winrt::hstring в асинхронный API среды выполнения Windows, который ожидает коллекцию, и вы не скопировали и не переместили вектор в асинхронный вызывающий объект. Дополнительные сведения см. в разделе стандартные типы данных C++ иC++/WinRT. |
При открытии проекта Visual Studio выдает ошибку "Приложение для проекта не установлено". | Если вы еще не сделали этого, необходимо установить универсальные средства Windows для разработки C++ из диалогового окна New Project Visual Studio. Если это не устранит проблему, то работа проекта может зависеть от расширения Visual Studio C++/WinRT (VSIX) (см. поддержку Visual Studio для C++/WinRT). |
Тесты комплекта сертификации приложений Для Windows создают ошибку, что один из классов среды выполнения "не является производным от базового класса Windows. Все составные классы должны в конечном итоге быть производными от типа в пространстве имен Windows. | Любой класс среды выполнения (объявленный в приложении), производный от базового класса, называется составным классом. Конечный базовый класс компонуемого класса должен быть типом, источником которого является пространство имен Windows.* ; Например, Windows.UI.Xaml.DependencyObject. См. элементы управления XAML; привязывается к свойству C++/WinRT для получения дополнительных сведений. |
Компилятор C++ выдает ошибку "T должен быть типом WinRT" при специализации делегата EventHandler или TypedEventHandler. | Рассмотрите возможность использовать winrt::delegate<...> вместо этого. См. события автора в C++/WinRT . |
Компилятор C++ генерирует сообщение об ошибке "T должен быть типом WinRT" при специализации асинхронной операции Windows Runtime. | Рассмотрите возможность вместо этого возвратить задачу библиотеки шаблонов параллелизма (PPL) . См. параллелизм и асинхронные операции. |
Компилятор C++ создает ошибку "Тип T должен быть типом WinRT" при вызове winrt::xaml_typename. | Используйте проецируемый тип с winrt::xaml_typename (например, используйте BgLabelControlApp::BgLabelControl), а не тип реализации (например, не используйте BgLabelControlApp::implementation::BgLabelControlControl). См. пользовательские элементы управления XAML (шаблонные). |
Компилятор C++ создает сообщение об ошибке C2220: предупреждение, обработанное как ошибка, — файл "object" не создан. | Исправьте предупреждение или задайте C/C++>Общие>Обрабатывать предупреждения как ошибки на Нет (/WX-). |
Приложение завершает работу, так как обработчик событий в объекте C++/WinRT вызывается после уничтожения объекта. | См. безопасный доступ к этому указателю с помощью делегата обработки событий. |
Компилятор C++ создает ошибкуC2338: это только для слабой поддержки ссылок". | Вы запрашиваете слабую ссылку для типа, передавающего структуру маркера winrt::no_weak_ref в качестве аргумента шаблона в базовый класс. См. отказ от слабой поддержки ссылок. |
Компилятор C++ выдает "consume_Something: функция, возвращающая auto, не может использоваться до определения" | См. C3779: Почему компилятор выдает мне ошибку "consume_Something: функцию, возвращающую 'auto', нельзя использовать до ее определения"?. |
Компоновщик C++ выдает ошибкуLNK2019: неразрешенный внешний символ | См. Почему компоновщик дает мне ошибку "LNK2019: неразрешенный внешний символ"?. |
Цепочка инструментов LLVM и Clang создает ошибки при использовании с C++/WinRT. | Мы не поддерживаем цепочку инструментов LLVM и Clang для C++/WinRT, но если вы хотите эмулировать наше внутреннее использование, то можете попробовать эксперимент, такой как описан в можно ли использовать LLVM/Clang для компиляции с помощью C++/WinRT?. |
Компилятор C++ создает "нет соответствующего конструктора по умолчанию, доступного" для проецируемого типа. | Если вы пытаетесь отложить инициализацию объекта класса среды выполнения или использовать и реализовать класс среды выполнения в том же проекте, необходимо вызвать конструктор std::nullptr_t . Дополнительные сведения см. в статье Использование API с C++/WinRT. |
Компилятор C++ создает ошибкуC3861: "from_abi": идентификатор не найден", а другие ошибки, возникающие в base.h. Эта ошибка может возникнуть, если вы используете Visual Studio 2017 (версии 15.8.0 или более поздней) и нацелены на использование версии SDK для Windows 10.0.17134.0 (Windows 10, версия 1803). | Либо нацеливается на более позднюю (более соответствующую) версию пакета SDK для Windows, либо задайте свойство проекта >языка C/C++>: (если /permissive- отображается в свойстве проекта языке C/C++>язык> в разделе Дополнительные параметры, затем удалите его). |
Компилятор C++ создает ошибку C2039: "IUnknown": не является членом глобального пространства имен". | См. , как перенацелить проект C++/WinRT на более позднюю версиюпакета SDK для Windows. |
Компоновщик C++ создает ошибкуLNK2019: неразрешенный внешний символ _WINRT_CanUnloadNow@0, на который ссылается функция _VSDesignerCanUnloadNow@0" | См. , как перенацелить проект C++/WinRT на более позднюю версиюпакета SDK для Windows. |
Процесс сборки создает сообщение об ошибке . C++/WinRT VSIX больше не предоставляет поддержку сборки проектов. Пожалуйста, добавьте ссылку на проект в пакет Nuget Microsoft.Windows.CppWinRT. | Установите пакет NuGet Microsoft.Windows.CppWinRT в ваш проект. Дополнительные сведения см. в разделе более ранних версий расширения VSIX. |
Компоновщик C++ создает ошибку LNK2019: неразрешенный внешний символс упоминанием winrt::impl::consume_Windows_Foundation_Collections_IVector. | По состоянию на C++/WinRT 2.0, если вы используете диапазон на основе for в коллекции Windows Runtime, теперь вам потребуется #include <winrt/Windows.Foundation.Collections.h> . |
Компилятор C++ создает ошибку "C4002: слишком много аргументов для вызова функционально подобного макроса GetCurrentTime". | Узнайте , как устранить неоднозначность с помощью GetCurrentTime и (или) TRY?. |
Компилятор C++ создает ошибкуC2334: непредвиденные токены, предшествующие "{"; пропускание видимого тела функции". | Узнайте , как устранить неоднозначность с помощью GetCurrentTime и (или) TRY?. |
Компилятор C++ выдает "winrt::impl::produce<D,I> не может создать экземпляр абстрактного класса из-за отсутствия GetBindingConnector". | Вам нужно #include <winrt/Windows.UI.Xaml.Markup.h> . |
Компилятор C++ вызывает ошибкуC2039: "promise_type" не является членом "std::experimental::coroutine_traits<void>". | Корутин должен возвращать объект асинхронной операции или winrt::fire_and_forget. См. параллелизм и асинхронные операции. |
Проект создает "неоднозначный доступ к 'PopulatePropertyInfoOverride'". | Эта ошибка может возникать при объявлении одного базового класса в IDL и другом базовом классе в разметке XAML. |
Загрузка решения C++/WinRT впервые создает "сборка Designtime завершилась сбоем для конфигурации проекта "MyProject.vcxproj" "Отладка|x86". IntelliSense может быть недоступен.". | Эта проблема IntelliSense будет устранена после первой сборки. |
Попытка указать winrt::auto_revoke при регистрации делегата создает исключение winrt::hresult_no_interface. | См. , если делегат автоматического отзыва не сможет зарегистрировать. |
В приложении C++/WinRT, при использовании Windows Runtime компонента C#, использующего XAML, компилятор выдает ошибку вида "'MyNamespace_XamlTypeInfo': не является членом 'winrt::MyNamespace'", где MyNamespace — это имя пространства имен Windows Runtime компонента. | В используемом приложении C++/WinRT в pch.h добавьте #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> , заменив MyNamespace соответствующим образом. |
В проекте C++/WinRT в Visual Studio IntelliSense создает ошибку формы "error E1696: не удается открыть исходный файл". | Скомпилируйте созданный проект по крайней мере один раз. Затем щелкните правой кнопкой мыши в редакторе исходного кода >Повторное сканирование>Повторное сканирование файла. Это позволит устранить все ошибки IntelliSense, включая E1696. |
Замечание
Если этот раздел не ответил на ваш вопрос, вы можете найти помощь, перейдя в сообщество разработчиков Visual Studio C++или используя тег c++-winrt
в Stack Overflow.