Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Para obtener información sobre cómo instalar y usar las C++/WinRT extensiones de Visual Studio (VSIX), que ofrecen soporte de plantillas de proyecto, consulte el soporte de Visual Studio para C++/WinRT.
Este tema está desde el principio para que seas consciente de ello de inmediato, incluso si aún no lo necesites. La tabla siguiente de solución de problemas de síntomas y soluciones puede resultarle útil si va a escribir código nuevo o migrar una aplicación existente. Si va a realizar la migración, y está ansioso por avanzar y llegar a la fase en la que se compila y ejecuta el proyecto, puede realizar un progreso temporal comentando o quitando código auxiliar cualquier código no esencial que esté causando problemas y, después, vuelva a pagar esa deuda más adelante.
Para obtener una lista de las preguntas más frecuentes, consulte Preguntas más frecuentes.
Seguimiento de problemas de XAML
Las excepciones de análisis xaml pueden ser difíciles de diagnosticar, especialmente si no hay ningún mensaje de error significativo dentro de la excepción. Asegúrese de que el depurador está configurado para detectar excepciones de primera oportunidad (para intentar detectar la excepción de análisis al principio). Es posible que pueda inspeccionar la variable de excepción en el depurador para determinar si el HRESULT o el mensaje tienen información útil. Además, compruebe la ventana de salida de Visual Studio para ver los mensajes de error que genera el analizador XAML.
Si la aplicación finaliza y todo lo que sabes es que se produjo una excepción no controlada durante el análisis de marcado XAML, podría ser el resultado de una referencia (por clave) a un recurso que falta. O bien, podría ser una excepción producida dentro de un UserControl, un control personalizado o un panel de diseño personalizado. Un último recurso es una división binaria. Quita aproximadamente la mitad del marcado de una página XAML y vuelve a ejecutar la aplicación. A continuación, sabrá si el error está en algún lugar dentro de la mitad que quitó (que ahora debe restaurar en cualquier caso) o en la mitad que no se quitó. Repita el proceso dividiendo la mitad que contiene el error, y así sucesivamente, hasta que hayas identificado el problema.
Síntomas y remedios
Síntoma | Remedio |
---|---|
Se produce una excepción en tiempo de ejecución con un valor HRESULT de REGDB_E_CLASSNOTREGISTERED. | Consulte ¿Por qué obtengo una excepción de "clase no registrada"?. |
El compilador de C++ genera el error "'implements_type': no es miembro de ninguna clase base directa o indirecta de '<tipo> proyectado'". | Esto puede ocurrir al llamar a crear con el nombre sin calificar del espacio de nombres de su tipo de implementación (MyRuntimeClass, por ejemplo) y no incluye la cabecera de ese tipo. El compilador interpreta MyRuntimeClass como el tipo proyectado. La solución consiste en incluir el encabezado del tipo de implementación (MyRuntimeClass.h por ejemplo). |
El compilador de C++ genera el error "intentando hacer referencia a una función eliminada". | Esto puede ocurrir cuando se llama a make y el tipo de implementación que se pasa como parámetro de plantilla tiene un = delete constructor predeterminado. Edite el archivo de encabezado del tipo de implementación y cambie = delete a = default . También puede agregar un constructor en la IDL para la clase de tiempo de ejecución. |
Has implementado INotifyPropertyChanged, pero los enlaces XAML no se actualizan (y la interfaz de usuario no se suscribe a PropertyChanged). | Recuerde establecer Mode=OneWay (o TwoWay) en la expresión de enlace en el marcado XAML. Consulta controles XAML. Vincula a una propiedad de C++/WinRT. |
Estás enlazando un control de elementos XAML a una colección observable y se produce una excepción en tiempo de ejecución con el mensaje "El parámetro es incorrecto". | En su IDL y su implementación, declare cualquier colección observable como el tipo Windows.Foundation.Collections.IVector<IInspectable>. Pero devuelve un objeto que implementa Windows.Foundation.Collections.IObservableVector<T>, donde T es el tipo de elemento. Consulta controles de elementos XAML; enlazar a una colección de C++/WinRT. |
El compilador de C++ genera un error del formulario "'MyImplementationType_base<MyImplementationType>': no hay ningún constructor predeterminado adecuado disponible". | Esto puede ocurrir cuando se ha derivado de un tipo que tiene un constructor no trivial. El constructor del tipo derivado debe pasar los parámetros que necesita el constructor del tipo base. Para obtener un ejemplo desarrollado, consulte Derivación de un tipo con un constructor no trivial. |
El compilador de C++ genera el error "no se puede convertir de 'const std::vector<std::wstring,std::allocator<_Ty>>' a 'const winrt::param::async_iterable<winrt::hstring> &'". | Esto puede ocurrir cuando pasas un std::vector de std::wstring a una API de Windows Runtime que espera recibir una colección. Para obtener más información, consulta Tipos de datos estándar de C++ y C++/WinRT. |
El compilador de C++ genera el error "no se puede convertir de 'const std::vector<winrt::hstring,std::allocator<_Ty>>' a 'const winrt::param::async_iterable<winrt::hstring> &'". | Esto puede ocurrir cuando pasas un std::vector de winrt::hstring a una API de Windows Runtime que espera una colección asincrónica y no has copiado ni movido el vector a la función asincrónica. Para obtener más información, consulta Tipos de datos estándar de C++ y C++/WinRT. |
Al abrir un proyecto, Visual Studio genera el error "La aplicación del proyecto no está instalada". | Si aún no lo ha hecho, debe instalar Herramientas Universales de Windows para el desarrollo de C++ desde el cuadro de diálogo Nuevo Proyecto de Visual Studio. Si eso no resuelve el problema, entonces el proyecto podría depender de la extensión de Visual Studio (VSIX) de C++/WinRT (consulte la compatibilidad de Visual Studio para C++/WinRT en la sección y). |
Las pruebas del Kit para la certificación de aplicaciones de Windows producen un error que indica que una de las clases en tiempo de ejecución "no deriva de una clase base de Windows. Todas las clases que se pueden componer deben derivar en última instancia de un tipo en el espacio de nombres de Windows". | Cualquier clase en tiempo de ejecución (que declare en la aplicación) que derive de una clase base se conoce como una clase composable . La clase base final de una clase compuesta debe ser un tipo que se origine en un espacio de nombres Windows.*; por ejemplo, Windows.UI.Xaml.DependencyObject. Consulta los controles XAML de y vincula a la propiedad de C++/WinRT de para obtener más detalles. |
El compilador de C++ genera un error "T debe ser de tipo WinRT" para una especialización de delegado EventHandler o TypedEventHandler. | Considere la posibilidad de usar winrt::delegate<... T> en su lugar. Consulte Eventos de autor en C++/WinRT. |
El compilador de C++ produce un error "T debe ser de tipo WinRT" para una especialización de operación asincrónica de Windows Runtime. | Considere devolver, en su lugar, una tarea de la biblioteca de patrones paralelos (PPL) . Consulte concurrencia y operaciones asincrónicas. |
El compilador de C++ genera un error "T debe ser de tipo WinRT" al llamar a winrt::xaml_typename. | Use el tipo proyectado con winrt::xaml_typename (por ejemplo, use BgLabelControlApp::BgLabelControl) y no el tipo de implementación(por ejemplo, no use BgLabelControlApp::implementation::BgLabelControlControl). Consulta controles personalizados (con plantilla) XAML. |
El compilador de C++ genera "error C2220: advertencia tratada como error: no se generó ningún archivo 'object'". | Corrija la advertencia o establezca C/C++>General>Tratar advertencias como errores en a No (/WX-). |
Tu aplicación se bloquea porque un controlador de eventos en tu objeto C++/WinRT es llamado después de que el objeto se haya destruido. | Consulte Acceso seguro al este puntero con un delegado de control de eventos. |
El compilador de C++ produce "error C2338: Esto es solo para soporte de referencias débiles". | Está solicitando una referencia débil para un tipo que pasó la estructura de marcador winrt::no_weak_ref como argumento de plantilla a su clase base. Consulte Excluirse del soporte para referencias débiles. |
El compilador de C++ genera "consume_Something: la función que devuelve 'auto' no se puede utilizar antes de que esté definida" | Consulte C3779: ¿Por qué el compilador me da un error "consume_Something: función que devuelve 'auto' no se puede usar antes de estar definida"?. |
El enlazador de C++ genera "error LNK2019: símbolo externo sin resolver" | Consulte ¿Por qué el enlazador me da un error de "LNK2019: símbolo externo sin resolver"?. |
La cadena de herramientas LLVM y Clang genera errores cuando se usa con C++/WinRT. | No se admite la cadena de herramientas LLVM y Clang para C++/WinRT, pero si desea emular cómo lo usamos internamente, podría probar un experimento como el descrito en ¿Puedo usar LLVM/Clang para compilar con C++/WinRT?. |
El compilador de C++ genera "ningún constructor predeterminado adecuado disponible" para un tipo proyectado. | Si intenta retrasar la inicialización de un objeto de clase de tiempo de ejecución, o consumir e implementar una clase de tiempo de ejecución en el mismo proyecto, entonces deberá llamar al constructor std::nullptr_t . Para obtener más información, consulta Utilizar API con C++/WinRT. |
El compilador de C++ genera "error C3861: 'from_abi': identificador no encontrado" y otros errores que se originan en base.h. Es posible que vea este error si usa Visual Studio 2017 (versión 15.8.0 o posterior) y tiene como destino la versión 10.0.17134.0 de Windows SDK (Windows 10, versión 1803). | Puede tener como destino una versión posterior (más compatible) de Windows SDK o establecer la propiedad del proyecto |
El compilador de C++ genera "error C2039: 'IUnknown': no es miembro de ''global namespace''". | Consulte Cómo reorientar su proyecto de C++/WinRT a una versión posterior del SDK de Windows. |
El enlazador de C++ genera "error LNK2019: símbolo externo sin resolver _WINRT_CanUnloadNow@0 al que se hace referencia en la función _VSDesignerCanUnloadNow@0" | Consulte Cómo reorientar su proyecto de C++/WinRT a una versión posterior del SDK de Windows. |
El proceso de compilación genera el mensaje de error The C++/WinRT VSIX ya no proporciona compatibilidad con la compilación del proyecto. Agregue una referencia de proyecto al paquete Nuget Microsoft.Windows.CppWinRT. | Instale el paquete NuGet de Microsoft.Windows.CppWinRT en el proyecto. Para obtener más información, consulte versiones anteriores de la extensión VSIX. |
El enlazador de C++ genera error LNK2019: símbolo externo sin resolver, con una mención de winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partir de C++/WinRT 2.0, si usas un for basado en rango en una colección de Windows runtime, ahora tendrás que #include <winrt/Windows.Foundation.Collections.h> . |
El compilador de C++ genera "error C4002: Demasiados argumentos para la invocación de macro similar a la función GetCurrentTime". | Consulte ¿Cómo se resuelven las ambigüedades con GetCurrentTime o TRY?. |
El compilador de C++ genera "error C2334: tokens inesperados que preceden a '{'; omitiendo el cuerpo aparente de la función". | Consulte ¿Cómo se resuelven las ambigüedades con GetCurrentTime o TRY?. |
El compilador de C++ produce "winrt::impl::produce<D,I> no puede instanciar la clase abstracta, debido a que falta GetBindingConnector". | Debe #include <winrt/Windows.UI.Xaml.Markup.h> . |
El compilador de C++ genera "error C2039: 'promise_type': no es miembro de 'std::experimental::coroutine_traits<void>'". | La corrutina debe devolver un objeto de operación asincrónica o winrt::fire_and_forget. Consulte concurrencia y operaciones asincrónicas. |
El proyecto genera «acceso ambiguo de 'PopulatePropertyInfoOverride'». | Este error puede producirse cuando declaras una clase base en tu IDL y una clase base diferente en el marcado XAML. |
La carga de una solución de C++/WinRT por primera vez genera "error de compilación designtime para la configuración del proyecto "MyProject.vcxproj" "Depurar|x86". IntelliSense podría no estar disponible.". | Este problema de IntelliSense se resolverá después de compilar por primera vez. |
Al intentar especificar |
Consulte si el delegado de revocación automática no puede registrar. |
En una aplicación de C++/WinRT, al consumir un componente de C# de Windows Runtime |
En pch.h de la aplicación C++/WinRT que utiliza, agregue #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> reemplazando MyNamespace según corresponda. |
En un proyecto de C++/WinRT en Visual Studio, IntelliSense genera un error con el formato "error E1696: no se puede abrir el archivo". | Compile el proyecto recién creado al menos una vez. A continuación, haga clic con el botón derecho en el editor de código fuente >Volver a examinar>Volver a examinar archivo. Esto resolverá todos los errores de IntelliSense, incluido E1696. |
Nota:
Si este tema no respondió a su pregunta, puede encontrar ayuda visitando la comunidad de desarrolladores de Visual Studio C++o mediante la etiqueta c++-winrt
en Stack Overflow.