Partager via


Transmission de tableaux à un composant Windows Runtime

Dans le Windows Runtime, les paramètres sont pour l'entrée ou la sortie mais jamais pour les deux. Cela signifie que le contenu d'un tableau qui est passé à une méthode ainsi qu'au tableau lui-même, est destiné à l'entrée ou à la sortie. Si le contenu du tableau est destiné à l'entrée, la méthode lit dans le tableau mais n'écrit pas dans celui-ci. Si le contenu du tableau est destiné à la sortie, la méthode écrit dans le tableau mais ne lit pas dans celui-ci. Cela pose un problème pour les paramètres de tableau, car les tableaux du .NET Framework sont des types référence et le contenu d'un tableau est mutable même si la référence de tableau est passée par valeur (ByVal en Visual Basic). Le Windows Runtime Metadata Export Tool (Winmdexp.exe) requiert de spécifier l'utilisation prévue du tableau, si elle n'est pas visible d'après le contexte, en appliquant l'attribut ReadOnlyArrayAttribute ou WriteOnlyArrayAttribute au paramètre. L'utilisation de tableau est déterminée comme suit :

  • Pour la valeur de retour ou pour un paramètre out (un paramètre ByRef avec l'attribut OutAttribute en Visual Basic), le tableau est toujours destiné à la sortie. N'appliquez pas l'attribut ReadOnlyArrayAttribute. L'attribut WriteOnlyArrayAttribute est autorisé sur les paramètres de sortie mais il est redondant.

    Avertissement

    Le compilateur Visual Basic n'applique pas les règles de sortie uniquement.Vous ne devez jamais lire un paramètre de sortie. Il peut contenir Nothing.Assignez toujours un nouveau tableau.

  • Les paramètres qui ont le modificateur ref (ByRef en Visual Basic) ne sont pas autorisés. Winmdexp.exe (outil d'exportation de métadonnées Windows Runtime) génère une erreur.

  • Pour un paramètre passé par valeur, vous devez spécifier si le contenu du tableau est destiné à l'entrée ou la sortie en appliquant l'attribut ReadOnlyArrayAttribute ou WriteOnlyArrayAttribute. La spécification des deux attributs génère une erreur.

Si une méthode doit accepter un tableau pour l'entrée, modifier le contenu du tableau et retourner le tableau à l'appelant, utilisez un paramètre en lecture seule pour l'entrée et un paramètre en écriture seule (ou la valeur de retour) pour la sortie. Le code suivant montre un moyen d'implémenter ce modèle :

        public int[] ChangeArray([ReadOnlyArray()] int[] input)
        {
            int[] output = input.Clone();
            // Manipulate the copy.
            //   ...
            return output;
        }
    Public Function ChangeArray(<ReadOnlyArray> input() As Integer) As Integer()
        Dim output() As Integer = input.Clone()
        ' Manipulate the copy.
        '   ...
        Return output
    End Function    

Nous vous conseillons d'effectuer une copie du tableau d'entrée immédiatement et de la manipuler. Cela contribue à garantir que la méthode se comporte de la même façon que votre composant soit appelé ou non par du code .NET Framework.

Utilisation des composants depuis du code managé et non managé

Les paramètres qui ont l'attribut ReadOnlyArrayAttribute ou WriteOnlyArrayAttribute se comportent différemment selon que l'appelant est écrit en code natif ou en code managé. Si l'appelant est du code natif (JavaScript ou Extensions de composant Visual C++), le contenu du tableau est traité comme suit :

  • ReadOnlyArrayAttribute : le tableau est copié lorsque l'appel traverse la limite ABI (Application Binary Interface). Les éléments sont convertis si nécessaire. Par conséquent, toute modification accidentelle que la méthode effectue dans un tableau d'entrée uniquement n'est pas visible par l'appelant.

  • WriteOnlyArrayAttribute : la méthode appelée ne peut pas faire d'hypothèses sur le contenu du tableau d'origine. Par exemple, le tableau que la méthode reçoit peut ne pas être initialisé ou peut contenir des valeurs par défaut. La méthode est censée définir les valeurs de tous les éléments du tableau.

Si l'appelant est du code managé, le tableau d'origine est disponible pour la méthode appelée, comme il l'est dans un appel de méthode dans le.NET Framework. Le contenu du tableau est mutable dans le code .NET Framework, de sorte que toutes les modifications que la méthode apporte au tableau sont visibles pour l'appelant. Il importe d'en tenir compte car cela affecte les tests d'unité écrits pour un composant Windows Runtime. Si les tests sont écrits en code managé, le contenu d'un tableau apparaîtra mutable pendant le test.

Voir aussi

Référence

ReadOnlyArrayAttribute

WriteOnlyArrayAttribute

Concepts

Création de composants Windows Runtime en C# et Visual Basic