Diagnosticare gli errori dei componenti C#/WinRT
Questo articolo fornisce informazioni aggiuntive sulle restrizioni relative ai componenti Windows Runtime scritti con C#/WinRT. Si espande sulle informazioni fornite nei messaggi di errore da C#/WinRT quando un autore compila il relativo componente. Per i componenti gestiti UWP .NET Native esistenti, i metadati per i componenti WinRT C# vengono generati usando Winmdexp.exe, uno strumento .NET. Ora che il supporto di Windows Runtime è separato da .NET, C#/WinRT fornisce gli strumenti per generare un file winmd dal componente. Windows Runtime ha più vincoli sul codice rispetto a una libreria di classi C# e lo scanner di diagnostica C#/WinRT avvisa l'utente di questi elementi prima di generare un file con estensione winmd.
Questo articolo illustra gli errori segnalati nella compilazione da C#/WinRT. Questo articolo funge da versione aggiornata delle informazioni sulle restrizioni per i componenti gestiti UWP .NET Native esistenti che usano lo strumento Winmdexp.exe.
Ricerca per testo del messaggio (omettendo i valori specifici per i segnaposto) o per numero del messaggio. Se non trovi le informazioni necessarie qui, aiutaci a migliorare la documentazione tramite il pulsante del feedback alla fine di questo articolo. Nei commenti e suggerimenti, includere il messaggio di errore. In alternativa, è possibile inviare un bug nel repositoryC#/WinRT.
Questo articolo organizza i messaggi di errore per scenario.
Implementazione di interfacce non valide di Windows Runtime
I componenti C#/WinRT non possono implementare determinate interfacce di Windows Runtime, ad esempio le interfacce di Windows Runtime che rappresentano azioni o operazioni asincrone (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> o IAsyncOperationWithProgress<TResult,TProgress>). Usa invece la classe AsyncInfo per generare operazioni asincrone nei componenti Windows Runtime. Nota: queste non sono le uniche interfacce non valide, ad esempio una classe non può implementare System.Exception.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1008 |
Il tipo di componente Windows Runtime {0} non può implementare l'interfaccia {1}, perché non è un'interfaccia di Windows Runtime valida |
Errori correlati agli attributi
In Windows Runtime, i metodi di overload possono avere lo stesso numero di parametri solo se un overload è specificato come predefinito. Usare l'attributo Windows.Foundation.Metadata.DefaultOverload (CsWinRT1015, 1016).
Quando le matrici vengono usate come input o output in funzioni o proprietà, devono essere di sola lettura o di sola scrittura (CsWinRT 1025). Gli attributi System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArray e System.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray vengono forniti per l'uso. Gli attributi forniti sono usati solo per i parametri del tipo di matrice (CsWinRT1026) e deve esserne applicato solo uno per parametro (CsWinRT1023).
Non è necessario applicare alcun attributo a un parametro di matrice contrassegnato con out, perché si presuppone che sia di sola scrittura. In questo caso, viene visualizzato un messaggio di errore se decorato come di sola lettura (CsWinRT1024).
Gli attributi System.Runtime.InteropServices.InAttribute e System.Runtime.InteropServices.OutAttribute non devono essere usati nei parametri di qualsiasi tipo (CsWinRT1021,1022).
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1015 |
Nella classe {2}: più overload di parametro {0} di "{1}" sono decorati con Windows.Foundation.Metadata.DefaultOverloadAttribute. L'attributo può essere applicato solo a un overload del metodo. |
CsWinRT1016 |
Nella classe {2}: gli overload di paramento {0} di {1} devono avere esattamente un metodo specificato come overload predefinito decorandolo con l'attributo Windows.Foundation.Metadata.DefaultOverloadAttribute. |
CsWinRT1021 |
Il metodo "{0}" contiene il parametro "{1}" che è una matrice e che contiene System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute. In Windows Runtime i parametri della matrice devono avere ReadOnlyArray o WriteOnlyArray. Se necessario, rimuovi questi attributi o sostituiscili con l'attributo di Windows Runtime appropriato. |
CsWinRT1022 |
Il metodo "{0}" ha il parametro "{1}" con system.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute.Windows Runtime non supporta il contrassegno dei parametri con System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute. In alternativa, valuta la rimozione di System.Runtime.InteropServices.InAttribute e sostituisci System.Runtime.InteropServices.OutAttribute con il modificatore "out". |
CsWinRT1023 |
Il metodo "{0}" ha il parametro "{1}" che è una matrice e che dispone sia di ReadOnlyArray che di WriteOnlyArray. In Windows Runtime, i parametri di matrice di contenuto devono essere leggibili o scrivibili. Rimuovi uno degli attributi da "{1}". |
CsWinRT1024 |
Il metodo "{0}" ha un parametro di output "{1}" che è una matrice, ma che ha l'attributo ReadOnlyArray. In Windows Runtime, il contenuto delle matrici di output è scrivibile. Rimuovi l'attributo da "{1}". |
CsWinRT1025 |
Il metodo "{0}" ha il parametro "{1}" che è una matrice. In Windows Runtime, il contenuto dei parametri di matrice deve essere leggibile o modificabile. Applica ReadOnlyArray o WriteOnlyArray a "{1}". |
CsWinRT1026 |
Il metodo "{0}" ha il parametro "{1}" che non è una matrice e che dispone di un attributo ReadOnlyArray o di un attributo WriteOnlyArray. Windows Runtime non supporta il contrassegno dei parametri non di matrice con ReadOnlyArray o WriteOnlyArray." |
Errori dello spazio dei nomi e nomi non validi per il file di output
In Winfows Runtime, tutti i tipi pubblici in un file di metadati di Windows (con estensione winmd) devono essere in uno spazio dei nomi che condivide il nome del file con estensione winmd o in spazi dei nomi secondari del nome file. Ad esempio, se il progetto Visual Studio è denominato A.B, ovvero il componente Windows Runtime è A.B.winmd, può contenere le classi pubbliche A.B.Class1 e A.B.C.Class2, ma non A.Class3 o D.Class4.
Nota
Queste restrizioni riguardano solo i tipi pubblici, non i tipi privati utilizzati nell'implementazione.
Nel caso di A.Class3 puoi spostare Class3 in un altro spazio dei nomi o modificare in A.winmd il nome del componente Windows Runtime. Nell'esempio precedente il codice che chiama A.B.winmd non potrà individuare A.Class3.
Nel caso di D.Class4, nessun nome file può contenere sia D.Class4 sia le classi nello spazio dei nomi A.B, pertanto la modifica del nome del componente di Windows Runtime non è un'opzione. Puoi spostare D.Class4 in un altro spazio dei nomi o inserirlo in un altro componente di Windows Runtime.
Il file system non è in grado di distinguere tra lettere maiuscole e minuscole, pertanto gli spazi dei nomi che si differenziano solo in base a maiuscole e minuscole non sono consentiti (CsWinRT1002).
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1001 |
Un tipo pubblico presenta uno spazio dei nomi ("{1}") che non condivide alcun prefisso comune con altri spazi dei nomi ("{0}"). Tutti i tipi all'interno di un file di metadati di Windows devono esistere in uno spazio dei nomi secondario dello spazio dei nomi implicito nel nome file. |
CsWinRT1002 |
Sono stati trovati molteplici spazi dei nomi con il nome "{0}". I nomi degli spazi dei nomi non possono differire solo in base al caso in Windows Runtime. |
Esportazione di tipi che non sono tipi di Windows Runtime validi
L'interfaccia pubblica del componente deve esporre solo tipi di Windows Runtime. Tuttavia, .NET fornisce mapping per una serie di tipi di uso comune leggermente diversi in .NET e Windows Runtime. In questo modo lo sviluppatore di .NET può utilizzare tipi comuni anziché apprenderne di nuovi. Puoi utilizzare questi tipi .NET Framework mappati nell'interfaccia pubblica del componente. Per altre informazioni, vedi Dichiarazioni di tipi nei componenti Windows Runtime, Passaggio di tipi di Windows Runtime al codice gestito e mapping .NET dei tipi Windows Runtime.
Molti di questi mapping sono interfacce. Ad esempio, IList<T> esegue il mapping all'interfaccia IVector<T>dell'interfaccia di Windows Runtime. Se usi List<string> anziché IList<string> come tipo di parametro, C#/WinRT fornisce un elenco di alternative che include tutte le interfacce mappate implementate da List<T>. Se usi tipi generici annidati, ad esempio List<Dictionary<int, string>>, C#/WinRT offre opzioni per ogni livello di annidamento. Questi elenchi possono diventare piuttosto lunghi.
La scelta migliore è in genere l'interfaccia più vicina al tipo. Ad esempio, per Dictionary<int, string>, la scelta migliore è probabilmente IDictionary<int, string>.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1006 |
Il membro "{0}" ha il tipo "{1}" nella propria firma. Il tipo "{1}" non è un tipo di Windows Runtime valido. Tuttavia, il tipo (o i relativi parametri generici) implementa interfacce che sono tipi di Windows Runtime validi. Valuta la possibilità di modificare il tipo "{1}" nella firma del membro in uno dei tipi seguenti da System.Collections.Generic: {2}. |
In Windows Runtime, le matrici nelle firme dei membri devono essere unidimensionali con un limite inferiore pari a 0 (zero). I tipi di matrice annidati, ad esempio myArray[][]
(CsWinRT1017) e myArray[,]
(CsWinRT1018) non sono consentiti.
Nota
Questa restrizione non si applica alle matrici usate internamente nell'implementazione.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1017 |
Nella sua firma il metodo {0} contiene una matrice annidata di tipo {1}. Non è possibile annidare le matrici nella firma del metodo Windows Runtime. |
CsWinRT1018 |
Nella sua firma il metodo "{0}" contiene una matrice multidimensionale di tipo "{1}". Le matrici nelle firme dei metodi di Windows Runtime devono essere unidimensionali. |
Strutture che contengono campi di tipi non consentiti
In Windows Runtime, una struttura può contenere solo campi e solo le strutture possono contenere campi. Questi campi devono essere pubblici. I tipi di campi validi includono enumerazioni, strutture e tipi primitivi.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1007 |
La struttura {0} non contiene campi pubblici. Le strutture di Windows Runtime devono contenere almeno un campo pubblico. |
CsWinRT1011 |
La struttura {0} ha un campo non pubblico. Tutti i campi devono essere pubblici per le strutture di Windows Runtime. |
CsWinRT1012 |
La struttura {0} ha il campo const. Le costanti possono essere visualizzate solo nelle enumerazioni di Windows Runtime. |
CsWinRT1013 |
La struttura {0} ha un campo di tipo {1}; {1} non è un tipo di campo di Windows Runtime valido. Ogni campo di una struttura di Windows Runtime può essere solo UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum o una struttura. |
Il nome del parametro è in conflitto con il codice generato
In Windows Runtime, i valori restituiti sono considerati parametri di output e i nomi dei parametri devono essere univoci. Per impostazione predefinita, C#/WinRT assegna al valore restituito il nome __retval
. Se il metodo ha un parametro denominato __retval
, verrà visualizzato l'errore CsWinRT1010. Per risolvere il problema, assegna al parametro un nome diverso da __retvalue
.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1010 |
Il nome del parametro {1} nel metodo {0} è uguale al nome del parametro del valore restituito usato nell'interoperabilità C#/WinRT generata. Usa un nome di parametro diverso. |
Varie
Altre restrizioni in un componente creato da C#/WinRT includono:
- Non è possibile esporre operatori di overload su tipi pubblici.
- Le classi e le interfacce non possono essere generiche.
- Le classi devono essere bloccate.
- I parametri non possono essere passati per riferimento, ad esempio usando la parola chiave ref.
- Le proprietà devono avere un metodo get pubblico.
- Nello spazio dei nomi del componente deve essere presente almeno un tipo pubblico (classe o interfaccia).
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1014 |
"{0}" è un overload dell'operatore. I tipi gestiti non possono esporre overload degli operatori in Windows Runtime. |
CsWinRT1004 |
Il tipo {0} è generico. I tipi di Windows Runtime non possono essere generici. |
CsWinRT1005 |
L'esportazione di tipi non bloccati non è supportata in CsWinRT. Contrassegna il tipo {0} come sealed. |
CsWinRT1020 |
Il metodo "{0}" ha il parametro "{1}" contrassegnato come 'ref'. I parametri di riferimento non sono consentiti in Windows Runtime. |
CsWinRT1000 |
La proprietà "{0}" non dispone di un metodo getter pubblico. Windows Runtime non supporta le proprietà di solo setter. |
CsWinRT1003 |
I componenti Windows Runtime devono avere almeno un tipo pubblico |
In Windows Runtime, una classe può avere un solo costruttore con un determinato numero di parametri. Ad esempio, non è possibile avere un costruttore con un singolo parametro di tipo string e un altro costruttore con un singolo parametro di tipo int. L'unica soluzione alternativa consiste nell'usare un numero diverso di parametri per ogni costruttore.
Numero di errore |
Testo del messaggio |
---|---|
CsWinRT1009 |
Le classi non possono avere più costruttori dello stesso grado in Windows Runtime, la classe {0} ha molteplici costruttori di grado {1}. |