Passando matrizes para o componente Tempo de Execução do Windows

No Tempo de Execução do Windows, os parâmetros são para entrada ou saída, nunca para ambos. Isso significa que o conteúdo de uma matriz que é transmitida para um método, bem como a matriz em si, são para entrada ou saída. Se o conteúdo da matriz for para entrada, o método lê da matriz mas não grava nela. Se o conteúdo da matriz for para saída, o método grava na matriz mas não lê nela. Isso representa um problema para parâmetros de matriz, porque as matrizes no .NET Framework são tipos de referência, e o conteúdo de uma matriz é mutável mesmo quando a referência da matriz é transmitida por valor (ByVal no Visual Basic). A Ferramenta de Exportação de Metadados do Tempo de Execução do Windows (Winmdexp.exe) requer que você especifique o uso pretendido da matriz se não estiver claro no contexto, aplicando o atributo ReadOnlyArrayAttribute ou o atributo WriteOnlyArrayAttribute ao parâmetro. O uso da matriz é determinado da seguinte forma:

Se um método tiver que aceitar uma matriz para entrada, altere o conteúdo da matriz, e retorne a matriz para o chamador, use um parâmetro somente leitura para entrada e um parâmetro somente gravação (ou o valor de retorno) para a saída. O código a seguir mostra uma maneira de implementar esse padrão:

        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 que você faça uma cópia da matriz de entrada imediatamente e manipule a cópia. Isso ajuda a garantir que o método se comporte da mesma forma, não importando se o seu componente é ou não chamado pelo código do .NET Framework.

Usando componentes de código gerenciado e não gerenciado

Parâmetros com o atributo ReadOnlyArrayAttribute ou o atributo WriteOnlyArrayAttribute se comportam de maneira diferente dependendo se o chamador será gravado em código nativo ou gerenciado. Se o chamador for código nativo (JavaScript) ou Extensões de componentes Visual C++), o conteúdo da matriz será tratado da seguinte forma:

  • ReadOnlyArrayAttribute: a matriz é copiada quando a chamada ultrapassa o limite da interface binária de aplicativo (ABI). Os elementos são convertidos, se necessário. Portanto, nenhuma alteração acidental que o método faça em uma matriz de somente entrada é visível ao chamador.

  • WriteOnlyArrayAttribute: o método chamado não pode fazer suposições sobre o conteúdo da matriz original. Por exemplo, a matriz que o método recebe não pode ser inicializada ou pode conter valores padrão. Espera-se que o método defina os valores de todos os elementos na matriz.

Se o chamador for um código gerenciado, a matriz original estará disponível para o método chamado, como estaria em qualquer chamada de método no .NET Framework. O conteúdo da matriz é mutável no código do .NET Framework, portanto quaisquer alterações feitas pelo método na matriz serão visíveis ao chamador. É importante lembrar disso porque afeta testes de unidade gravados para um componente do Tempo de Execução do Windows. Se os testes forem gravados em código gerenciado, o conteúdo de uma matriz parecerá mutável durante testes.

Consulte também

Referência

ReadOnlyArrayAttribute

WriteOnlyArrayAttribute

Conceitos

Criando componentes do Tempo de Execução do Windows em C# e Visual Basic