Partager via


Diagnostiquer les erreurs du composant C#/WinRT

Cet article fournit des informations supplémentaires sur les restrictions applicables aux composants Windows Runtime écrits en C#/WinRT. Il développe les informations fournies dans les messages d’erreur à partir de C#/WinRT lorsqu’un auteur génère son composant. Pour les composants managés .NET Native UWP existants, les métadonnées des composants C#/WinRT sont générées par Winmdexp.exe, un outil .NET. La prise en charge de Windows Runtime étant maintenant découplée de .NET, C#/WinRT fournit les outils permettant de générer un fichier .winmd à partir de votre composant. Windows Runtime a davantage de contraintes sur le code qu’une bibliothèque de classes C#, et l’outil Diagnostic Scanner fourni dans C#/WinRT vous alerte sur ces contraintes avant de générer un fichier .winmd.

Cet article traite des erreurs signalées dans votre build par C#/WinRT. Cet article est une mise à jour des informations relatives aux restrictions applicables aux composants managés .NET Native UWP existants qui utilisent l’outil Winmdexp.exe.

Faites une recherche sur le texte du message d’erreur (en omettant les valeurs spécifiques des espaces réservés) ou sur le numéro du message. Si vous ne trouvez pas les informations dont vous avez besoin ici, aidez-nous à améliorer la documentation en utilisant le bouton de commentaire à la fin de cet article. Dans vos commentaires, n’oubliez pas d’inclure le message d’erreur. Vous pouvez aussi entrer un bogue dans le dépôt C#/WinRT.

Cet article organise les messages d’erreur par scénario.

Implémentation d’interfaces qui ne sont pas des interfaces Windows Runtime valides

Les composants C#/WinRT ne peuvent pas implémenter certaines interfaces Windows Runtime, comme celles qui représentent des opérations ou actions asynchrones (IAsyncAction, IAsyncActionWithProgress<TProgress>, IAsyncOperation<TResult> ou IAsyncOperationWithProgress<TResult,TProgress>). À la place, utilisez la classe AsyncInfo pour générer des opérations asynchrones dans les composants Windows Runtime. Remarque : ce ne sont pas les seules interfaces non valides ; par exemple, une classe ne peut pas implémenter System.Exception.

Numéro d'erreur

Texte du message

CsWinRT1008

Le type de composant Windows Runtime {0} ne peut pas implémenter l’interface {1}, car l’interface n’est pas une interface Windows Runtime valide

Dans Windows Runtime, les méthodes surchargées peuvent avoir le même nombre de paramètres uniquement si une surcharge est spécifiée en tant que surcharge par défaut. Utilisez l’attribut Windows.Foundation.Metadata.DefaultOverload (CsWinRT1015, 1016).

Lorsque des tableaux sont utilisés comme entrées ou sorties dans des fonctions ou des propriétés, ils doivent être en lecture seule ou en écriture seule (CsWinRT 1025). Les attributs System.Runtime.InteropServices.WindowsRuntime.ReadOnlyArray et System.Runtime.InteropServices.WindowsRuntime.WriteOnlyArray vous sont fournis. Les attributs fournis sont à utiliser uniquement sur des paramètres de type tableau (CsWinRT1026), et un seul attribut doit être appliqué par paramètre (CsWinRT1023).

Vous n’avez pas besoin d’appliquer un attribut à un paramètre tableau marqué comme out car il est supposé être en écriture seule. Vous recevez un message d’erreur si vous décorez le paramètre en lecture seule dans ce cas (CsWinRT1024).

Les attributs System.Runtime.InteropServices.InAttribute et System.Runtime.InteropServices.OutAttribute ne doivent pas être utilisés sur des paramètres de tout type (CsWinRT1021, 1022).

Numéro d'erreur

Texte du message

CsWinRT1015

Dans la classe {2} : plusieurs surcharges de paramètre {0} de « {1} » sont décorées de Windows.Foundation.Metadata.DefaultOverloadAttribute. L’attribut ne peut être appliqué qu’à une seule surcharge de la méthode.

CsWinRT1016

Dans la classe {2} : les surcharges de paramètre {0} de {1} doivent avoir une seule méthode spécifiée en tant que surcharge par défaut en la décorant avec l’attribut Windows.Foundation.Metadata.DefaultOverloadAttribute.

CsWinRT1021

La méthode « {0} » possède le paramètre « {1} » qui est un tableau possédant un attribut System.Runtime.InteropServices.InAttribute ou System.Runtime.InteropServices.OutAttribute. Dans le Windows Runtime, les paramètres de tableau doivent avoir soit ReadOnlyArray, soit WriteOnlyArray. Supprimez ces attributs ou remplacez-les par l’attribut Windows Runtime approprié si nécessaire.

CsWinRT1022

La méthode « {0} » comporte le paramètre « {1} » possédant un attribut System.Runtime.InteropServices.InAttribute ou System.Runtime.InteropServices.OutAttribute. Le Windows Runtime ne prend pas en charge le marquage des paramètres par System.Runtime.InteropServices.InAttribute ou System.Runtime.InteropServices.OutAttribute. Supprimez System.Runtime.InteropServices.InAttribute, puis remplacez System.Runtime.InteropServices.OutAttribute par le modificateur « out ».

CsWinRT1023

La méthode « {0} » a un paramètre « {1} » qui est un tableau, et qui a à la fois ReadOnlyArray et WriteOnlyArray. Dans Windows Runtime, le contenu des paramètres de tableau doit être accessible en lecture ou en écriture. Supprimez l’un des attributs de « {1} ».

CsWinRT1024

La méthode « {0} » a un paramètre de sortie « {1} » qui est un tableau, mais qui a l’attribut ReadOnlyArray. Dans Windows Runtime, le contenu des tableaux de sortie est accessible en écriture. Supprimez l’attribut de « {1} ».

CsWinRT1025

La méthode «{0} » a un paramètre « {1} » qui est un tableau. Dans Windows Runtime, le contenu des paramètres de tableau doit être accessible en lecture ou en écriture. Appliquez ReadOnlyArray ou WriteOnlyArray à « {1} ».

CsWinRT1026

La méthode «{0} » a le paramètre « {1} » qui n’est pas un tableau et qui a un attribut ReadOnlyArray ou un attribut WriteOnlyArray. Windows Runtime ne prend pas en charge le marquage des paramètres autres que des tableaux avec ReadOnlyArray ou WriteOnlyArray.

Erreurs d’espace de noms et noms non valides pour le fichier de sortie

Dans le Windows Runtime, tous les types publics dans un fichier de métadonnées Windows (.winmd) doivent se trouver dans un espace de noms qui partage le nom du fichier .winmd, ou dans des sous-espaces de noms du nom de fichier. Par exemple, si votre projet Visual Studio est nommé A.B (autrement dit, votre composant Windows Runtime est A.B.winmd), il peut contenir des classes publiques A.B.Class1 et A.B.C.Class2, mais pas A.Class3 ou D.Class4.

Note

Ces restrictions s’appliquent uniquement aux types publics, pas aux types privés utilisés dans votre implémentation.

Dans le cas de A.Class3, vous pouvez déplacer Class3 dans un autre espace de noms ou remplacer le nom du composant Windows Runtime par A.winmd. Dans l’exemple précédent, le code qui appelle A.B.winmd ne peut pas localiser A.Class3.

Dans le cas de D.Class4, aucun nom de fichier ne peut contenir à la fois D.Class4 et des classes dans l’espace de noms A.B ; la modification du nom du composant Windows Runtime n’est donc pas possible. Vous pouvez déplacer D.Class4 vers un autre espace de noms ou le placer dans un autre composant Windows Runtime.

Le système de fichiers ne peut pas effectuer la distinction entre majuscules et minuscules ; par conséquent, les espaces de noms dont la casse diffère ne sont pas autorisés (CsWinRT1002).

Numéro d'erreur

Texte du message

CsWinRT1001

Un type public possède un espace de noms (« {1} ») qui ne partage aucun préfixe commun avec d’autres espaces de noms (« {0} »). Tous les types d’un fichier de métadonnées Windows doivent exister dans un sous-espace de noms de l’espace de noms impliqué par le nom de fichier.

CsWinRT1002

Plusieurs espaces de noms trouvés avec le nom « {0} » ; les noms d’espaces de noms ne peuvent pas différer uniquement par la casse dans le Windows Runtime.

Exportation de types qui ne sont pas des types Windows Runtime valides

L’interface publique de votre composant doit exposer uniquement les types Windows Runtime. Toutefois, .NET fournit des mappages pour un certain nombre de types couramment utilisés qui sont légèrement différents dans .NET et Windows Runtime. Cela permet au développeur .NET de travailler avec des types familiers au lieu d’en apprendre de nouveaux. Vous pouvez utiliser ces types .NET Framework mappés dans l’interface publique de votre composant. Pour plus d’informations, consultez Déclaration des types dans les composants Windows Runtime, Passage de types Windows Runtime au code managé et Mappages .NET des types Windows Runtime.

Plusieurs de ces mappages sont des interfaces. Par exemple, IList<T> mappe vers l’interface Windows Runtime IVector<T>. Si vous utilisez List<string> au lieu de IList<string> comme type de paramètre, C#/WinRT fournit une liste de possibilités qui comprend toutes les interfaces mappées implémentées par List<T>. Si vous utilisez des types génériques imbriqués, comme List<Dictionary<int, string>>, C#/WinRT offre des choix pour chaque niveau d'imbrication. Ces listes peuvent considérablement s’allonger.

En général, le meilleur choix est l’interface qui est la plus proche du type. Par exemple, pour Dictionary<int, string>, le meilleur choix est probablement IDictionary<int, string>.

Numéro d'erreur

Texte du message

CsWinRT1006

Le membre « {0} » a le type « {1} » dans sa signature. Le type « {1} » n’est pas un type Windows Runtime valide. Pourtant, le type (ou ses paramètres génériques) implémente des interfaces qui sont des types Windows Runtime valides. Essayez de changer le type « {1} » dans la signature de membre par l’un des types suivants de System.Collections.Generic : {2}.

Dans Windows Runtime, les tableaux dans les signatures de membre doivent être unidimensionnels avec une limite inférieure de 0 (zéro). Les types de tableaux imbriqués comme myArray[][] (CsWinRT1017) et myArray[,] (CsWinRT1018) ne sont pas autorisés.

Note

Cette restriction ne s’applique pas aux tableaux utilisés en interne dans votre implémentation.

Numéro d'erreur

Texte du message

CsWinRT1017

La méthode {0} a un tableau imbriqué de type {1} dans sa signature. Les tableaux dans une signature de méthode Windows Runtime ne peuvent pas être imbriqués.

CsWinRT1018

La méthode « {0} » a un tableau multidimensionnel de type « {1} » dans sa signature. Les tableaux dans les signatures de méthode Windows Runtime doivent être unidimensionnels.

Structures contenant des champs de types rejetés

Dans Windows Runtime, une structure peut contenir uniquement des champs, et seules les structures peuvent contenir des champs. Ces champs doivent être publics. Les types de champ valides incluent des énumérations, des structures et des types primitifs.

Numéro d'erreur

Texte du message

CsWinRT1007

La structure {0} ne contient pas de champs publics. Les structures Windows Runtime doivent contenir au moins un champ public.

CsWinRT1011

La structure {0} a un champ non public. Tous les champs doivent être publics dans les structures Windows Runtime.

CsWinRT1012

La structure {0} a un champ const. Les constantes ne peuvent apparaître que dans les énumérations Windows Runtime.

CsWinRT1013

La structure {0} possède un champ de type {1} ; {1} n’est pas un type de champ Windows Runtime valide. Les champs de la structure Windows Runtime doivent uniquement avoir la valeur UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Boolean, String, Enum, ou bien correspondre à une structure.

Le nom de paramètre est en conflit avec le code généré

Dans le Windows Runtime, les valeurs de retour sont considérées comme des paramètres de sortie, et les noms de ces paramètres doivent être uniques. Par défaut, C#/WinRT donne le nom __retval à la valeur de retour. Si votre méthode possède un paramètre nommé __retval, vous obtiendrez l’erreur CsWinRT1010. Pour corriger cela, donnez à votre paramètre un nom autre que __retvalue.

Numéro d'erreur

Texte du message

CsWinRT1010

Le nom de paramètre {1} dans la méthode {0} est le même que le nom de paramètre de la valeur de retour qui est utilisé dans l’interopérabilité C#/WinRT généré ; utilisez un autre nom de paramètre.

Divers

Les autres restrictions dans un composant créé avec C#/WinRT sont les suivantes :

  • Vous ne pouvez pas exposer les opérateurs surchargés sur les types publics.
  • Les classes et les interfaces ne peuvent pas être génériques.
  • Les classes doivent être sealed.
  • Les paramètres ne peuvent pas être passés par référence, par exemple avec le mot clé ref.
  • Les propriétés doivent avoir une méthode get publique.
  • Il doit y avoir au moins un type public (classe ou interface) dans l’espace de noms de votre composant.

Numéro d'erreur

Texte du message

CsWinRT1014

« {0} » est une surcharge de l’opérateur. Les types managés ne peuvent pas exposer de surcharges d’opérateur dans Windows Runtime.

CsWinRT1004

Le type {0} est générique. Les types Windows Runtime ne peuvent pas être génériques.

CsWinRT1005

L’exportation de types unsealed n’est pas prise en charge dans CsWinRT. Marquez le type {0} comme sealed.

CsWinRT1020

La méthode « {0} » a le paramètre « {1} » marqué « ref ». Les paramètres de référence ne sont pas autorisés dans Windows Runtime.

CsWinRT1000

La propriété « {0} » n’a pas de méthode getter publique. Windows Runtime ne prend pas en charge les propriétés setter uniquement.

CsWinRT1003

Les composants Windows Runtime doivent avoir au moins un type public.

Dans le Windows Runtime, une classe ne peut avoir qu’un seul constructeur avec un nombre donné de paramètres. Par exemple, vous ne pouvez pas avoir un constructeur ayant un seul paramètre de type string et un autre constructeur possédant un seul paramètre de type int. La seule solution consiste à utiliser un nombre différent de paramètres pour chaque constructeur.

Numéro d'erreur

Texte du message

CsWinRT1009

Les classes ne peuvent pas avoir plusieurs constructeurs de la même arité dans le Windows Runtime ; la classe {0} a plusieurs constructeurs d’arité {1}.