Condividi tramite


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

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}.