Diagnosi delle condizioni di errore di componenti Windows Runtime
In questo articolo vengono fornite informazioni aggiuntive sulle restrizioni applicate ai componenti di Windows Runtime scritti con codice gestito. Vengono ampliate le informazioni fornite nei messaggi di errore da Winmdexp.exe (Windows Runtime Metadata Export Tool) e completate le informazioni sulle restrizioni fornite in Creazione di componenti Windows Runtime in C# e Visual Basic.
In questo articolo non vengono presi in considerazione tutti gli errori. Gli errori presentati in questo argomento sono raggruppati per categoria generale e ogni categoria include una tabella di messaggi di errore associati. 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. Includere il messaggio di errore. In alternativa, puoi archiviare un bug sul sito Web Microsoft Connect.
In questo articolo sono incluse le sezioni seguenti:
In fase di implementazione di un modello asincrono, un messaggio di errore fornisce un tipo non corretto
Riferimenti mancanti a mscorlib.dll e/o System.Runtime.dll
L'overload degli operatori non è consentito
I costruttori su una classe hanno lo stesso numero di parametri
È necessario specificare un valore predefinito per gli overload che hanno lo stesso numero di parametri
Errori dello spazio dei nomi e nomi non validi per il file di output
Esportazione di tipi che non sono tipi di Windows Runtime validi
Strutture che contengono campi di tipi non consentiti
Restrizioni sulle matrici nelle firme dei membri
I parametri della matrice devono specificare se il contenuto della matrice è leggibile o scrivibile
Membro con un parametro denominato "value"
Un messaggio di errore per l'implementazione di un'interfaccia asincrona fornisce un tipo non corretto
I componenti Windows Runtime gestiti non possono implementare le interfacce Windows Runtime che rappresentano azioni oppure operazioni asincrone (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> o IAsyncOperationWithProgress<TResult, TProgress>. .NET Framework fornisce invece la classe AsyncInfo per la generazione di operazioni asincrone in componenti Windows Runtime. Il messaggio di errore visualizzato da Winmdexp.exe quando tenti di implementare in modo errato un'interfaccia asincrona fa riferimento a questa classe tramite il nome precedente, AsyncInfoFactory. .NET Framework non include più la classe AsyncInfoFactory.
Numero di errore |
Testo del messaggio |
---|---|
WME1084 |
Il tipo '{0}' implementa l'interfaccia asincrona di Windows Runtime '{1}'. I tipi di Windows Runtime non possono implementare interfacce asincrone. Utilizza la classe System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory per generare operazioni asincrone per l'esportazione in Windows Runtime. |
Riferimenti mancanti a mscorlib.dll o System.Runtime.dll
Questo problema si verifica solo quando utilizzi Winmdexp.exe dalla riga di comando. Ti consigliamo di utilizzare l'opzione /reference per includere riferimenti sia a mscorlib.dll sia a System.Runtime.dll dagli assembly di riferimento principale di .NET Framework, che si trovano in "%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5" ("%ProgramFiles%\..." in un computer a 32 bit.
Numero di errore |
Testo del messaggio |
---|---|
WME1009 |
Nessun riferimento a mscorlib.dll. Un riferimento a questo file di metadati è necessario per un'esportazione corretta. |
WME1090 |
Impossibile determinare l'assembly di riferimento principale. Assicurati che venga fatto riferimento a mscorlib.dll e System.Runtime.dll tramite l'opzione /reference. |
L'overload degli operatori non è consentito
In un componente di Windows Runtime scritto in codice gestito, non è possibile esporre operatori di overload sui tipi pubblici.
Nota
Nel messaggio di errore, l'operatore è identificato dal nome dei metadati, ad esempio op_Addition, op_Multiply, op_ExclusiveOr, op_Implicit (conversione implicita) e così via.
Numero di errore |
Testo del messaggio |
---|---|
WME1087 |
''{0}' è un overload dell'operatore. I tipi gestiti non possono esporre overload degli operatori in Windows Runtime. |
I costruttori su una classe hanno lo stesso numero di parametri
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 solo parametro di tipo String e un altro con un solo parametro di tipo int (Integer in Visual Basic). L'unica soluzione alternativa consiste nell'utilizzare un numero diverso di parametri per ogni costruttore.
Numero di errore |
Testo del messaggio |
---|---|
WME1099 |
Il tipo '{0}' ha più costruttori con '{1}' argomenti. I tipi Windows Runtime non possono avere più costruttori con lo stesso numero di argomenti. |
È necessario specificare un valore predefinito per gli overload che hanno lo stesso numero di parametri
In Windows Runtime, i metodi di overload possono avere lo stesso numero di parametri solo se un overload è specificato come predefinito. Vedi "Metodi di overload" in Creazione di componenti Windows Runtime in C# e Visual Basic.
Numero di errore |
Testo del messaggio |
---|---|
WME1059 |
Più overload di parametro {0} di '{1}.{2}' decorati con Windows.Foundation.Metadata.DefaultOverloadAttribute. |
WME1085 |
Per gli overload di parametro {0} di {1}.{2} deve essere specificato esattamente un metodo come overload predefinito decorandolo con Windows.Foundation.Metadata.DefaultOverloadAttribute. |
Errori dello spazio dei nomi e nomi non validi per il file di output
In Windows 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 2012 è denominato A.B, ovvero il componente di Windows Runtime è A.B.winmd, può contenere le classi pubbliche A.B.Class1 e A.B.C.Class2, ma non A.Class3 (WME0006) o D.Class4 (WME1044).
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 di Windows Runtime. Sebbene WME0006 sia un avviso, devi considerarlo come un errore. 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 (WME1067).
Il componente deve contenere almeno un tipo public sealed (Public NotInheritable in Visual Basic). In caso contrario, otterrai WME1042 o WME1043, a seconda che il componente contenga o meno tipi privati.
Un tipo in un componente di Windows Runtime non può avere un nome che è uguale allo spazio dei nomi (WME1068).
Avviso
Se chiami direttamente Winmdexp.exe e non utilizzi l'opzione /out per specificare un nome per il componente di Windows Runtime, Winmdexp.exe tenta di generare un nome che include tutti gli spazi dei nomi nel componente. La ridenominazione degli spazi può modificare il nome del componente.
Numero di errore |
Testo del messaggio |
---|---|
WME0006 |
'{0}' non è un nome file winmd valido per questo assembly. 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. È impossibile trovare nel runtime i tipi che non esistono in questo spazio dei nomi secondario. In questo assembly, lo spazio dei nomi comune più piccolo che può essere utilizzato come nome file è '{1}'. |
WME1042 |
Il modulo di input deve contenere almeno un tipo pubblico presente in uno spazio dei nomi. |
WME1043 |
Il modulo di input deve contenere almeno un tipo pubblico presente in uno spazio dei nomi. Gli unici tipi trovati all'interno degli spazi dei nomi sono privati. |
WME1044 |
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. |
WME1067 |
I nomi degli spazi dei nomi non possono distinguersi solo per le maiuscole o minuscole: '{0}', '{1}'. |
WME1068 |
Il tipo ''{0}' non può presentare lo stesso nome dello spazio dei nomi '{1}'. |
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 Framework fornisce i mapping per una serie di tipi di uso comune che sono leggermente diversi in .NET Framework e in Windows Runtime. In questo modo lo sviluppatore di .NET Framework può utilizzare tipi comuni anziché apprenderne di nuovi. Puoi utilizzare questi tipi .NET Framework mappati nell'interfaccia pubblica del componente. Vedi "Dichiarazione di tipi in componenti di Windows Runtime" e "Passaggio di tipi di Windows Runtime al codice gestito" in Creazione di componenti Windows Runtime in C# e Visual Basic e Mapping di .NET Framework dei tipi di Windows Runtime.
Molti di questi mapping sono interfacce. Ad esempio, IList<T> a Windows Runtime corrisponde all'interfaccia IVector<T>. Se utilizzi List<string> (List(Of String) in Visual Basic) anziché IList<string> come tipo di parametro, Winmdexp.exe fornisce un elenco delle alternative che comprende tutte le interfacce mappate implementate da List<T>. Se utilizzi tipi generici annidati, come List<Dictionary<int, string>> (List(Of Dictionary(Of Integer, String)) in Visual Basic), Winmdexp.exe 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>.
Importante
JavaScript utilizza l'interfaccia visualizzata per prima nell'elenco di interfacce implementate da un tipo gestito. Se ad esempio restituisci Dictionary<int, string> al codice JavaScript, viene visualizzato come IDictionary<int, string> indipendentemente dall'interfaccia specificata come tipo restituito. Ciò significa che se la prima interfaccia non include un membro visualizzato nelle interfacce successive, tale membro non è visibile a JavaScript.
Avviso
Evitare di utilizzare le interfacce IList e IEnumerable non generiche se il componente verrà utilizzato da JavaScript. Il mapping di queste interfacce viene eseguito, rispettivamente, a IBindableVector e IBindableIterator. Supportano l'associazione per i controlli XAML e sono invisibili a JavaScript. JavaScript genera l'errore di runtime "La funzione 'X' ha una firma non valida e non può essere chiamata".
Numero di errore |
Testo del messaggio |
---|---|
WME1033 |
Il metodo '{0}' contiene il parametro '{1}' di tipo '{2}'. '{2}' non è un tipo di parametro di Windows Runtime valido. |
WME1038 |
Nella sua firma il metodo '{0}' contiene un parametro di tipo '{1}'. Sebbene questo tipo non sia un tipo di Windows Runtime valido, implementa interfacce che sono tipi di Windows Runtime validi. Valuta invece la modifica della firma del metodo per l'utilizzo di uno dei tipi seguenti: '{2}'. |
WME1039 |
Nella sua firma il metodo '{0}' contiene un parametro di tipo '{1}'. Sebbene questo tipo generico non sia un tipo di Windows Runtime valido, il tipo o i relativi parametri generici implementano interfacce che sono tipi di Windows Runtime validi. {2}
Nota
Per {2}, Winmdexp.exe aggiunge un elenco di alternative, ad esempio "Valutare la modifica del tipo 'System.Collections.Generic.List<T>' nella firma del metodo in uno dei tipi seguenti: 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>'."
|
WME1040 |
Nella sua firma il metodo '{0}' contiene un parametro di tipo '{1}'. Anziché utilizzare un tipo di attività gestito, utilizza Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation o una delle altre interfacce asincrone di Windows Runtime. Anche il modello di awaiter .NET standard è applicabile a queste interfacce. Per ulteriori informazioni sulla conversione di oggetti attività gestiti in interfacce asincrone di Windows Runtime, vedi System.Runtime.InteropServices.WindowsRuntime.AsyncInfo. |
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 |
---|---|
WME1060 |
La struttura '{0}' contiene il campo '{1}' di tipo '{2}'. '{2}' 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. |
Restrizioni sulle matrici nelle firme dei membri
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 come myArray[][] (myArray()() in Visual Basic) non sono consentiti.
Nota
Questa restrizione non si applica alle matrici utilizzate internamente nell'implementazione.
Numero di errore |
Testo del messaggio |
---|---|
WME1034 |
Nella sua firma il metodo '{0}' contiene una matrice di tipo '{1}' con limite inferiore diverso da zero. Le matrici nelle firme dei metodi di Windows Runtime devono avere un limite inferiore pari a zero. |
WME1035 |
Nella sua firma il metodo '{0}' contiene una matrice multidimensionale di tipo '{1}'. Nelle firme dei metodi di Windows Runtime le matrici devono essere unidimensionali. |
WME1036 |
Nella sua firma il metodo '{0}' contiene una matrice annidata di tipo '{1}'. Le matrici presenti nelle firme dei metodi di Windows Runtime non possono essere annidate. |
I parametri della matrice devono specificare se il contenuto della matrice è leggibile o scrivibile
In Windows Runtime i parametri devono essere di sola lettura o di sola scrittura. I parametri non possono essere contrassegnati come ref (ByRef senza l'attributo OutAttribute in Visual Basic). Questa restrizione si applica al contenuto delle matrici, pertanto i parametri di matrice devono indicare se il contenuto delle matrici è di sola lettura o di sola scrittura. La direzione è chiara per i parametri out (parametro ByRef con l'attributo OutAttribute in Visual Basic), ma i parametri di matrice passati in base al valore (ByVal in Visual Basic) devono essere contrassegnati. Vedi Passaggio di matrici a un componente Windows Runtime.
Numero di errore |
Testo del messaggio |
---|---|
WME1101 |
Il metodo '{0}' contiene il parametro '{1}' che è una matrice e contiene sia {2} sia {3}. In Windows Runtime, i parametri di matrice di contenuto devono essere leggibili o scrivibili. Rimuovere uno degli attributi da '{1}'. |
WME1102 |
Il metodo '{0}' contiene un parametro di output '{1}' che è una matrice, ma che contiene {2}. In Windows Runtime, il contenuto delle matrici di output è scrivibile. Rimuovere l'attributo da '{1}'. |
WME1103 |
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 di matrice devono contenere {2} o {3}. Se necessario, rimuovere questi attributi o sostituirli con l'attributo di Windows Runtime appropriato. |
WME1104 |
Il metodo '{0}' contiene il parametro '{1}' che non è una matrice e che presenta {2} o {3}. In Windows Runtime non è supportato il contrassegno dei parametri non di matrice con {2} o {3}. |
WME1105 |
Il metodo '{0}' contiene il parametro '{1}' con System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute. In Windows Runtime non è supportato 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'. Il metodo '{0}' contiene il parametro '{1}' con System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute. In Windows Runtime è supportato unicamente il contrassegno dei parametri ByRef con System.Runtime.InteropServices.OutAttribute e non sono supportati altri utilizzi di questi attributi. |
WME1106 |
Il metodo '{0}' contiene il parametro '{1}' che è una matrice. In Windows Runtime il contenuto dei parametri di matrice deve essere leggibile o modificabile. Applica {2} o {3} a '{1}'. |
Membro con un parametro denominato "value"
In Windows Runtime i valori restituiti sono considerati parametri di output e i nomi dei parametri devono essere univoci. Per impostazione predefinita, Winmdexp.exe assegna al valore restituito il nome "value". Se il tuo metodo ha un parametro denominato "value", viene generato l'errore WME1092. Per correggere questo problema, è possibile procedere in due modi:
Assegna al parametro un nome diverso da "value" (nelle funzioni di accesso alla proprietà, un nome diverso da "returnValue").
Utilizza l'attributo ReturnValueNameAttribute per modificare il nome del valore restituito, come illustrato qui:
using System.Runtime.InteropServices; using System.Runtime.InteropServices.WindowsRuntime; [return: ReturnValueName("average")] public int GetAverage(out int lowValue, out int highValue)
Imports System.Runtime.InteropServices Imports System.Runtime.InteropServices.WindowsRuntime Public Function GetAverage(<Out> ByRef lowValue As Integer, _ <Out> ByRef highValue As Integer) As <ReturnValueName("average")> String
Nota
Se cambi il nome del valore restituito e il nuovo nome è in conflitto con quello di un altro parametro, viene generato l'errore WME1091.
Il codice JavaScript può accedere ai parametri di output di un metodo in base al nome, incluso il valore restituito. Per un esempio, vedi l'attributo ReturnValueNameAttribute.
Numero di errore |
Testo del messaggio |
---|---|
WME1091 |
Il metodo '{0}' presenta il valore restituito denominato '{1}' che corrisponde a un nome di parametro. I parametri dei metodi di Windows Runtime e il valore restituito devono avere nomi univoci. |
WME1092 |
Il metodo '{0}' contiene un parametro denominato '{1}' che corrisponde al nome del valore restituito predefinito. Valuta l'utilizzo di un altro nome per il parametro o usa System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute per specificare esplicitamente il nome o il valore restituito.
Nota
Il nome predefinito è "returnValue" per le funzioni di accesso alla proprietà e "value" per tutti gli altri metodi.
|
Vedere anche
Riferimenti
Winmdexp.exe (Windows Runtime Metadata Export Tool)
Concetti
Creazione di componenti Windows Runtime in C# e Visual Basic