Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Note
Per informazioni sull'installazione e l'uso di C++/WinRT Visual Studio Extension (VSIX) (che fornisce il supporto dei modelli di progetto) vedi Visual Studio supporto per C++/WinRT.
Questo argomento è in primo piano in modo che tu ne sia a conoscenza subito; anche se non ne hai ancora bisogno. La tabella dei sintomi e dei rimedi per la risoluzione dei problemi riportati di seguito può essere utile se si taglia nuovo codice o si esegue la conversione di un'app esistente. Se stai effettuando il porting e sei desideroso di proseguire e passare alla fase in cui il progetto viene compilato ed eseguito, puoi fare progressi temporanei commentando o stubando qualsiasi codice non essenziale che causa problemi e quindi tornando a pagare il debito in un secondo momento.
Per un elenco delle domande frequenti, vedere Domande frequenti.
Rilevamento dei problemi XAML
Le eccezioni di analisi XAML possono essere difficili da diagnosticare, in particolare se non sono presenti messaggi di errore significativi all'interno dell'eccezione. Assicurarsi che il debugger sia configurato per intercettare le eccezioni first-chance, in modo da tentare di intercettare l'eccezione di parsing nelle fasi iniziali. È possibile esaminare la variabile di eccezione nel debugger per determinare se HRESULT o messaggio contiene informazioni utili. Inoltre, controllare la finestra di output di Visual Studio per individuare i messaggi di errore generati dal parser XAML.
Se l'app termina e tutto quello che sai è che è stata generata un'eccezione non gestita durante l'analisi del markup XAML, questo potrebbe essere il risultato di un riferimento (per chiave) a una risorsa mancante. In alternativa, potrebbe trattarsi di un'eccezione generata all'interno di un controllo UserControl, di un controllo personalizzato o di un pannello di layout personalizzato. Un'ultima risorsa è una divisione binaria. Rimuovere circa la metà del markup da una pagina XAML ed eseguire nuovamente l'app. Saprai quindi se l'errore si trova in qualche punto della metà che hai rimosso (che in ogni caso dovresti ora ripristinare) oppure nella metà che non hai rimosso. Ripeti il processo dividendo a metà la parte che contiene l'errore, e così via, finché non hai individuato con precisione il problema.
Sintomi e rimedi
| Sintomo | Rimedio |
|---|---|
| Viene generata un'eccezione in fase di esecuzione con un valore HRESULT di REGDB_E_CLASSNOTREGISTERED. | Vedi Perché ottengo un'eccezione "classe non registrata"?. |
| Il compilatore C++ genera l'errore "'implements_type': non è membro di alcuna classe base diretta o indiretta di '<tipo> proiettato'". | Ciò può verificarsi quando si chiama make con il nome non qualificato dello spazio dei nomi del tipo di implementazione (ad esempio MyRuntimeClass) e non è stata inclusa l'intestazione del tipo. Il compilatore interpreta MyRuntimeClass come tipo proiettato. La soluzione consiste nell'includere l'header del tuo tipo di implementazione (MyRuntimeClass.h, ad esempio). |
| Il compilatore C++ genera l'errore "tentativo di fare riferimento a una funzione eliminata". | Ciò può verificarsi quando si chiama make e il tipo di implementazione passato come parametro del modello ha un = delete costruttore predefinito. Modificare il file di intestazione del tipo di implementazione e passare = delete a = default. È anche possibile aggiungere un costruttore nel file IDL per la classe di runtime. |
| Hai implementato INotifyPropertyChanged, ma le associazioni XAML non vengono aggiornate e l'interfaccia utente non sottoscrive PropertyChanged. | Ricordarsi di impostare Mode=OneWay (o TwoWay) sull'espressione di binding nel markup XAML. Vedi Controlli XAML; associare a una proprietà C++/WinRT. |
| Si sta associando un controllo elementi XAML a una raccolta osservabile e viene generata un'eccezione in fase di esecuzione con il messaggio "Il parametro non è corretto". | Nell'IDL e nell'implementazione dichiarare qualsiasi raccolta osservabile come tipo Windows. Foundation.Collections.IVector<IInspectable>. Ma restituisci un oggetto che implementa Windows.Foundation.Collections.IObservableVector<T>, dove T è il tipo di elemento. Vedere controlli elemento XAML; associare a una raccolta C++/WinRT. |
| Il compilatore C++ genera un errore nel formato "'MyImplementationType_base<MyImplementationType>': nessun costruttore predefinito appropriato disponibile". | Ciò può verificarsi quando si è derivati da un tipo con un costruttore non semplice. Il costruttore del tipo derivato deve passare i parametri necessari al costruttore del tipo di base. Per un esempio funzionato, vedere Derivazione da un tipo con un costruttore non semplice. |
| Il compilatore C++ genera l'errore "cannot convert from 'const std::vector<std::wstring,std::allocator<_Ty>>' to 'const winrt::param::async_iterable<winrt::hstring> &'". | Ciò può verificarsi quando si passa un std::vector di std::wstring a un'API Windows Runtime che prevede una raccolta. Per altre info, vedi Tipi di dati C++ standard e C++/WinRT. |
| Il compilatore C++ genera l'errore "cannot convert from 'const std::vector<winrt::hstring,std::allocator<_Ty>>' to 'const winrt::param::async_iterable<winrt::hstring> &'". | Ciò può verificarsi quando passi un std::vector di winrt::hstring a un'API asincrona di Windows Runtime che si aspetta una raccolta, senza aver copiato né spostato il vettore alla funzione asincrona chiamata. Per altre info, vedi Tipi di dati C++ standard e C++/WinRT. |
| Quando si apre un progetto, Visual Studio genera l'errore "L'applicazione per il progetto non è installata". | Se non è già stato fatto, è necessario installare i modelli SDK per app di Windows C++ e L'estensione Visual Studio C++/WinRT (VSIX) (vedere Visual Studio supporto per C++/WinRT). |
| I test app di Windows Certification Kit generano un errore che una delle classi di runtime "non deriva da una classe di base Windows. Tutte le classi componibili devono derivare in definitiva da un tipo nello spazio dei nomi Windows". | Qualsiasi classe di runtime (dichiarata nell'applicazione) che deriva da una classe di base è nota come classe componibile . La classe base finale di una classe componibile deve essere un tipo che ha origine in uno spazio dei nomi Windows.* o Microsoft.*, ad esempio Microsoft. UI. Xaml.DependencyObject. Per ulteriori dettagli, vedere Controlli XAML; associare a una proprietà C++/WinRT. |
| Il compilatore C++ genera un errore "T deve essere di tipo WinRT" per una specializzazione del delegato EventHandler o TypedEventHandler. | Valuta l'uso di winrt::delegate<...T> invece. Vedi Creazione di eventi in C++/WinRT. |
| Il compilatore C++ genera un errore "T deve essere di tipo WinRT" per una specializzazione di un'operazione asincrona di Windows Runtime. | Valutare invece la restituzione di un task di Parallel Patterns Library (PPL). Vedere Concorrenza e operazioni asincrone. |
| Il compilatore C++ genera un errore "T must be WinRT type" quando chiami winrt::xaml_typename. | Usare il tipo proiettato con winrt::xaml_typename (ad esempio, usare BgLabelControlApp::BgLabelControl) e non il tipo di implementazione(ad esempio, non usare BgLabelControlApp::implementation::BgLabelControlControl). Vedi Controlli personalizzati XAML (basati su modelli). |
| Il compilatore C++ genera "errore C2220: avviso considerato come errore - nessun file 'object' generato". | Correggere l'avviso o impostare C/C++>General>Considera gli avvisi come errori su No (/WX-). |
| L'app si arresta in modo anomalo perché un gestore di eventi del tuo oggetto C++/WinRT viene chiamato dopo che l'oggetto è stato distrutto. | Vedere Accesso sicuro al puntatore this con un delegato di gestione degli eventi. |
| Il compilatore C++ genera l'errore "C2338: questo è solo per il supporto di riferimento debole". | Si richiede un riferimento debole per un tipo che ha specificato la struttura marcatore winrt::no_weak_ref come argomento di modello per la propria classe base. Vedi Disattivazione del supporto per i riferimenti deboli. |
| Il compilatore C++ produce "consume_Something: la funzione che restituisce 'auto' non può essere usata prima di essere definita" | Vedi C3779: Perché il compilatore genera l'errore «consume_Something: la funzione che restituisce 'auto' non può essere usata prima di essere definita»?. |
| Il linker C++ genera "errore LNK2019: simbolo esterno non risolto" | Vedi Perché il linker genera l'errore "LNK2019: simbolo esterno non risolto"?. |
| La toolchain LLVM e Clang genera errori quando vengono usati con C++/WinRT. | Non è supportata la toolchain LLVM e Clang per C++/WinRT, ma se si vuole emulare il modo in cui viene usata internamente, è possibile provare un esperimento come quello descritto in Posso usare LLVM/Clang per compilare con C++/WinRT?. |
| Il compilatore C++ produce "nessun costruttore predefinito appropriato disponibile" per un tipo proiettato. | Se si sta tentando di ritardare l'inizializzazione di un oggetto classe di runtime o di utilizzare e implementare una classe di runtime nello stesso progetto, sarà necessario chiamare il costruttore std::nullptr_t . Per altre info, vedi Usare le API con C++/WinRT. |
| Il compilatore C++ genera l'errore "C3861: 'from_abi': identificatore non trovato" e altri errori originati in base.h. Questo errore può essere visualizzato se si usa Visual Studio 2017 (versione 15.8.0 o successiva) e la destinazione è Windows SDK versione 10.0.17134.0 (Windows 10, versione 1803). | Specificare come destinazione una versione successiva (più conforme) di Windows SDK oppure impostare la proprietà del progetto C/C++>Language>Conformance mode: No (inoltre, se /permissive- compare nella proprietà del progetto C/C++>Language>Command Line in Additional Options, eliminarlo). |
| Il compilatore C++ genera l'errore "C2039: 'IUnknown': non è membro di ''global namespace''". | Vedere Come ridefinire il progetto C++/WinRT in una versione successiva di Windows SDK. |
| Il linker C++ genera "error LNK2019: unresolved external symbol _WINRT_CanUnloadNow@0 referenced in function _VSDesignerCanUnloadNow@0" | Vedere Come ridefinire il progetto C++/WinRT in una versione successiva di Windows SDK. |
| Il processo di compilazione genera il messaggio di errore Il VSIX di C++/WinRT non fornisce più il supporto per la compilazione del progetto. Aggiungere un riferimento al progetto al pacchetto NuGet Microsoft.Windows.CppWinRT. | Installare il pacchetto NuGet Microsoft.Windows.CppWinRT nel progetto. Per informazioni dettagliate, vedere Versioni precedenti dell'estensione VSIX. |
| Il linker C++ genera un errore LNK2019: simbolo esterno non risolto, con una menzione di winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partire da C++/WinRT 2.0, se si usa un costrutto basato su intervallo for in una raccolta di Windows Runtime, sarà ora necessario #include <winrt/Windows.Foundation.Collections.h>. |
| Il compilatore C++ genera l'errore "C4002: Troppi argomenti per la chiamata di macro di tipo funzione GetCurrentTime". | Vedere Come risolvere le ambiguità con GetCurrentTime e/o TRY?. |
| Il compilatore C++ genera "errore C2334: token imprevisti precedenti '{'; ignorando il corpo della funzione apparente". | Vedere Come risolvere le ambiguità con GetCurrentTime e/o TRY?. |
| Il compilatore C++ produce "winrt::impl::produce<D,I> impossibile creare un'istanza della classe astratta, a causa dell'assenza di GetBindingConnector". | È necessario #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| Il compilatore C++ genera l'errore "C2039: 'promise_type': non è un membro di 'std::experimental::coroutine_traits<void>'". | La coroutine deve restituire o un oggetto che rappresenta un'operazione asincrona oppure winrt::fire_and_forget. Vedere Concorrenza e operazioni asincrone. |
| Il progetto produce "accesso ambiguo a 'PopulatePropertyInfoOverride'". | Questo errore può verificarsi quando dichiari una classe di base nel codice IDL e una classe base diversa nel markup XAML. |
| Il caricamento di una soluzione C++/WinRT per la prima volta produce "Compilazione in fase di progettazione non riuscita per il progetto 'MyProject.vcxproj' configurazione 'Debug|x86'. IntelliSense potrebbe non essere disponibile.". | Questo problema di IntelliSense si risolverà dopo la prima compilazione. |
| Se si tenta di specificare winrt::auto_revoke quando si registra un delegato, viene generata un'eccezione winrt::hresult_no_interface. | Vedi Se il delegato di revoca automatica non riesce a registrarsi. |
| In un'app C++/WinRT, quando si utilizza un componente Windows Runtime C# che usa XAML, il compilatore genera un errore del modulo "'MyNamespace_XamlTypeInfo': non è membro di 'winrt::MyNamespace', dove MyNamespace è il nome dello spazio dei nomi del componente Windows Runtime. | Nell'app pch.h C++/WinRT che usa, aggiungere #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>, sostituendo MyNamespace in base alle esigenze. |
| In un progetto C++/WinRT in Visual Studio, IntelliSense restituisce un errore del tipo "error E1696: cannot open source file". | Compilare almeno una volta il progetto appena creato. Fare quindi clic con il pulsante destro del mouse nell'editor > del codice sorgente Ripetere l'analisi>del file. In questo modo verranno risolti tutti gli errori di IntelliSense, incluso E1696. |
Note
Se questo argomento non ha risposto alla domanda, è possibile trovare assistenza visitando la community per sviluppatori di Visual Studio C++ o usando il c++-winrt tag in Stack Overflow.
Argomenti correlati
Note
Molti argomenti C++/WinRT stanno eseguendo la migrazione dalla documentazione UWP a questa sezione. Fino al completamento della migrazione, i collegamenti nell'elenco seguente potrebbero portare alla sezione della documentazione UWP. La proiezione del linguaggio C++/WinRT è la stessa per le app UWP e WinUI 3, in modo che il contenuto sia applicabile in entrambi i contesti. Qualsiasi modello specifico della piattaforma UWP(ad esempio il ciclo di vita dell'app o Windows.UI le API dello spazio dei nomi) viene annotato in modo esplicito in tali articoli.