Domande frequenti su C++/WinRTFrequently-asked questions about C++/WinRT

Risposte alle domande che potresti porti sulla creazione e sull'utilizzo delle API Windows Runtime con C++/WinRT.Answers to questions that you're likely to have about authoring and consuming Windows Runtime APIs with C++/WinRT.

Importante

Per le note sulla versione relative a C++/WinRT, vedi Funzionalità nuove e aggiornate di C++/WinRT 2.0.For release notes about C++/WinRT, see News, and changes, in C++/WinRT 2.0.

Nota

Se la domanda riguarda un messaggio di errore visualizzato, vedi anche l'argomento Risoluzione dei problemi di C++/WinRT.If your question is about an error message that you've seen, then also see the Troubleshooting C++/WinRT topic.

Dove si possono trovare app di esempio C++/WinRT?Where can I find C++/WinRT sample apps?

Vedere App di esempio C++/WinRT.See C++/WinRT sample apps.

Come posso impostare una versione più recente di Windows SDK come destinazione per il mio progetto C++/WinRT?How do I retarget my C++/WinRT project to a later version of the Windows SDK?

Vedi Come impostare una versione più recente di Windows SDK come destinazione per il progetto C++/WinRT.See How to retarget your C++/WinRT project to a later version of the Windows SDK.

Perché il mio nuovo progetto non viene compilato dopo il passaggio a C++/WinRT 2.0?Why won't my new project compile, now that I've moved to C++/WinRT 2.0?

Per informazioni su tutte le modifiche (incluse quelle che possono causare interruzioni), vedi Novità e modifiche in C++/WinRT 2.0.For the full set of changes (including breaking changes), see News, and changes, in C++/WinRT 2.0. Ad esempio, se usi un'istruzione for basata su intervallo in una raccolta di Windows Runtime, ora dovrai usare #include <winrt/Windows.Foundation.Collections.h>.For example, if you're using a range-based for on a Windows Runtime collection, then you'll now need to #include <winrt/Windows.Foundation.Collections.h>.

Per quale motivo il mio nuovo progetto non viene compilato?Why won't my new project compile? Uso Visual Studio 2017 (versione 15.8.0 o successiva ) e la versione 17134 dell'SDKI'm using Visual Studio 2017 (version 15.8.0 or higher), and SDK version 17134

Se usi Visual Studio 2017 (versione 15.8.0 o successive) con Windows SDK versione 10.0.17134.0 (Windows 10 versione 1803) come destinazione, è possibile che la compilazione di un nuovo progetto C++/WinRT non riesca con l'errore "errore C3861: 'from_abi': identificatore non trovato" e con altri errori con origine in base.h.If you're using Visual Studio 2017 (version 15.8.0 or higher), and targeting the Windows SDK version 10.0.17134.0 (Windows 10, version 1803), then a newly created C++/WinRT project may fail to compile with the error "error C3861: 'from_abi': identifier not found", and with other errors originating in base.h. La soluzione è selezionare una versione successiva (più conforme) di Windows SDK come destinazione oppure impostare la proprietà del progetto C/C++ > Linguaggio > Modalità di conformità: No (elimina anche /permissive- se compare nella proprietà del progetto C/C++ > Riga di comando in Opzioni aggiuntive).The solution is to either target a later (more conformant) version of the Windows SDK, or set project property C/C++ > Language > Conformance mode: No (also, if /permissive- appears in project property C/C++ > Command Line under Additional Options, then delete it).

Come posso risolvere l'errore di compilazione "The C++/WinRT VSIX no longer provides project build support.How do I resolve the build error "The C++/WinRT VSIX no longer provides project build support. Please add a project reference to the Microsoft.Windows.CppWinRT Nuget package" (C++/WinRT VSIX non offre più il supporto per la compilazione dei progetti. Aggiungi un riferimento al progetto nel pacchetto NuGet Microsoft.Windows.CppWinRT)?Please add a project reference to the Microsoft.Windows.CppWinRT Nuget package"?

Installa il pacchetto NuGet Microsoft.Windows.CppWinRT nel progetto.Install the Microsoft.Windows.CppWinRT NuGet package into your project. Per informazioni dettagliate, vedi Versioni precedenti dell'estensione VSIX.For details, see Earlier versions of the VSIX extension.

Come posso personalizzare il supporto per la compilazione nel pacchetto NuGet?How do I customize the build support in the NuGet package?

Il supporto per la compilazione C++/WinRT (props/targets) è documentato nel readme del pacchetto NuGet Microsoft.Windows.CppWinRT.C++/WinRT build support (props/targets) is documented in the Microsoft.Windows.CppWinRT NuGet package readme.

Quali sono i requisiti per l'estensione per Visual Studio (VSIX) C++/WinRT?What are the requirements for the C++/WinRT Visual Studio Extension (VSIX)?

Per la versione 1.0.190128.4 dell'estensione VSIX e versioni successive, vedi Supporto di Visual Studio per C++/WinRT.For version 1.0.190128.4 of the VSIX extension and later, see Visual Studio support for C++/WinRT. Per le altre versioni, vedi Versioni precedenti dell'estensione VSIX.For other versions, see Earlier versions of the VSIX extension.

Che cos'è una classe di runtime?What's a runtime class?

Una classe di runtime è un tipo che può essere attivato e utilizzato mediante le interfacce COM moderne, in genere tra limiti eseguibili.A runtime class is a type that can be activated and consumed via modern COM interfaces, typically across executable boundaries. Una classe di runtime può tuttavia essere usata anche nell'unità di compilazione che la implementa.However, a runtime class can also be used within the compilation unit that implements it. Devi dichiarare una classe di runtime nel linguaggio di definizione dell'interfaccia (IDL, Interface Definition Language) e puoi implementarla in codice C++ standard con C++/WinRT.You declare a runtime class in Interface Definition Language (IDL), and you can implement it in standard C++ using C++/WinRT.

Cosa indicano il tipo proiettato e il tipo di implementazione?What do the projected type and the implementation type mean?

Se intendi solo utilizzare una classe Windows Runtime (classe di runtime), avrai a che fare solo con tipi proiettati.If you're only consuming a Windows Runtime class (runtime class), then you'll be dealing exclusively with projected types. C++/WinRT è una proiezione di linguaggio, pertanto i tipi proiettati fanno parte della superficie di Windows Runtime proiettata in C++ con C++/WinRT.C++/WinRT is a language projection, so projected types are part of the surface of the Windows Runtime that's projected into C++ with C++/WinRT. Per altri dettagli, vedi Utilizzare API con C++/WinRT.For more details, see Consume APIs with C++/WinRT.

Il tipo di implementazione contiene l'implementazione di una classe di runtime, pertanto è disponibile solo nel progetto che implementa la classe di runtime.The implementation type contains the implementation of a runtime class, so it's only available in the project that implements the runtime class. Per lavorare a un progetto che implementa classi di runtime (un progetto di componente Windows Runtime o un progetto che usa l'interfaccia utente XAML), è importante avere una certa familiarità con la differenza tra tipo di implementazione per una classe di runtime e tipo proiettato che rappresenta la classe di runtime proiettata in C++/WinRT.When you're working in a project that implements runtime classes (a Windows Runtime component project, or a project that uses XAML UI), it's important to be comfortable with the distinction between your implementation type for a runtime class, and the projected type that represents the runtime class projected into C++/WinRT. Per altri dettagli, vedi Creare API con C++/WinRT.For more details, see Author APIs with C++/WinRT.

Devo dichiarare un costruttore nell'IDL della classe di runtime?Do I need to declare a constructor in my runtime class's IDL?

Solo se la classe di runtime è progettata per essere utilizzata dall'esterno dell'unità di compilazione di implementazione (è un componente Windows Runtime destinato all'uso generale da parte di app client Windows Runtime).Only if the runtime class is designed to be consumed from outside its implementing compilation unit (it's a Windows Runtime component intended for general consumption by Windows Runtime client apps). Per dettagli completi sullo scopo e sulle conseguenze della dichiarazione di costruttori in IDL, vedi Costruttori della classe di runtime.For full details on the purpose and consequences of declaring constructor(s) in IDL, see Runtime class constructors.

Per quale motivo il linker restituisce un errore "LNK2019: Unresolved external symbol" (Simbolo esterno non risolto)?Why is the linker giving me a "LNK2019: Unresolved external symbol" error?

Se il simbolo non risolto è un'API dalle intestazioni dello spazio dei nomi di Windows per la proiezione C++/WinRT (nello spazio dei nomi winrt), l'API è dichiarata in anticipo in un'intestazione che hai incluso, ma la relativa definizione è in un'intestazione che non hai ancora incluso.If the unresolved symbol is an API from the Windows namespace headers for the C++/WinRT projection (in the winrt namespace), then the API is forward-declared in a header that you've included, but its definition is in a header that you haven't yet included. Includi l'intestazione denominata per lo spazio dei nomi dell'API e ricompila.Include the header named for the API's namespace, and rebuild. Per altre info, vedi Intestazioni di proiezione C++/WinRT.For more info, see C++/WinRT projection headers.

Se il simbolo non risolto è una funzione libera di Windows Runtime, ad esempio RoInitialize, dovrai collegare in modo esplicito la raccolta generica WindowsApp.lib nel tuo progetto.If the unresolved symbol is a Windows Runtime free function, such as RoInitialize, then you'll need to explicitly link the WindowsApp.lib umbrella library in your project. La proiezione C++/WinRT dipende da alcune di questi punti di ingresso e funzioni libere (non membro).The C++/WinRT projection depends on some of these free (non-member) functions and entry points. Se usi uno dei modelli di progetto di Estensione C++/WinRT per Visual Studio (VSIX) per l'applicazione, la raccolta WindowsApp.lib viene collegata automaticamente.If you use one of the C++/WinRT Visual Studio Extension (VSIX) project templates for your application, then WindowsApp.lib is linked for you automatically. In caso contrario, puoi usare le impostazioni di collegamento del progetto per includerla o farlo nel codice sorgente.Otherwise, you can use project link settings to include it, or do it in source code.

#pragma comment(lib, "windowsapp")

È importante risolvere eventuali errori del linker collegando WindowsApp.lib invece di una libreria a collegamento statico alternativa. In caso contrario, l'applicazione non supererà i test del kit di certificazione app Windows usati da Visual Studio e da Microsoft Store per convalidare gli invii e questo significa che non sarà di conseguenza possibile l'inserimento corretto della tua applicazione in Microsoft Store.It's important that you resolve any linker errors that you can by linking WindowsApp.lib instead of an alternative static-link library, otherwise your application won't pass the Windows App Certification Kit tests used by Visual Studio and by the Microsoft Store to validate submissions (meaning that it consequently won't be possible for your application to be successfully ingested into the Microsoft Store).

Per quale motivo viene restituita un'eccezione "classe non registrata"?Why am I getting a "class not registered" exception?

In questo caso, il sintomo consiste nel fatto che, durante la creazione di una classe di runtime o l'accesso a un membro statico, viene visualizzata un'eccezione generata in fase di runtime con il valore di HRESULT REGDB_E_CLASSNOTREGISTERED.In this case, the symptom is that—when constructing a runtime class or accessing a static member—you see an exception thrown at runtime with a HRESULT value of REGDB_E_CLASSNOTREGISTERED.

Una delle cause di questa eccezione è data dall'impossibilità di caricare il componente Windows Runtime.One cause can be that your Windows Runtime component can't be loaded. Assicurati che il file di metadati di Windows Runtime del componente (.winmd) abbia lo stesso nome del file binario del componente (.dll), che è anche il nome del progetto e il nome dello spazio dei nomi radice.Make sure that the component's Windows Runtime metadata file (.winmd) has the same name as the component binary (the .dll), which is also the name of the project and the name of the root namespace. Assicurati inoltre che i metadati di Windows Runtime e il file binario siano stati copiati correttamente dal processo di compilazione nella cartella Appx dell'app d'uso.Also make sure that the Windows Runtime metadata and the binary have been corectly copied by the build process to the consuming app's Appx folder. Verifica infine che il file AppxManifest.xml dell'app d'uso (anch'esso nella cartella Appx) contenga un elemento <InProcessServer> che dichiara correttamente la classe attivabile e il nome del file binario.And confirm that the consuming app's AppxManifest.xml (also in the Appx folder) contains an <InProcessServer> element correctly declaring the activatable class and the binary name.

Costruzione uniformeUniform construction

Questo errore può verificarsi anche se si prova a creare un'istanza di una classe di runtime implementata in locale usando uno dei costruttori del tipo proiettato (diverso dal costruttore std::nullptr_t).This error can also happen if you try to instantiate a locally-implemented runtime class via any of the projected type's constructors (other than its std::nullptr_t constructor). Per eseguire questa operazione è necessaria la funzionalità di C++/WinRT 2.0 che viene spesso definita costruzione uniforme.To do that, you'll need the C++/WinRT 2.0 feature that's often called uniform construction. Se vuoi acconsentire esplicitamente all'uso di questa funzionalità, per altre informazioni ed esempi di codice, vedi Acconsentire esplicitamente alla costruzione uniforme e all'accesso diretto all'implementazione.If you want to opt in to that feature, then for more info, and code examples, see Opt in to uniform construction, and direct implementation access.

Se vuoi sapere come creare istanze delle classi di runtime implementate in locale che non richiedono la costruzione uniforme, vedi Controlli XAML, binding a una proprietà C++/WinRT.For a way of instantiating your locally-implemented runtime classes that doesn't require uniform construction, see XAML controls; bind to a C++/WinRT property.

Devo implementare Windows::Foundation::IClosable e, in caso affermativo, come?Should I implement Windows::Foundation::IClosable and, if so, how?

Se hai una classe di runtime che libera risorse all'interno del distruttore e tale classe di runtime è progettata per essere utilizzata dall'esterno della relativa unità di implementazione (si tratta di un componente Windows Runtime destinato all'uso generale da parte di app client Windows Runtime), è consigliabile implementare anche IClosable per supportare l'utilizzo della classe di runtime in linguaggi senza finalizzazione deterministica.If you have a runtime class that frees resources in its destructor, and that runtime class is designed to be consumed from outside its implementing compilation unit (it's a Windows Runtime component intended for general consumption by Windows Runtime client apps), then we recommend that you also implement IClosable in order to support the consumption of your runtime class by languages that lack deterministic finalization. Assicurati che le risorse vengano liberate sia che venga chiamato il distruttore, IClosable::Close o entrambi.Make sure that your resources are freed whether the destructor, IClosable::Close, or both are called. È possibile chiamare IClosable::Close un numero arbitrario di volte.IClosable::Close may be called an arbitrary number of times.

Devo chiamare IClosable::Close sulle classi di runtime utilizzate?Do I need to call IClosable::Close on runtime classes that I consume?

IClosable esiste per supportare i linguaggi senza finalizzazione deterministica.IClosable exists to support languages that lack deterministic finalization. Quindi, di solito, non è necessario chiamare IClosable::Close da C++/WinRT.So, in general, you don't need to call IClosable::Close from C++/WinRT. Considera tuttavia le seguenti eccezioni a tale regola generale.But consider these exceptions to that general rule.

  • In casi molto rari che prevedono race condition di arresto o condizioni di blocco non è necessario chiamare IClosable::Close.There are very rare cases involving shutdown races or semi-deadly embraces, where you do need to call IClosable::Close. Ad esempio, se usi tipi Windows.UI.Composition, possono verificarsi casi in cui vuoi eliminare gli oggetti in una sequenza definita, anziché consentire che l'operazione venga eseguita in automatico tramite la distruzione del wrapper C++/WinRT.If you're using Windows.UI.Composition types, as an example, then you may encounter cases where you want to dispose objects in a set sequence, as an alternative to allowing the destruction of the C++/WinRT wrapper do the work for you.
  • Se non puoi garantire di disporre dell'ultimo riferimento rimanente a un oggetto (perché lo hai passato ad altre API, che potrebbero mantenere un riferimento), è utile chiamare IClosable::Close.If you can't guarantee that you have the last remaining reference to an object (because you passed it to other APIs, which could be keeping a reference), then calling IClosable::Close is a good idea.
  • In caso di dubbi, è più sicuro chiamare IClosable::Close manualmente invece di attendere che il wrapper lo chiami per la distruzione.When in doubt, it's safe to call IClosable::Close manually, rather than waiting for the wrapper to call it on destruction.

Di conseguenza, se sei certo di avere l'ultimo riferimento, puoi lasciare che il distruttore del wrapper esegua l'operazione.So, if you know that you have the last reference, then you can let the wrapper destructor do the work. Per chiudere prima che l'ultimo riferimento scompaia, devi chiamare Close.If you need to close before the last reference vanishes, then you need to call Close. Per essere indipendente dalle eccezioni, devi chiamare Close in un tipo RAII (Resource-Acquisition-is-Initialization), in modo che la chiusura venga eseguita durante la rimozione.To be exception-safe, you should Close in a resource-acquisition-is-initialization (RAII) type (so that close happens on unwind). C++/WinRT non ha un wrapper unique_close, ma puoi crearne uno personale.C++/WinRT doesn't have a unique_close wrapper, but you can make your own.

Posso usare LLVM/Clang per compilare con C++/WinRT?Can I use LLVM/Clang to compile with C++/WinRT?

La toolchain LLVM/Clang non è supportata per C++/WinRT, ma viene usata internamente per convalidare la conformità di C++/WinRT agli standard.We don't support the LLVM and Clang toolchain for C++/WinRT, but we do make use of it internally to validate C++/WinRT's standards conformance. Ad esempio, se vuoi emulare ciò che avviene internamente, puoi provare un esperimento come quello descritto di seguito.For example, if you wanted to emulate what we do internally, then you could try an experiment such as the one described below.

Vai alla pagina dei download di LLVM, cerca Download LLVM 6.0.0 > Pre-Built Binaries (File binari predefiniti) e scarica Clang for Windows (64-bit) .Go to the LLVM Download Page, look for Download LLVM 6.0.0 > Pre-Built Binaries, and download Clang for Windows (64-bit). Durante l'installazione, scegli di aggiungere LLVM alla variabile di sistema PATH per poterlo richiamare da un prompt dei comandi.During installation, opt to add LLVM to the PATH system variable so that you'll be able to invoke it from a command prompt. Ai fini di questo esperimento, puoi ignorare qualsiasi errore "Impossibile trovare la directory dei set di strumenti MSBuild" e/o "Installazione dell'integrazione MSVC non riuscita", se vengono visualizzati.For the purposes of this experiment, you can ignore any "Failed to find MSBuild toolsets directory" and/or "MSVC integration install failed" errors, if you see them. Esistono diversi modi per richiamare LLVM/Clang. L'esempio seguente ne mostra solo uno.There are a variety of ways to invoke LLVM/Clang; the example below shows just one way.

C:\ExperimentWithLLVMClang>type main.cpp
// main.cpp
#pragma comment(lib, "windowsapp")
#pragma comment(lib, "ole32")

#include <winrt/Windows.Foundation.h>
#include <stdio.h>
#include <iostream>

using namespace winrt;

int main()
{
    winrt::init_apartment();
    Windows::Foundation::Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
    std::wcout << rssFeedUri.Domain().c_str() << std::endl;
}

C:\ExperimentWithLLVMClang>clang-cl main.cpp /EHsc /I ..\.. -Xclang -std=c++17 -Xclang -Wno-delete-non-virtual-dtor -o app.exe

C:\ExperimentWithLLVMClang>app
windows.com

Dato che C++/WinRT usa funzionalità dello standard C++ 17, dovrai usare tutti i flag del compilatore necessari per ottenere tale supporto. I flag sono diversi a seconda del compilatore.Because C++/WinRT uses features from the C++17 standard, you'll need to use whatever compiler flags are necessary to get that support; such flags differ from one compiler to another.

Visual Studio è lo strumento di sviluppo supportato e consigliato per C++/WinRT.Visual Studio is the development tool that we support and recommend for C++/WinRT. Vedi Supporto di Visual Studio per C++/WinRT .See Visual Studio support for C++/WinRT.

Per qualche motivo la funzione di implementazione generata per una proprietà di sola lettura ha il qualificatore const?Why doesn't the generated implementation function for a read-only property have the const qualifier?

Quando dichiari una proprietà di sola lettura in MIDL 3.0, è previsto che lo strumento cppwinrt.exe generi automaticamente una funzione di implementazione qualificata con const (una funzione const gestisce il puntatore this come const).When you declare a read-only property in MIDL 3.0, you might expect the cppwinrt.exe tool to generate an implementation function for you that is const-qualified (a const function treats the this pointer as const).

È certamente consigliabile usare const laddove possibile, ma lo strumento cppwinrt.exe non tenta di distinguere tra le funzioni di implementazione che potrebbero essere plausibilmente const e quelle che potrebbero non esserlo.We certainly recommend using const wherever possible, but the cppwinrt.exe tool itself doesn't attempt to reason about which implementation functions might conceivably be const, and which might not. Puoi scegliere di impostare tutte le funzioni di implementazione come const, come in questo esempio.You can choose to make any of your implementation functions const, as in this example.

struct MyStringable : winrt::implements<MyStringable, winrt::Windows::Foundation::IStringable>
{
    winrt::hstring ToString() const
    {
        return L"MyStringable";
    }
};

Puoi rimuovere il qualificatore const per ToString, se decidi che è necessario modificare uno stato di oggetto nella relativa implementazione.You can remove that const qualifier on ToString should you decide that you need to alter some object state in its implementation. Imposta però ogni funzione membro come const o non const.But make each of your member functions either const or non-const, not both. In altre parole, non eseguire l'overload di una funzione di implementazione in const.In other words, don't overload an implementation function on const.

A parte le funzioni di implementazione, un'altra posizione in cui entra in gioco const sono le proiezioni di funzione di Windows Runtime.Aside from your implementation functions, another other place where const comes into the picture is in Windows Runtime function projections. Considera questo codice.Consider this code.

int main()
{
    winrt::Windows::Foundation::IStringable s{ winrt::make<MyStringable>() };
    auto result{ s.ToString() };
}

Per la chiamata a ToString precedente, il comando Vai a dichiarazione in Visual Studio mostra che la proiezione di IStringable::ToString di Windows Runtime in C++/WinRT ha questo aspetto.For the call to ToString above, the Go To Declaration command in Visual Studio shows that the projection of the Windows Runtime IStringable::ToString into C++/WinRT looks like this.

winrt::hstring ToString() const;

Le funzioni nella proiezione sono const, indipendentemente da come scegli di qualificarne l'implementazione.Functions on the projection are const no matter how you choose to qualify your implementation of them. Dietro le quinte, la proiezione chiama l'interfaccia ABI (Application Binary Interface) che corrisponde a una chiamata tramite un puntatore di interfaccia COM.Behind the scenes, the projection calls the application binary interface (ABI), which amounts to a call through a COM interface pointer. L'unico stato con cui interagisce l'elemento ToString proiettato è il puntatore di interfaccia COM e di certo non occorre modificare tale puntatore, quindi la funzione è const.The only state that the projected ToString interacts with is that COM interface pointer; and it certainly has no need to modify that pointer, so the function is const. In questo modo puoi avere la certezza che non verrà modificato nulla del riferimento a IStringable chiamato e che sia possibile chiamare ToString anche con un riferimento const a IStringable.This gives you the assurance that it won't change anything about the IStringable reference that you're calling through, and it ensures that you can call ToString even with a const reference to an IStringable.

Tieni presente che questi esempi di const sono dettagli di implementazione di proiezioni e implementazioni C++/WinRT. Rappresentano buone norme di scrittura del codice a tuo vantaggio.Understand that these examples of const are implementation details of C++/WinRT projections and implementations; they constitute code hygiene for your benefit. In COM o nell'interfaccia ABI di Windows Runtime (per le funzioni membro) non esiste qualcosa di simile a const.There's no such thing as const on the COM nor Windows Runtime ABI (for member functions).

Esistono raccomandazioni per ridurre le dimensioni del codice per i file binari C++/WinRT?Do you have any recommendations for decreasing the code size for C++/WinRT binaries?

Quando si usano oggetti Windows Runtime, dovresti evitare il modello di codifica illustrato di seguito perché può avere un impatto negativo sull'applicazione causando la generazione di più codice binario del necessario.When working with Windows Runtime objects, you should avoid the coding pattern shown below because it can have a negative impact on your application by causing more binary code than necessary to be generated.

anobject.b().c().d();
anobject.b().c().e();
anobject.b().c().f();

Nel mondo Windows Runtime il compilatore non è in grado di memorizzare nella cache il valore di c() o le interfacce per ogni metodo chiamato tramite un riferimento indiretto ('.').In the Windows Runtime world, the compiler is unable to cache either the value of c() or the interfaces for each method that's called through an indirection ('.'). Se non intervieni, ciò comporta più chiamate virtuali e l'overhead di conteggio dei riferimenti.Unless you intervene, that results in more virtual calls and reference counting overhead. Il modello precedente potrebbe facilmente generare il doppio del codice strettamente necessario.The pattern above could easily generate twice as much code as strictly needed. Preferisci invece il modello illustrato di seguito ove possibile.Instead, prefer the pattern shown below wherever you can. Questo modello genera molto meno codice e può anche migliorare drasticamente le prestazioni in fase di esecuzione.It generates a lot less code, and it can also dramatically improve your run time performance.

auto a{ anobject.b().c() };
a.d();
a.e();
a.f();

Il modello consigliato illustrato in precedenza non si applica solo a C++/WinRT ma a tutte le proiezioni del linguaggio di Windows Runtime.The recommended pattern shown above applies not just to C++/WinRT but to all Windows Runtime language projections.

Come si converte una stringa in un tipo, ad esempio per lo spostamento?How do I turn a string into a type—for navigation, for example?

Alla fine dell'esempio di codice della visualizzazione di spostamento (in gran parte in C#), è presente un frammento di codice C++/WinRT che illustra come eseguire questa operazione.At the end of the Navigation view code example (which is mostly in C#), there's a C++/WinRT code snippet showing how to do this.

Come posso risolvere le ambiguità con GetCurrentTime e/o TRY?How do I resolve ambiguities with GetCurrentTime and/or TRY?

Il file di intestazione winrt/Windows.UI.Xaml.Media.Animation.h dichiara un metodo denominato GetCurrentTime, mentre windows.h (tramite winbase.h) definisce una macro denominata GetCurrentTime.The header file winrt/Windows.UI.Xaml.Media.Animation.h declares a method named GetCurrentTime, while windows.h (via winbase.h) defines a macro named GetCurrentTime. Quando si verifica un conflitto tra i due, il compilatore C++ genera l'errore "C4002: troppi argomenti per la chiamata 'GetCurrentTime' della macro simile a funzione".When the two collide, the C++ compiler produces "error C4002: Too many arguments for function-like macro invocation GetCurrentTime".

Analogamente, winrt/Windows.Globalization.h dichiara un metodo denominato TRY, mentre afx.h definisce una macro denominata TRY.Similarly, winrt/Windows.Globalization.h declares a method named TRY, while afx.h defines a macro named TRY. In caso di conflitto, il compilatore C++ genera l'errore "C2334: token imprevisti prima di '{'. Il corpo apparente della funzione verrà ignorato".When these collide, the C++ compiler produces "error C2334: unexpected token(s) preceding '{'; skipping apparent function body".

Per risolvere uno dei problemi oppure entrambi, puoi eseguire questa operazione.To remedy one or both issues, you can do this.

#pragma push_macro("GetCurrentTime")
#pragma push_macro("TRY")
#undef GetCurrentTime
#undef TRY
#include <winrt/include_your_cppwinrt_headers_here.h>
#include <winrt/include_your_cppwinrt_headers_here.h>
#pragma pop_macro("TRY")
#pragma pop_macro("GetCurrentTime")

In che modo è possibile velocizzare il caricamento dei simboli?How do I speed up symbol loading?

In Visual Studio, Strumenti > Opzioni > Debug > Simboli > selezionare Carica solo i moduli specificati.In Visual Studio, Tools > Options > Debugging > Symbols > check Load only specified modules. È quindi possibile fare clic con il pulsante destro del mouse sulle DDL nell'elenco stack e caricare singoli moduli.You can then right-click DLLs in the stack list, and load individual modules.

Nota

Se questo argomento non risponde alla domanda, potresti trovare assistenza visitando il sito della community degli sviluppatori Visual Studio C++ o tramite il tag c++-winrt in Stack Overflow.If this topic didn't answer your question, then you might find help by visiting the Visual Studio C++ developer community, or by using the c++-winrt tag on Stack Overflow.