Share via


Pasar matrices a un componente de Windows en tiempo de ejecución

En Windows en tiempo de ejecución, los parámetros son para la entrada o para la salida, nunca para ambas. Esto significa que el contenido de una matriz que se pasa a un método, así como a la propia matriz, son para la entrada o para la salida. Si el contenido de la matriz es para la entrada, el método lee en la matriz pero no escribe en ella. Si el contenido de la matriz es para la salida, el método escribe en la matriz pero no lee en ella. Esto presenta un problema para los parámetros de la matriz, porque las matrices de .NET Framework son tipos de referencia y el contenido de una matriz es mutable incluso si la referencia se pasa por valor (ByVal en Visual Basic). La Herramienta de exportación de metadatos de Windows en tiempo de ejecución (Winmdexp.exe) requiere que especifiques el uso previsto de la matriz si no está claro en el contexto, mediante la aplicación del atributo ReadOnlyArrayAttribute o el atributo WriteOnlyArrayAttribute al parámetro. El uso de la matriz se determina del siguiente modo:

Si un método debe aceptar una matriz para la entrada, modificar el contenido de la matriz y devolver la matriz al llamador, utilice un parámetro de solo lectura para la entrada y un parámetro de solo escritura (o el valor devuelto) para la salida. En el código siguiente se muestra una manera de implementar este patrón.

        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    

Recomendamos hacer una copia de la matriz de entrada inmediatamente, y manipular la copia. Esto ayuda a garantizar que el método se comporte de igual modo si tu componente es invocado o no por código de .NET Framework.

Usar componentes de código administrado y no administrado

Los parámetros que tienen el atributo ReadOnlyArrayAttribute o el atributo WriteOnlyArrayAttribute se comportan de manera diferente según que el llamador se escriba en código nativo o en código administrado. Si el llamador es código nativo (JavaScript o Extensiones de componentes de Visual C++), el contenido de la matriz se trata del siguiente modo:

  • ReadOnlyArrayAttribute: La matriz se copia cuando la llamada cruza el límite de la interfaz binaria de aplicación (ABI). Los elementos se convierten en caso necesario. Por consiguiente, los cambios accidentales que el método efectúa en una matriz solo de entrada no son visibles para el llamador.

  • WriteOnlyArrayAttribute: El método invocado no puede realizar ninguna suposición acerca del contenido de la matriz original. Por ejemplo, la matriz que el método recibe puede no haberse inicializado o puede que contenga los valores predeterminados. Se espera que el método establezca los valores de todos los elementos de la matriz.

Si el llamador es código administrado, la matriz original está disponible en el método invocado, como estaría en cualquier llamada a un método en .NET Framework. El contenido de la matriz es mutable en código de .NET Framework, por lo que cualquier cambio que el método realice en la matriz es visible para el llamador. Es importante recordar esto porque afecta a las pruebas unitarias creadas para un componente de Windows en tiempo de ejecución. Si las pruebas se escriben en código administrado, el contenido de una matriz aparecerá como mutable durante las pruebas.

Vea también

Referencia

ReadOnlyArrayAttribute

WriteOnlyArrayAttribute

Conceptos

Crear componentes de Windows en tiempo de ejecución en C# y Visual Basic