Condividi tramite


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}

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

NotaNota
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