Diagnostizieren von Fehlerbedingungen für Komponenten für Windows-Runtime

Dieser Artikel enthält zusätzliche Informationen zu Einschränkungen für Windows-Runtime Komponenten, die mit verwaltetem Code geschrieben wurden. Es erweitert die Informationen, die in Fehlermeldungen von Winmdexp.exe (Windows-Runtime Metadatenexporttool) bereitgestellt werden, und ergänzt die Informationen zu Einschränkungen, die in Windows-Runtime-Komponenten mit C# und Visual Basic bereitgestellt werden.

In diesem Artikel werden aber nicht alle Fehler abgedeckt. Die hier beschriebenen Fehler sind in allgemeine Kategorien eingeteilt, und jede Kategorie enthält eine Tabelle mit den zugehörigen Fehlermeldungen. Suchen Sie nach dem Meldungstext (ohne bestimmte Werte für Platzhalter) oder der Meldungsnummer. Falls Sie die benötigten Informationen hier nicht finden, können Sie mithilfe der Feedback-Schaltfläche am Ende dieses Artikels zur Verbesserung der Dokumentation beitragen. Geben Sie dabei die Fehlermeldung an. Alternativ können Sie einen Fehler auf der Microsoft Connect-Website melden.

Fehlermeldung beim Implementieren einer asynchronen Schnittstelle stellt den falschen Typ bereit

Verwaltete Windows-Runtime-Komponenten können keine Universelle Windows-Plattform-Schnittstellen (UWP) implementieren, die asynchrone Aktionen oder Vorgänge darstellen (IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> oderIAsyncOperationWithProgress<TResult, TProgress>). Stattdessen stellt .NET die AsyncInfo-Klasse zum Generieren asynchroner Vorgänge in Windows-Runtime-Komponenten bereit. Die Fehlermeldung, die Winmdexp.exe bei dem Versuch anzeigt, eine asynchrone Schnittstelle zu implementieren, verweist auf diese Klasse mit ihrem früheren Namen, AsyncInfoFactory. .NET enthält die AsyncInfoFactory-Klasse nicht mehr.

Fehlernummer Meldungstext
WME1084 Der Typ "{0}" implementiert Windows-Runtime asynchrone Schnittstelle ""{1}. Windows-Runtime-Typen dürfen keine Async-Schnittstellen implementieren. Verwenden Sie die System.Runtime.InteropServices.WindowsRuntime.AsyncInfo-Klasse, um asynchrone Vorgänge für den Export in die Windows-Runtime zu erstellen.

Hinweis In Fehlermeldungen, die auf die Windows-Runtime verweisen, wird ein alte Terminologie verwendet. Dies wird nun als die universelle Windows-Plattform (UWP) bezeichnet. Zum Beispiel werden Windows-Runtime-Typen jetzt als UWP-Typen bezeichnet.

Fehlende Verweise auf mscorlib.dll oder System.Runtime.dll

Dieses Problem tritt nur auf, wenn Sie Winmdexp.exe aus der Befehlszeile ausführen. Es wird empfohlen, die Option /reference zu verwenden, um Verweise auf mscorlib.dll und System.Runtime.dll aus den .NET Framework Kernverweisassemblys einzuschließen, die sich in "%ProgramFiles(x86)%\Reference Assemblies\Microsoft\Framework\ befinden. NETCore\v4.5" ("%ProgramFiles%\..." auf einem 32-Bit-Computer).

Fehlernummer Meldungstext
WME1009 Es wurde kein Verweis auf "mscorlib.dll" festgelegt. Für den ordnungsgemäßen Export ist ein Verweis auf diese Metadatendatei erforderlich.
WME1090 Die Kernverweisassembly konnte nicht ermittelt werden. Stellen Sie sicher, dass mithilfe des /reference-Schalters auf "mscorlib.dll" und "System.Runtime.dll" verwiesen wird.

Operatorüberladung ist nicht zulässig

In einer Komponente für Windows-Runtime, die in verwaltetem Code geschrieben wurde, können Sie keine überladenen Operatoren für öffentliche Typen verfügbar machen.

Hinweis In der Fehlermeldung wird der Operator durch seinen Metadatennamen identifiziert, z. B. op_Addition, op_Multiply, op_ExclusiveOr, op_Implicit (implizite Konvertierung) usw.

Fehlernummer Meldungstext
WME1087 „{0}“ ist eine Operatorüberladung. Verwaltete Typen können in der Windows-Runtime keine überladenen Operatoren verfügbar machen.

Konstruktoren einer Klasse haben die gleiche Anzahl von Parametern

In der UWP kann eine Klasse nur einen Konstruktor mit einer bestimmten Anzahl von Parametern haben. Sie können z. B. keinen Konstruktor verwenden, der einen einzelnen Parameter vom Typ String und einen anderen einzelnen Parameter vom Typ int (Integer in Visual Basic) aufweist. Das Problem kann nur umgangen werden, indem Sie für jeden Konstruktor eine andere Anzahl von Parametern verwenden.

Fehlernummer Meldungstext
WME1099 Der Typ "{0}" verfügt über mehrere Konstruktoren mit "{1}"-Argumenten. Windows-Runtime-Typen dürfen nicht mehrere Konstruktoren mit derselben Anzahl von Argumenten enthalten.

Ein Standard für Überladungen mit derselben Anzahl von Parametern muss festgelegt werden

In der UWP können überladene Methoden nur dann über dieselbe Anzahl von Parametern verfügen, wenn eine Überladung als Standardüberladung angegeben wird. Weitere Informationen finden Sie unter "Überladene Methoden" in Windows-Runtime Komponenten mit C# und Visual Basic.

Fehlernummer Meldungstext
WME1059 Mehrere {0}-Parameterüberladungen von "{1}.{2}" sind mit Windows.Foundation.Metadata.DefaultOverloadAttribute versehen.
WME1085 Für die {0}-Parameterüberladungen von {1}{2} muss genau eine Methode als Standardüberladung angegeben sein, indem sie mit Windows.Foundation.Metadata.DefaultOverloadAttribute dekoriert wird.

Namespacefehler und ungültige Namen für die Ausgabedatei

In der universellen Windows-Plattform müssen sich alle öffentlichen Typen in einer Windows-Metadatendatei (WINMD) in einem Namespace mit demselben Namen wie die WINMD-Datei oder in Subnamespaces des Dateinamens befinden. Wenn Ihr Visual Studio-Projekt beispielsweise A.B heißt (d. h. die Komponente für Windows-Runtime ist A.B.WINMD), kann es die öffentlichen Klassen A.B.Class1 und A.B.C.Class2 enthalten, aber nicht A.Class3 (WME0006) oder D.Class4 (WME1044).

Hinweis Diese Einschränkungen gelten nur für öffentliche Typen, nicht für private Typen, die in Ihrer Implementierung verwendet werden.

Für A.Class3 können Sie Class3 in einen anderen Namespace verschieben oder den Namen der Komponente für Windows-Runtime in A.WINMD ändern. Obwohl WME0006 eine Warnung ist, sollten Sie sie als Fehler behandeln. Im vorherigen Beispiel kann A.Class3 nicht vom Code, der A.B.WINMD aufruft, gefunden werden.

Im Fall von D.Class4 kann kein Dateiname beides, D.Class4 und Klassen im A.B-Namespace, enthalten. Das Ändern des Namens der Komponente für Windows-Runtime ist daher keine Lösung. Sie können D.Class4 entweder in einen anderen Namespace verschieben oder in eine andere Komponente für Windows-Runtime einfügen.

Das Dateisystem kann nicht zwischen Groß- und Kleinbuchstaben unterscheiden. Namespaces mit unterschiedlicher Groß-/Kleinschreibung sind daher nicht zulässig (WME1067).

Die Komponente muss mindestens einen public sealed-Typ (Public NotInheritable in Visual Basic) enthalten. Andernfalls erhalten Sie die Fehlermeldung WME1042 oder WME1043, je nachdem, ob die Komponente private Typen enthält.

Ein Typ in einer Komponente für Windows-Runtime darf nicht wie ein Namespace benannt werden (WME1068).

Vorsicht Wenn Sie Winmdexp.exe direkt aufrufen und nicht die Option /out verwenden, um einen Namen für Ihre Windows-Runtime-Komponente anzugeben, versucht Winmdexp.exe, einen Namen zu generieren, der alle Namespaces in der Komponente enthält. Die Umbenennung von Namespaces kann zur Änderung des Komponentennamens führen.

 

Fehlernummer Meldungstext
WME0006 "{0}" ist kein gültiger winmd-Dateiname für diese Assembly. Alle Typen in einer Windows-Metadatendatei müssen sich in einem Subnamespace des im Dateinamen enthaltenen Namespace befinden. Typen, die nicht in solch einem Subnamespace vorhanden sind, werden zur Laufzeit nicht gefunden. In dieser Assembly lautet der kleinste gemeinsame Namespace, der als Dateiname verwendet werden könnte, '{1}'.
WME1042 Das Eingabemodul muss mindestens einen öffentlichen Typ enthalten, der sich in einem Namespace befindet.
WME1043 Das Eingabemodul muss mindestens einen öffentlichen Typ enthalten, der sich in einem Namespace befindet. In den Namespaces wurden nur private Typen gefunden.
WME1044 Ein öffentlicher Typ hat einen Namespace ('{1}'), der kein gemeinsames Präfix mit anderen Namespaces ('{0}') aufweist. Alle Typen in einer Windows-Metadatendatei müssen sich in einem Subnamespace des im Dateinamen enthaltenen Namespace befinden.
WME1067 Namespacenamen können sich nicht nur nach Groß- und Kleinschreibung unterscheiden: '{0}', '{1}'.
WME1068 Der Typ "{0}" kann nicht denselben Namen wie der Namespace ""{1} haben.

Exportieren von Typen, die keine gültigen universellen Windows-Plattform-Typen sind

Die öffentliche Schnittstelle der Komponente darf nur UWP-Typen verfügbar machen. .NET stellt jedoch Zuordnungen für eine Reihe von häufig verwendeten Typen bereit, die sich in .NET und der UWP geringfügig unterscheiden. Somit können .NET-Entwickler mit bekannten Typen arbeiten, anstatt sich erst mit neuen Typen vertraut machen zu müssen. Sie können diese zugeordneten .NET-Typen in der öffentlichen Schnittstelle Ihrer Komponente verwenden. Weitere Informationen finden Sie unter "Deklarieren von Typen in Windows-Runtime Komponenten" und "Übergeben Universelle Windows-Plattform Typen an verwalteten Code" in Windows-Runtime Komponenten mit C# und Visual Basic sowie .NET-Zuordnungen von Windows-Runtime Typen.

Viele dieser Zuordnungen sind Schnittstellen. Zum Beispiel wird IList<T> der UWP-Schnittstelle IVector<T> zugeordnet. Wenn Sie List<string> (List(Of String) in Visual Basic) anstelle von IList<string> als Parametertyp verwenden, stellt Winmdexp.exe eine Liste von Alternativen zur Verfügung, die alle von List<T> implementierten, zugeordneten Schnittstellen enthält. Bei geschachtelten Typen wie List<Dictionary<int, string>> (List(Of Dictionary(Of Integer, String)) in Visual Basic) bietet Winmdexp.exe verschiedene Optionen für jede Schachtelungsebene an. Diese Listen können recht umfangreich sein.

Im Allgemeinen sollte die Schnittstelle ausgewählt werden, die dem Typ am nächsten ist. Für Dictionary<int, string> ist beispielsweise IDictionary<int, string> am besten geeignet.

Wichtig JavaScript verwendet die Schnittstelle, die zuerst in der Liste der Schnittstellen angezeigt wird, die ein verwalteter Typ implementiert. Wenn Sie beispielsweise „Dictionary<int, string>“ an JavaScript-Code zurückgeben, wird „IDictionary<int, string>“ angezeigt, unabhängig davon, welche Schnittstelle Sie als Rückgabetyp angeben. Das bedeutet, dass die erste Schnittstelle Member enthalten muss, die in den nächsten Schnittstellen erscheinen, damit diese Member für JavaScript sichtbar sind.

Vorsicht Vermeiden Sie die Verwendung der nicht generischen IList - und IEnumerable-Schnittstellen , wenn Ihre Komponente von JavaScript verwendet wird. Diese Schnittstellen werden IBindableVector und IBindableIterator zugeordnet. Sie unterstützen die Bindung für XAML-Steuerelemente und sind für JavaScript nicht sichtbar. JavaScript generiert die Laufzeitfehlermeldung „Die Funktion '%s' kann aufgrund einer ungültigen Signatur nicht aufgerufen werden.”

 

Fehlernummer Meldungstext
WME1033 Methode "{0}" hat den Parameter "{1}" vom Typ ""{2}. '{2}' ist kein gültiger Windows-Runtime-Parametertyp.
WME1038 Die Methode '{0}' hat einen Parameter vom Typ '{1}' in ihrer Signatur. Obwohl dieser Typ kein gültiger Windows-Runtime-Typ ist, implementiert er Schnittstellen, bei denen es sich um gültige Windows-Runtime-Typen handelt. Ändern Sie die Methodensignatur stattdessen eventuell für die Verwendung eines der folgenden Typen: '{2}'.
WME1039

Die Methode '{0}' hat einen Parameter vom Typ '{1}' in ihrer Signatur. Obwohl es sich bei diesem generischen Typ nicht um einen gültigen Windows-Runtime-Typ handelt, werden von diesem Typ oder von dessen generischen Parametern Schnittstellen implementiert, die gültige Windows-Runtime-Typen sind. {2}

> **Hinweis** Für {2}fügt Winmdexp.exe eine Liste von Alternativen an, z. B. "Erwägen Sie, den Typ 'System.Collections.Generic.List<T>' in der Methodensignatur in einen der folgenden Typen zu ändern: 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>'."
WME1040 Die Methode '{0}' hat einen Parameter vom Typ '{1}' in ihrer Signatur. Verwenden Sie anstelle eines verwalteten Aufgabentyps Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation oder eine der anderen Async-Schnittstellen für Windows-Runtime. Das Standardmuster für .NET-Await wird auch auf diese Schnittstellen angewendet. Weitere Informationen zum Konvertieren von verwalteten Task-Objekten in Async-Schnittstellen für Windows-Runtime finden Sie unter „ System.Runtime.InteropServices.WindowsRuntime.AsyncInfo”.

 

Strukturen, die Felder mit unzulässigen Typen enthalten

In der UWP kann eine Struktur nur Felder enthalten, und nur Strukturen können Felder enthalten. Diese Felder müssen öffentlich sein. Zu den gültigen Feldtypen zählen Strukturen, Enumerationen und primitive Typen.

Fehlernummer Meldungstext
WME1060 Die Struktur '{0}' hat das Feld '{1}' vom Typ '{2}'. '{2}' ist kein gültiger Windows-Runtime-Feldtyp. Die Felder in einer Windows-Runtime-Struktur müssen vom Typ UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum sein oder selbst eine Struktur darstellen.

 

Einschränkungen für Arrays in Membersignaturen

In der UWP müssen Arrays in Membersignaturen eindimensional sein und eine Untergrenze von 0 (null) aufweisen. Geschachtelte Arraytypen wie myArray[][] (myArray()() in Visual Basic) sind nicht zulässig.

Hinweis Diese Einschränkung gilt nicht für Arrays, die Sie intern in der Implementierung verwenden.

 

Fehlernummer Meldungstext
WME1034 Methode '{0}' verfügt über ein Array vom Typ "{1}" mit einer Untergrenze von ungleich null in der Signatur. Arrays in Windows-Runtime-Methodensignaturen müssen eine Untergrenze von NULL aufweisen.
WME1035 Die Methode „{0}“ weist in ihrer Signatur ein mehrdimensionales Array des Typs „{1}“ auf. Arrays in Signaturen von Windows-Runtime-Methoden müssen eindimensional sein.
WME1036 Die Methode '{0}' verfügt über ein geschachteltes Array vom Typ '{1}' in ihrer Signatur. Arrays dürfen in Windows-Runtime-Methodensignaturen nicht geschachtelt sein.

 

Arrayparameter müssen angeben, ob Arrayinhalt lesbar oder schreibbar sind

In der UWP müssen Parameter schreibgeschützt oder lesegeschützt sein. Parameter können nicht mit ref (ByRef ohne das OutAttribute-Attribut in Visual Basic) gekennzeichnet werden. Dies gilt für den Inhalt von Arrays. Daher müssen Arrayparameter angeben, ob der Arrayinhalt schreibgeschützt oder lesegeschützt ist. Die Richtung ist für out-Parameter klar (ByRef-Parameter mit dem OutAttribute-Attribut in Visual Basic), aber Arrayparameter, die per Wert übergeben werden (ByVal in Visual Basic), müssen gekennzeichnet werden. Weitere Informationen hierzu finden Sie unter Übergeben von Arrays an eine Komponente für Windows-Runtime.

Fehlernummer Meldungstext
WME1101 Methode "{0}" hat den Parameter "{1}", der ein Array ist und sowohl als {3}auch {2} enthält. Die Inhalte von Arrayparametern müssen in der Windows-Runtime entweder lesbar oder schreibbar sein. Entfernen Sie eines der Attribute aus '{1}'.
WME1102 Methode '{0}' verfügt über einen Ausgabeparameter "{1}", der ein Array ist, aber über {2}verfügt. Die Inhalte von Ausgabearrays sind in der Windows-Runtime schreibbar. Entfernen Sie das Attribut aus '{1}'.
WME1103 Die Methode „{0}“ weist den Parameter „{1}“ auf. Hierbei handelt es sich um ein Array, das entweder ein System.Runtime.InteropServices.InAttribute oder ein System.Runtime.InteropServices.OutAttribute enthält. Arrayparameter müssen für Windows-Runtime entweder {2} oder {3} enthalten. Entfernen Sie diese Attribute, oder ersetzen Sie sie bei Bedarf durch das entsprechende Windows-Runtime-Attribut.
WME1104 Methode "{0}" hat den Parameter "{1}", der kein Array ist und entweder ein {2} oder ein {3}aufweist. Das Markieren von Nicht-Arrayparametern mit {2} oder {3} wird von Windows-Runtime nicht unterstützt.
WME1105 Methode '{0}' hat den Parameter '{1}' mit einem System.Runtime.InteropServices.InAttribute oder System.Runtime.InteropServices.OutAttribute. Das Markieren von Parametern mit System.Runtime.InteropServices.InAttribute oder System.Runtime.InteropServices.OutAttribute wird von Windows-Runtime nicht unterstützt. Entfernen Sie eventuell System.Runtime.InteropServices.InAttribute, und ersetzen Sie System.Runtime.InteropServices.OutAttribute stattdessen durch den 'out'-Modifizierer. Methode '{0}' hat den Parameter '{1}' mit einem System.Runtime.InteropServices.InAttribute oder System.Runtime.InteropServices.OutAttribute. Windows-Runtime unterstützt nur das Markieren von ByRef-Parametern mit System.Runtime.InteropServices.OutAttribute. Eine andere Verwendung dieser Attribute ist nicht möglich.
WME1106 Die Methode „{0}“ weist den Parameter „{1}“ auf, bei dem es sich um ein Array handelt. Die Inhalte von Array-Parametern müssen in der Windows-Runtime entweder lesbar oder schreibbar sein. Wenden Sie entweder {2} oder {3} auf '{1}' an.

Member mit einem Parameter mit dem Namen „Value"

In der UWP werden Rückgabewerte als Ausgabeparameter betrachtet, und die Namen der Parameter müssen eindeutig sein. Standardmäßig gibt Winmdexp.exe dem Rückgabewert den Namen „Value". Wenn die Methode einen Parameter mit dem Namen „Value" hat, erhalten Sie die Fehlermeldung WME1092. Es gibt zwei Korrekturmöglichkeiten:

  • Nennen Sie den Parameter nicht „Value" (in den Eigenschaftenaccessoren sollte der Parametername nicht „returnValue" lauten).

  • Verwenden Sie das ReturnValueNameAttribute-Attribut, um den Namen des Rückgabewerts zu ändern, wie hier gezeigt:

    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
    

Hinweis Wenn Sie den Namen des Rückgabewerts ändern und der neue Name mit dem Namen eines anderen Parameters kollidiert, erhalten Sie den Fehler WME1091.

JavaScript-Code kann auf die Ausgabeparameter einer Methode, einschließlich des Rückgabewerts, über den Namen zugreifen. Ein Beispiel finden Sie unter ReturnValueNameAttribute.

Fehlernummer Meldungstext
WME1091 Die Methode "{0}" hat den Rückgabewert "{1}", der mit einem Parameternamen identisch ist. Methodenparameter und Rückgabewerte müssen für Windows-Runtime eindeutige Namen aufweisen.
WME1092 Die Methode "{0}" verfügt über einen Parameter namens "{1}", der mit dem Namen des Standardrückgabewerts identisch ist. Verwenden Sie ggf. einen anderen Namen für den Parameter, oder verwenden Sie das System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute, um den Namen des Rückgabewerts explizit anzugeben.

Hinweis Der Standardname ist "returnValue" für Eigenschaftsaccessoren und "value" für alle anderen Methoden.