Sdílet prostřednictvím


Diagnostika chybových podmínek komponent prostředí Windows Runtime

Tento článek obsahuje další informace o omezeních komponent prostředí Windows Runtime napsaných pomocí spravovaného kódu. Rozšiřuje informace, které jsou poskytovány v chybových zprávách z nástrojeWinmdexp.exe (Windows Runtime Metadata Export Tool) a doplňuje informace o omezeních poskytovaných v komponentách prostředí Windows Runtime jazykem C# a Visual Basic.

Tento článek se nezabývá všemi chybami. Zde uvedené chyby jsou seskupené podle obecné kategorie a každá kategorie obsahuje tabulku přidružených chybových zpráv. Vyhledejte text zprávy (vynechání konkrétních hodnot pro zástupné symboly) nebo číslo zprávy. Pokud tady nenajdete potřebné informace, pomozte nám prosím vylepšit dokumentaci pomocí tlačítka pro zpětnou vazbu na konci tohoto článku. Uveďte chybovou zprávu. Případně můžete na webu Microsoft Connect podat chybu.

Chybová zpráva pro implementaci asynchronního rozhraní poskytuje nesprávný typ

Spravované komponenty prostředí Windows Runtime nemůžou implementovat rozhraní univerzální platformy Windows (UPW), která představují asynchronní akce nebo operace (IAsyncAction, IAsyncActionWithProgress TProgress<>, IAsyncOperation<TResult> nebo IAsyncOperationWithProgress<TResult, TProgress>). Místo toho .NET poskytuje třídu AsyncInfo pro generování asynchronních operací v komponentách prostředí Windows Runtime. Chybová zpráva, která Winmdexp.exe zobrazí při pokusu o implementaci asynchronního rozhraní nesprávně odkazuje na tuto třídu podle jejího bývalého názvu AsyncInfoFactory. .NET již neobsahuje třídu AsyncInfoFactory.

Číslo chyby Text zprávy
WME1084 Typ '{0}' implementuje asynchronní rozhraní prostředí Windows Runtime .{1} Typy prostředí Windows Runtime nemůžou implementovat asynchronní rozhraní. Pomocí třídy System.Runtime.InteropServices.WindowsRuntime.AsyncInfoFactory vygenerujte asynchronní operace pro export do prostředí Windows Runtime.

Poznámka Chybové zprávy, které odkazují na prostředí Windows Runtime, používají starou terminologii. To se teď označuje jako univerzální platforma Windows (UPW). Například typy prostředí Windows Runtime se teď nazývají typy UPW.

Chybějící odkazy na mscorlib.dll nebo System.Runtime.dll

K tomuto problému dochází pouze v případě, že používáte Winmdexp.exe z příkazového řádku. Doporučujeme použít možnost /reference k zahrnutí odkazů na mscorlib.dll i System.Runtime.dll ze základních referenčních sestavení rozhraní .NET Framework, která jsou umístěna v%ProgramFiles(x86)%\Referenční sestavení\Microsoft\Framework\. NETCore\v4.5" ("%ProgramFiles%\..." v 32bitovém počítači).

Číslo chyby Text zprávy
WME1009 Nebyla zmínka o mscorlib.dll. K správnému exportu se vyžaduje odkaz na tento soubor metadat.
WME1090 Nelze určit základní referenční sestavení. Ujistěte se, že mscorlib.dll a System.Runtime.dll jsou odkazovány pomocí přepínače /reference.

Přetížení operátoru není povoleno.

V komponentě prostředí Windows Runtime napsané ve spravovaném kódu nelze vystavit přetížené operátory na veřejných typech.

Poznámka V chybové zprávě je operátor identifikován názvem metadat, například op_Addition, op_Multiply, op_ExclusiveOr, op_Implicit (implicitní převod) atd.

Číslo chyby Text zprávy
WME1087 '{0}' je přetížení operátoru. Spravované typy nemůžou vystavit přetížení operátorů v prostředí Windows Runtime.

Konstruktory ve třídě mají stejný počet parametrů.

V UPW může mít třída pouze jeden konstruktor s daným počtem parametrů; Například nemůžete mít jeden konstruktor, který má jeden parametr typu String a druhý, který má jeden parametr typu int (Integer v jazyce Visual Basic). Jediným alternativním řešením je použít pro každý konstruktor jiný počet parametrů.

Číslo chyby Text zprávy
WME1099 Typ '{0}' má více konstruktorů s argumenty '{1}'. Typy prostředí Windows Runtime nemohou mít více konstruktorů se stejným počtem argumentů.

Musí zadat výchozí hodnotu pro přetížení, která mají stejný počet parametrů.

V UPW mohou přetížené metody mít stejný počet parametrů pouze v případě, že je jako výchozí přetížení zadáno jedno přetížení. Viz "Přetížené metody" v součásti prostředí Windows Runtime s C# a Visual Basic.

Číslo chyby Text zprávy
WME1059 Více {0}přetížení parametru '{1}.{2}' jsou zdobeny Windows.Foundation.Metadata.DefaultOverloadAttribute.
WME1085 Přetížení parametrů {0}{1}.{2} musí mít přesně jednu metodu určenou jako výchozí přetížení tím, že je označíte pomocí Windows.Foundation.Metadata.DefaultOverloadAttribute.

Chyby jmenného prostoru a neplatné názvy výstupního souboru

V univerzální platformě Windows musí být všechny veřejné typy v souboru metadat Systému Windows (.winmd) v oboru názvů, který sdílí název souboru .winmd nebo v dílčích oborech názvů názvu souboru. Pokud má například projekt sady Visual Studio název A.B (tj. komponenta prostředí Windows Runtime je A.B.winmd), může obsahovat veřejné třídy A.B.Class1 a A.B.C.Class2, ale ne A.Class3 (WME0006) nebo D.Class4 (WME1044).

Poznámka Tato omezení se vztahují pouze na veřejné typy, ne na soukromé typy používané ve vaší implementaci.

V případě A.Class3 můžete buď přesunout třídu Class3 do jiného oboru názvů, nebo změnit název komponenty Windows Runtime na A.winmd. I když WME0006 je upozornění, měli byste s ním zacházet jako s chybou. V předchozím příkladu kód, který volá A.B.winmd, nebude moct najít A.Class3.

V případě D.Class4 nemůže žádný název souboru obsahovat jak D.Class4, tak třídy v oboru názvů A.B, takže změna názvu komponenty Windows Runtime není možná. Můžete buď přesunout D.Class4 do jiného oboru názvů, nebo ho umístit do jiné součásti prostředí Windows Runtime.

Systém souborů nemůže rozlišovat mezi velkými a malými písmeny, takže obory názvů, které se liší podle velikosti písmen, nejsou povoleny (WME1067).

Součást musí obsahovat alespoň jeden veřejný zapečetěný typ (Public NotInheritable v jazyce Visual Basic). Pokud ne, získáte WME1042 nebo WME1043 v závislosti na tom, jestli vaše komponenta obsahuje privátní typy.

Typ komponenty prostředí Windows Runtime nemůže mít název, který je stejný jako obor názvů (WME1068).

Opatrnost Pokud voláte Winmdexp.exe přímo a nepoužíváte možnost /out k zadání názvu součásti prostředí Windows Runtime, Winmdexp.exe se pokusí vygenerovat název, který zahrnuje všechny obory názvů v komponentě. Přejmenování jmenných prostorů může změnit jméno vaší komponenty.

 

Číslo chyby Text zprávy
WME0006 '{0}' není platný název souboru winmd pro toto sestavení. Všechny typy v souboru metadat systému Windows musí existovat v dílčím oboru názvů, který je implikovaný názvem souboru. Typy, které v takovém dílčím oboru názvů neexistují, nelze za běhu najít. V tomto sestavení je nejmenší společný obor názvů, který by mohl sloužit jako název souboru, '{1}'.
WME1042 Vstupní modul musí obsahovat alespoň jeden veřejný typ, který se nachází uvnitř oboru názvů.
WME1043 Vstupní modul musí obsahovat alespoň jeden veřejný typ, který se nachází uvnitř oboru názvů. Jediné typy nalezené uvnitř jmenných prostorů jsou soukromé.
WME1044 Veřejný typ má obor názvů ('{1}'), který nesdílí žádnou společnou předponu s jinými obory názvů ('{0}'). Všechny typy v souboru metadat systému Windows musí existovat v dílčím oboru názvů, který je implikovaný názvem souboru.
WME1067 Název oboru názvů se nemohou lišit pouze ve velikosti písmen:{0},{1}.
WME1068 Typ '{0}' nemůže mít stejný název jako obor názvů '{1} .

Exportování typů, které nejsou platnými typy na univerzální platformě Windows

Veřejné rozhraní vaší komponenty musí vystavit pouze typy UPW. .NET ale poskytuje mapování pro řadu běžně používaných typů, které se v .NET a UPW mírně liší. Vývojáři .NET tak mohou místo učení nových typů pracovat se známými typy. Tyto mapované typy .NET můžete použít ve veřejném rozhraní komponenty. Viz "Deklarování typů v součástech prostředí Windows Runtime" a "Předávání typů univerzální platformy Windows spravovanému kódu" v součásti prostředí Windows Runtime pomocí C# a Visual Basica mapování .NET typů prostředí Windows Runtime.

Mnoho těchto mapování je rozhraní. Například IList<T> mapuje na rozhraní UWP IVector<T>. Pokud jako typ parametru použijete List<string> (List(Of String) v jazyce Visual Basic) místo IList<string>, Winmdexp.exe poskytuje seznam alternativ zahrnujících všechna mapovaná rozhraní implementovaná Listem<T>. Pokud používáte vnořené obecné typy, jako je List<Dictionary<int, string>> (List(Of Dictionary(Of Integer, String)) v jazyce Visual Basic), Winmdexp.exe nabízí možnosti pro každou úroveň vnoření. Tyto seznamy mohou být poměrně dlouhé.

Obecně platí, že nejlepší volbou je rozhraní, které je nejblíže typu. Například pro slovník<int, řetězec>, nejlepší volbou bude pravděpodobně IDictionary<int, řetězec>.

Důležitý JavaScript používá rozhraní, které se zobrazí jako první v seznamu rozhraní, která implementuje spravovaný typ. Pokud například vrátíte do kódu JavaScriptu Dictionary<int, string>, bude se zobrazovat jako IDictionary<int, string>, a to bez ohledu na to, které rozhraní zadáte jako návratový typ. To znamená, že pokud první rozhraní neobsahuje člena, který se zobrazí v pozdějších rozhraních, tento člen není viditelný pro JavaScript.

Upozornění Vyhněte se použití negenerického rozhraní IList a rozhraní IEnumerable, pokud bude vaše komponenta používána JavaScriptem. Tato rozhraní mapují na IBindableVector a IBindableIterator, v uvedeném pořadí. Podporují vazbu pro ovládací prvky XAML a jsou neviditelné pro JavaScript. JavaScript vydá chybu za běhu "Funkce X má neplatný podpis a nelze ji volat".

 

Číslo chyby Text zprávy
WME1033 Metoda '{0}' má parametr '{1}' typu '{2}'. '{2}' není platný typ parametru Windows Runtime.
WME1038 Metoda '{0}' má parametr typu '{1}' v podpisu. I když tento typ není platným typem prostředí Windows Runtime, implementuje rozhraní, která jsou platnými typy prostředí Windows Runtime. Zvažte změnu podpisu metody tak, aby místo toho používal jeden z následujících typů: '{2}'.
WME1039

Metoda '{0}' má parametr typu '{1}' v podpisu. I když tento obecný typ není platným typem prostředí Windows Runtime, typ nebo jeho obecné parametry implementují rozhraní, která jsou platnými typy prostředí Windows Runtime. {2}

> **Poznámka** Pro {2}, Winmdexp.exe připojí seznam alternativ, například "Zvažte změnu typu System.Collections.Generic.List<T>" v podpisu metody na jeden z následujících typů: 'System.Collections.Generic.IList<T>, System.Collections.Generic.IReadOnlyList<T>, System.Collections.Generic.IEnumerable<T>'."
WME1040 Metoda '{0}' má parametr typu '{1}' v podpisu. Místo použití spravovaného typu úlohy použijte Windows.Foundation.IAsyncAction, Windows.Foundation.IAsyncOperation nebo jedno z jiných asynchronních rozhraní prostředí Windows Runtime. Standardní vzor await .NET platí také pro tato rozhraní. Další informace o převodu spravovaných objektů úloh na asynchronní rozhraní prostředí Windows Runtime najdete v tématu System.Runtime.InteropServices.WindowsRuntime.AsyncInfo.

 

Struktury obsahující pole nepovolených typů

V UPW může struktura obsahovat pouze pole a pouze struktury můžou obsahovat pole. Tato pole musí být veřejná. Platné typy polí zahrnují výčty, struktury a primitivní typy.

Číslo chyby Text zprávy
WME1060 Struktura '{0}' má pole '{1}' typu '{2}'. '{2}' není platný datový typ Windows Runtime. Každé pole ve struktuře Windows Runtime může být pouze UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum nebo samotná struktura.

 

Omezení polí v podpisech členů

V UPW musí být pole v podpisech členů jednorozměrná s dolní mezí 0 (nula). Vnořené typy polí, například myArray[][] (myArray()() v jazyce Visual Basic), nejsou povoleny.

Poznámka Toto omezení se nevztahuje na pole, která používáte interně ve své implementaci.

 

Číslo chyby Text zprávy
WME1034 Metoda '{0}' má ve svém podpisu pole typu '{1}' s nenulovou dolní hranicí. Pole v podpisech metod prostředí Windows Runtime musí mít dolní mez nuly.
WME1035 Metoda '{0}' má multidimenzionální pole typu '{1}' v podpisu. Pole v podpisech metod prostředí Windows Runtime musí být jednorozměrná.
WME1036 Metoda{0}má ve své signatuře vnořené pole typu{1}. Pole v podpisech metody prostředí Windows Runtime nelze vnořit.

 

Parametry pole musí určovat, jestli je obsah pole čitelný nebo zapisovatelný.

V UPW musí být parametry jen pro čtení nebo jen pro zápis. Parametry nelze označit jako ref (ByRef bez atributu OutAttribute ve Visual Basicu). To platí pro obsah polí, takže parametry pole musí indikovat, zda je obsah pole jen pro čtení nebo jen pro zápis. Směr je jasný pro ven parametry (ByRef parametr s atributem OutAttribute v jazyce Visual Basic), ale parametry pole, které jsou předány hodnotou (ByVal v jazyce Visual Basic) musí být označeny. Viz Předávání polí komponentě prostředí Windows Runtime.

Číslo chyby Text zprávy
WME1101 Metoda '{0}' má parametr '{1}' což je pole, které má obojí {2} a {3}. V prostředí Windows Runtime musí být parametry pole obsahu čitelné nebo zapisovatelné. Odeberte některý z atributů z '{1}'.
WME1102 Metoda '{0}' má výstupní parametr '{1}' což je pole, ale který má {2}. V prostředí Windows Runtime je obsah výstupních polí zapisovatelný. Odeberte atribut z „{1}“.
WME1103 Metoda '' má parametr '{0}{1}' což je pole a který má buď System.Runtime.InteropServices.InAttribute, nebo System.Runtime.InteropServices.OutAttribute. V prostředí Windows Runtime musí parametry pole obsahovat buď {2} nebo {3}. Odeberte tyto atributy nebo je v případě potřeby nahraďte příslušným atributem prostředí Windows Runtime.
WME1104 Metoda '{0}' má parametr '{1}', který není polem, a který má buď nebo {2} a {3}. Prostředí Windows Runtime nepodporuje označení parametrů, které nejsou polem, pomocí {2} nebo {3}.
WME1105 Metoda '{0}' má parametr '{1}' s System.Runtime.InteropServices.InAttribute nebo System.Runtime.InteropServices.OutAttribute. Modul Windows Runtime nepodporuje označování parametrů pomocí System.Runtime.InteropServices.InAttribute nebo System.Runtime.InteropServices.OutAttribute. Zvažte odebrání System.Runtime.InteropServices.InAttribute a místo toho nahraďte System.Runtime.InteropServices.OutAttribute modifikátorem out. Metoda '{0}' má parametr '{1}' s System.Runtime.InteropServices.InAttribute nebo System.Runtime.InteropServices.OutAttribute. Windows Runtime podporuje pouze označení parametrů ByRef pomocí System.Runtime.InteropServices.OutAttribute a nepodporuje jiné použití těchto atributů.
WME1106 Metoda '{0}' má parametr '{1}' což je pole. V prostředí Windows Runtime musí být obsah parametrů pole čitelný nebo zapisovatelný. Na{2}použijte {3} nebo {1}.

Člen s parametrem s názvem "value"

V UPW se návratové hodnoty považují za výstupní parametry a názvy parametrů musí být jedinečné. Ve výchozím nastavení dává Winmdexp.exe návratové hodnotě název "value". Pokud má vaše metoda parametr s názvem "value", zobrazí se chyba WME1092. Můžete to opravit dvěma způsoby:

  • Dejte parametru jiný název než "value" (v přístupových objektech vlastností, jiný název než "returnValue").

  • Pomocí atributu ReturnValueNameAttribute změňte název návratové hodnoty, jak je znázorněno zde:

    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
    

Poznámka Pokud změníte název návratové hodnoty a nový název koliduje s názvem jiného parametru, zobrazí se chyba WME1091.

Kód JavaScriptu má přístup k výstupním parametrům metody podle názvu, včetně návratové hodnoty. Příklad, viz ReturnValueNameAttribute atribut.

Číslo chyby Text zprávy
WME1091 Metoda '{0}' má návratovou hodnotu s názvem '{1}', která je stejná jako název parametru. Parametry metody prostředí Windows Runtime a návratová hodnota musí mít jedinečné názvy.
WME1092 Metoda '{0}' má parametr s názvem '{1}', který je stejný jako výchozí název návratové hodnoty. Zvažte použití jiného názvu parametru nebo použití System.Runtime.InteropServices.WindowsRuntime.ReturnValueNameAttribute k explicitní zadání názvu návratové hodnoty.

Poznámka Výchozí název je "returnValue" pro přístupové metody vlastností a "value" pro všechny ostatní metody.