Condividi tramite


Passaggio di matrici a un componente Windows Runtime

In Windows Runtime i parametri sono di input o di output, ma mai di entrambi i tipi. Ciò significa che il contenuto di una matrice passata a un metodo, e la matrice stessa, sono di input o di output. Se il contenuto della matrice è di input, il metodo legge la matrice ma non scrive in essa. Se il contenuto della matrice è di output, il metodo scrive nella matrice, ma non la legge. Ciò costituisce un problema per i parametri di matrice perché in .NET Framework le matrici sono tipi di riferimento e il contenuto di una matrice è modificabile anche quando il riferimento della matrice viene passato in base al valore (ByVal in Visual Basic). Lo strumento di esportazione dei metadati di Windows Runtime (Winmdexp.exe) richiede di specificare l'utilizzo previsto della matrice, se non si evince dal contesto, applicando l'attributo ReadOnlyArrayAttribute o WriteOnlyArrayAttribute al parametro. L'utilizzo di una matrice si determina come segue:

  • Per il valore restituito o per un parametro out, un parametro ByRef con l'attributo OutAttribute in Visual Basic, la matrice è sempre solo di output. Non applicare l'attributo ReadOnlyArrayAttribute. L'attributo WriteOnlyArrayAttribute è consentito sui parametri di output, ma è ridondante.

    Avviso

    Il compilatore Visual Basic non applica le regole solo output.Ti consigliamo di non leggere mai da un parametro di output perché potrebbe contenere Nothing.Assegna sempre una nuova matrice.

  • I parametri con il modificatore ref (ByRef in Visual Basic) non sono consentiti. Winmdexp.exe (Windows Runtime Metadata Export Tool) genera un errore.

  • Per un parametro che viene passato in base al valore, devi specificare se il contenuto della matrice è di input o di output applicando l'attributo ReadOnlyArrayAttribute o WriteOnlyArrayAttribute. Specificare entrambi gli attributi è un errore.

Se un metodo deve accettare una matrice di input, modificare il contenuto della matrice e restituire la matrice al chiamante, utilizza un parametro di sola lettura per l'input e un parametro di sola scrittura, o il valore restituito, per l'output. Il codice seguente mostra come implementare questo modello:

        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    

Consigliamo di effettuare una copia della matrice di input immediatamente e di modificare la copia. In questo modo ti assicuri che il metodo mantenga lo stesso comportamento, indipendentemente dal fatto che il componente venga chiamato o meno dal codice di .NET Framework.

Utilizzo di componenti da codice gestito e codice non gestito

I parametri che presentano l'attributo ReadOnlyArrayAttribute o WriteOnlyArrayAttribute si comportano in modo diverso a seconda del fatto che il chiamante sia scritto in codice nativo o in codice gestito. Se il chiamante è in codice nativo, JavaScript o Estensioni componenti Visual C++, il contenuto della matrice viene trattato come segue:

  • ReadOnlyArrayAttribute: la matrice viene copiata quando la chiamata attraversa il limite dell'interfaccia binaria dell'applicazione (ABI, application binary interface). Se necessario, gli elementi vengono convertiti. Di conseguenza, eventuali modifiche effettuate dal metodo a una matrice di solo input non saranno visibili al chiamante.

  • WriteOnlyArrayAttribute: il metodo chiamato non può fare supposizioni sul contenuto della matrice originale. Ad esempio, la matrice che il metodo riceve potrebbe non essere inizializzata o contenere valori predefiniti. È previsto che il metodo imposta i valori di tutti gli elementi della matrice.

Se il chiamante è in codice gestito, la matrice originale è disponibile al metodo chiamato, come lo sarebbe in qualsiasi chiamata di metodo in .NET Framework. Poiché il contenuto della matrice è modificabile nel codice .NET Framework, eventuali modifiche apportate dal metodo alla matrice sono visibili al chiamante. È importante ricordarlo poiché interessa gli unit test scritti per un componente di Windows Runtime. Se i test sono scritti in codice gestito, il contenuto di una matrice risulterà modificabile durante il test.

Vedere anche

Riferimenti

ReadOnlyArrayAttribute

WriteOnlyArrayAttribute

Concetti

Creazione di componenti Windows Runtime in C# e Visual Basic