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:
Para o valor de retorno ou para um parâmetro out (um parâmetro ByRef com o atributo OutAttribute no Visual Basic), a matriz é sempre somente para saída. Não aplique o atributo ReadOnlyArrayAttribute. O atributo WriteOnlyArrayAttribute é permitido em parâmetros de saída, mas é redundante.
Aviso
O compilador Visual Basic não impõe regras de somente saída.Você nunca deve ler um parâmetro de saída; ele pode conter Nothing.Sempre atribua uma nova matriz.
Parâmetros com o modificador ref (ByRef no Visual Basic) não são permitidos. Winmdexp.exe (Ferramenta de Exportação de Metadados do Tempo de Execução do Windows) gera um erro.
Para um parâmetro transmitido por valor, você deve especificar se o conteúdo da matriz é para entrada ou saída aplicando o atributo ReadOnlyArrayAttribute ou o atributo WriteOnlyArrayAttribute. A especificação dos dois atributos é um erro.
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
Conceitos
Criando componentes do Tempo de Execução do Windows em C# e Visual Basic