Condividi tramite


Diagnosi delle condizioni di errore del componente Windows Runtime

Questo articolo fornisce informazioni aggiuntive sulle restrizioni sui componenti Windows Runtime scritti con codice gestito. Si amplia sulle informazioni fornite nei messaggi di errore da parte di Winmdexp.exe (Strumento di esportazione metadati di Windows Runtime), e integra le informazioni sulle restrizioni fornite nei componenti Windows Runtime con C# e Visual Basic .

Questo articolo non illustra tutti gli errori. Gli errori descritti di seguito sono raggruppati per categoria generale e ogni categoria include una tabella di messaggi di errore associati. Cercare testo del messaggio (omettendo valori specifici per i segnaposto) o per il numero di messaggio. Se non trovi le informazioni necessarie qui, aiutaci a migliorare la documentazione usando il pulsante commenti e suggerimenti alla fine di questo articolo. Includere il messaggio di errore. In alternativa, è possibile inviare un bug nel sito Web microsoft Connect.

Il messaggio di errore relativo all'implementazione dell'interfaccia asincrona fornisce un tipo incorretto.

I componenti Windows Runtime gestiti non possono implementare le interfacce UWP (Universal Windows Platform) che rappresentano azioni o operazioni asincrone (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult>o IAsyncOperationWithProgress<TResult, TProgress>). .NET fornisce invece la classe AsyncInfo per generare operazioni asincrone nei componenti Windows Runtime. Il messaggio di errore Winmdexp.exe visualizzato quando si tenta di implementare un'interfaccia asincrona si riferisce erroneamente a questa classe con il suo precedente nome, AsyncInfoFactory. .NET non include più la classe AsyncInfoFactory.

Numero di errore Testo del messaggio
WME1084 Type '{0}' implementa l'interfaccia asincrona di Windows Runtime '{1}'. I tipi Windows Runtime non possono implementare interfacce asincrone. Si prega di usare la classe System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory per generare operazioni asincrone per l'esportazione in Windows Runtime.

Nota I messaggi di errore che fanno riferimento a Windows Runtime usano una terminologia precedente. Questa operazione è ora denominata piattaforma UWP (Universal Windows Platform). Ad esempio, i tipi di Windows Runtime sono ora denominati tipi UWP.

Riferimenti mancanti a mscorlib.dll o System.Runtime.dll

Questo problema si verifica solo quando si usa Winmdexp.exe dalla riga di comando. È consigliabile usare l'opzione /reference per includere riferimenti a mscorlib.dll e System.Runtime.dll dagli assembly di riferimento di .NET Framework core, 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 Non è stato fatto riferimento a mscorlib.dll. Per esportare correttamente, è necessario un riferimento a questo file di metadati.
WME1090 Impossibile determinare l'assembly di riferimento principale. Assicurarsi che mscorlib.dll e System.Runtime.dll facciano riferimento usando l'interruttore /reference.

L'overload degli operatori non è consentito

In un componente Windows Runtime scritto in codice gestito, non è possibile esporre operatori sovraccarichi su tipi pubblici.

Nota Nel messaggio di errore l'operatore viene 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 sovraccarico dell'operatore. I tipi gestiti non possono esporre il sovraccarico degli operatori nel Windows Runtime.

I costruttori di una classe hanno lo stesso numero di parametri

Nella piattaforma UWP 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 con un singolo parametro di tipo int (Integer in Visual Basic). L'unica soluzione alternativa consiste nell'usare un numero diverso di parametri per ogni costruttore.

Numero di errore Testo del messaggio
WME1099 Il tipo '{0}' include 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.

Nella piattaforma UWP, i metodi sovraccarichi possono avere lo stesso numero di parametri solo se uno viene specificato come overload predefinito. Consulta "Metodi di overload" in componenti Windows Runtime con C# e Visual Basic.

Numero di errore Testo del messaggio
WME1059 Svariati sovraccarichi di parametri {0}di '{1}.{2}' sono contrassegnati da Windows.Foundation.Metadata.DefaultOverloadAttribute.
WME1085 Gli overload del parametro {0}di {1}.{2} devono avere esattamente un metodo specificato come overload predefinito, decorato con l'attributo Windows.Foundation.Metadata.DefaultOverloadAttribute.

Errori di namespace e nomi non validi per il file di output

Nella piattaforma UWP (Universal Windows Platform), tutti i tipi pubblici in un file di metadati Windows (.winmd) devono trovarsi in uno spazio dei nomi che condivide il nome del file .winmd o in spazi dei nomi secondari del nome del file. Ad esempio, se il progetto di Visual Studio è denominato A.B (ovvero, il componente Windows Runtime è A.B.winmd), può contenere classi pubbliche A.B.Class1 e A.B.C.Class2, ma non A.Class3 (WME0006) o D.Class4 (WME1044).

Nota Queste restrizioni si applicano solo ai tipi pubblici, non ai tipi privati usati nell'implementazione.

Nel caso di A.Class3, puoi spostare Class3 in un altro spazio dei nomi o modificare il nome del componente Windows Runtime in A.winmd. Anche se WME0006 è un avviso, è consigliabile considerarlo come un errore. Nell'esempio precedente, il codice che chiama A.B.winmd non sarà in grado di individuare A.Class3.

Nel caso di D.Class4, nessun nome file può contenere entrambi D.Class4 e le classi nei namespace A.B, quindi la modifica del nome del componente Windows Runtime non è un'opzione. Puoi spostare D.Class4 in un altro spazio dei nomi o inserirlo in un altro componente Windows Runtime.

Il file system non può distinguere tra maiuscole e minuscole, quindi non sono consentiti namespace che differiscono per il maiuscolo e minuscolo (WME1067).

Il componente deve contenere almeno un tipo di "public sealed" ("Public NotInheritable" in Visual Basic). In caso contrario, otterrai WME1042 o WME1043, a seconda che il tuo componente contenga tipi privati.

Un tipo in un componente Windows Runtime non può avere un nome identico a quello di uno spazio dei nomi (WME1068).

Attenzione Se chiami direttamente Winmdexp.exe e non usi l'opzione /out per specificare un nome per il componente Windows Runtime, Winmdexp.exe prova a generare un nome che include tutti i namespace nel componente. Rinominare i namespace può modificare il nome del componente.

 

Numero di errore Testo del messaggio
WME0006 '{0}' non è un nome di 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 del file. I tipi che non esistono in tale spazio dei nomi secondario non possono trovarsi in fase di esecuzione. In questo insieme, lo spazio dei nomi comune più piccolo che può servire da nome file è '{1}'.
WME1042 Il modulo di input deve contenere almeno un tipo pubblico che si trova all'interno di uno spazio dei nomi.
WME1043 Il modulo di input deve contenere almeno un tipo pubblico che si trova all'interno di uno spazio dei nomi. Gli unici tipi trovati all'interno dei namespace sono privati.
WME1044 Un tipo pubblico ha 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 del file.
WME1067 I nomi degli spazi dei nomi non possono essere diversi solo per caso: '{0}', '{1}'.
WME1068 Il tipo '{0}' non può avere lo stesso nome dello spazio dei nomi '{1}'.

Esportazione di tipi che non sono validi per la piattaforma Universale Windows (Universal Windows Platform)

L'interfaccia pubblica del componente deve esporre solo i tipi UWP. Tuttavia, .NET fornisce mappature per diversi tipi di uso comune che sono leggermente diversi in .NET e nella piattaforma UWP. In questo modo lo sviluppatore .NET può lavorare con tipi familiari invece di apprendere nuovi tipi. È possibile usare questi tipi .NET mappati nell'interfaccia pubblica del componente. Vedere "Dichiarare i tipi nei componenti Windows Runtime" e "Passaggio dei tipi UWP (Piattaforma Universale Windows) nel codice gestito" in componenti Windows Runtime con C# e Visual Basic, e il mapping .NET dei tipi Windows Runtime.

Molte di queste mappature sono interfacce. Ad esempio, IList<T> mappa all'interfaccia UWP IVector<T>. Se si usa List<stringa> (List(Of String) in Visual Basic) anziché IList<stringa> come tipo di parametro, Winmdexp.exe fornisce un elenco di alternative che includono tutte le interfacce mappate implementate da List<T>. Se si usano tipi generici annidati, ad esempio 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 abbastanza lunghi.

In generale, la scelta migliore è l'interfaccia più vicina al tipo. Ad esempio, per Dictionary<int, stringa>, la scelta migliore è probabilmente IDictionary<int, stringa>.

Importante JavaScript usa l'interfaccia visualizzata per prima nell'elenco di interfacce implementate da un tipo gestito. Ad esempio, se si restituisce Dictionary<int, stringa> al codice JavaScript, viene visualizzato come IDictionary<int, stringa> 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.

Attenzione Evitare di usare le interfacce non generiche IList e IEnumerable se il componente verrà usato da JavaScript. Queste interfacce vengono mappate a IBindableVector e a IBindableIterator, rispettivamente. 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}' ha il parametro '{1}' di tipo '{2}'. '{2}' non è un tipo di parametro di Windows Runtime valido.
WME1038 Il metodo '{0}' ha un parametro di tipo '{1}' nella firma. Anche se questo tipo non è un tipo Windows Runtime valido, implementa interfacce che sono tipi di Windows Runtime validi. Considerare la modifica della firma del metodo per usare uno dei tipi seguenti: '{2}'.
WME1039

Il metodo '{0}' ha un parametro di tipo '{1}' nella firma. Anche se questo tipo generico non è un tipo 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, come per esempio: "Considera di cambiare il tipo 'System.Collections.Generic.List<T>' nella firma del metodo con uno dei seguenti tipi: 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>'."
WME1040 Il metodo '{0}' ha un parametro di tipo '{1}' nella firma. Anziché usare un tipo di attività gestita, usare Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation o una delle altre interfacce asincrone di Windows Runtime. Il modello .NET await standard si applica anche a queste interfacce. Per ulteriori informazioni sulla conversione degli oggetti attività gestiti in interfacce asincrone di Windows Runtime, fare riferimento a System.Runtime.InteropServices.WindowsRuntime.AsyncInfo.

 

Strutture che contengono campi di tipi non consentiti

Nella piattaforma UWP una struttura può contenere solo campi e solo le strutture possono contenere campi. Tali campi devono essere pubblici. I tipi di campo validi includono enumerazioni, strutture e tipi primitivi.

Numero di errore Testo del messaggio
WME1060 La struttura '{0}' ha il campo '{1}' di tipo '{2}'. '{2}' non è un tipo di campo di Windows Runtime valido. Ogni campo in una struttura di Windows Runtime può essere solo UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum o una struttura stessa.

 

Restrizioni sulle matrici nelle firme dei membri

Nella piattaforma UWP 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[][] (myArray()() in Visual Basic) non sono consentiti.

Nota Questa restrizione non si applica alle matrici usate internamente nell'implementazione.

 

Numero di errore Testo del messaggio
WME1034 Il metodo '{0}' ha una matrice di tipo '{1}' con limite inferiore diverso da zero nella firma. Le matrici nelle firme dei metodi di Windows Runtime devono avere un limite inferiore pari a zero.
WME1035 Il metodo '{0}' ha una matrice multidimensionale di tipo '{1}' nella relativa firma. Le matrici nelle firme dei metodi di Windows Runtime devono essere unidimensionali.
WME1036 Il metodo '{0}' ha una matrice nidificata di tipo '{1}' nella sua firma. Le matrici 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

Nella piattaforma UWP i parametri devono essere di sola lettura o di sola scrittura. In Visual Basic, i parametri non possono essere etichettati ref (ByRef senza l'attributo OutAttribute). Questo vale per il contenuto delle matrici, pertanto i parametri della matrice devono indicare se il contenuto della matrice è di sola lettura o di sola scrittura. La direzione è chiara per i parametri out (parametroByRef con l'attributo OutAttribute in Visual Basic), ma i parametri dell'array passati per valore (ByVal in Visual Basic) devono essere contrassegnati. Vedere Passaggio di matrici a un componente Windows Runtime.

Numero di errore Testo del messaggio
WME1101 Il metodo '{0}' ha il parametro '{1}' che è una matrice e che ha sia {2} che {3}. In Windows Runtime i parametri della matrice di contenuti devono essere leggibili o scrivibili. Rimuovere uno degli attributi da '{1}'.
WME1102 Il metodo '{0}' ha un parametro di output '{1}' che è una matrice, ma che ha {2}. In Windows Runtime il contenuto delle matrici di output è scrivibile. Rimuovere l'attributo da '{1}'.
WME1103 Il metodo '{0}' ha il parametro '{1}', che è un array e che ha un System.Runtime.InteropServices.InAttribute o un System.Runtime.InteropServices.OutAttribute. In Windows Runtime i parametri della matrice devono avere {2} o {3}. Rimuovere questi attributi o sostituirli con l'attributo Windows Runtime appropriato, se necessario.
WME1104 Il metodo '{0}' ha il parametro '{1}' che non è una matrice e che ha un {2} o un {3}. Windows Runtime non supporta il contrassegno dei parametri non di matrice con {2} o {3}.
WME1105 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. Si prega di considerare la rimozione di System.Runtime.InteropServices.InAttribute e di sostituire System.Runtime.InteropServices.OutAttribute con il modificatore 'out'. Il metodo '{0}' ha il parametro '{1}' con System.Runtime.InteropServices.InAttribute o System.Runtime.InteropServices.OutAttribute. Windows Runtime supporta solo il contrassegno dei parametri ByRef con System.Runtime.InteropServices.OutAttribute e non supporta altri utilizzi di tali attributi.
WME1106 Il metodo '{0}' ha il parametro '{1}' che è una matrice. In Windows Runtime il contenuto dei parametri della matrice deve essere leggibile o scrivibile. Si prega di applicare {2} o {3} all'etichetta '{1}'.

Membro con un parametro chiamato "value"

Nella piattaforma UWP i valori restituiti vengono 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 metodo ha un parametro denominato "value", verrà visualizzato l'errore WME1092. Esistono due modi per risolvere questo problema:

  • Assegnare un nome diverso da "value" (nelle funzioni di accesso alle proprietà un nome diverso da "returnValue").

  • Usare l'attributo ReturnValueNameAttribute per modificare il nome del valore restituito, come illustrato di seguito:

    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 si modifica il nome del valore restituito e il nuovo nome si scontra con il nome di un altro parametro, si otterrà un 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, vedere l'attributo ReturnValueNameAttribute.

Numero di errore Testo del messaggio
WME1091 Il metodo '{0}' ha il valore restituito denominato '{1}' che corrisponde a un nome di parametro. I parametri del metodo di Windows Runtime e il valore restituito devono avere nomi univoci.
WME1092 Il metodo '{0}' ha un parametro denominato '{1}' che corrisponde al nome del valore restituito predefinito. È consigliabile usare un altro nome per il parametro o usare System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute per specificare in modo esplicito il nome del valore restituito.

Nota Il nome predefinito è "returnValue" per le funzioni di accesso alle proprietà e "value" per tutti gli altri metodi.