Übergeben von Arrays an eine Windows-Runtime-Komponente
In Windows-Runtime sind Parameter entweder für die Eingabe oder Ausgabe bestimmt, in keinem Fall jedoch für beides. Dies bedeutet, dass der Inhalt eines Arrays, das einer Methode übergeben wird, sowie das Array selbst entweder für die Eingabe oder die Ausgabe bestimmt ist. Wenn der Inhalt des Arrays für die Eingabe bestimmt ist, liest die Methode aus dem Array, schreibt jedoch nicht hinein. Ist der Inhalt des Arrays für die Ausgabe bestimmt, schreibt die Methode aus dem Array, liest jedoch nicht daraus. Dies stellt ein Problem für Arrayparameter dar, da Arrays in .NET Framework Verweistypen sind und der Inhalt eines Arrays änderbar ist, auch wenn der Arrayverweis als Wert übergeben wird (in Visual Basic ByVal) . Das Windows-Runtime-Metadaten-Export-Tool (Winmdexp.exe) erfordert, dass Sie die beabsichtigte Verwendung des Arrays angeben, wenn es aus dem Kontext nicht eindeutig hervorgeht. Wenden Sie dazu das ReadOnlyArrayAttribute-Attribut oder das WriteOnlyArrayAttribute-Attribut auf den Parameter an. Die Verwendung des Arrays wird wie folgt bestimmt:
Für den Rückgabewert oder für einen out-Parameter (in Visual Basic ein ByRef-Parameter mit dem OutAttribute-Attribut) ist das Array immer nur für Ausgabe bestimmt. Wenden Sie nicht das ReadOnlyArrayAttribute-Attribut an. Das WriteOnlyArrayAttribute-Attribut ist für Ausgabeparameter zwar zulässig, jedoch redundant.
Warnung
Der Visual Basic-Compiler erzwingt keine Regeln für die ausschließliche Ausgabe.Sie sollten nie aus einem Ausgabeparameter lesen; er enthält möglicherweise Nothing.Weisen Sie immer ein neues Array zu.
Parameter mit dem ref-Modifizierer (in Visual Basic ByRef) sind nicht zulässig. Winmdexp.exe (Windows-Runtime-Metadaten-Exporttool) erzeugt einen Fehler.
Für einen Parameter, der als Wert übergeben wird, müssen Sie angeben, ob der Arrayinhalt für die Eingabe oder Ausgabe bestimmt ist, indem Sie entweder das ReadOnlyArrayAttribute-Attribut oder das WriteOnlyArrayAttribute-Attribut anwenden. Wenn beide Attribute angegeben werden, tritt ein Fehler auf.
Wenn eine Methode ein Array für die Eingabe annehmen, den Arrayinhalt ändern und das Array an den Aufrufer zurückgeben muss, verwenden Sie einen schreibgeschützten Parameter für die Eingabe und einen lesegeschützten Parameter (oder den Rückgabewert) für die Ausgabe. Das folgende Codebeispiel zeigt eine Möglichkeit, dieses Muster zu implementieren:
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
Es wird empfohlen, unmittelbar eine Kopie des Eingabearrays zu erstellen und die Kopie zu bearbeiten. So wird sichergestellt, dass die Methode unabhängig davon, ob eine Komponente als .NET Framework-Code aufgerufen wird oder nicht, das gleiche Verhalten zeigt.
Verwenden der Komponenten im verwalteten und nicht verwalteten Code
Parameter, die über das ReadOnlyArrayAttribute-Attribut oder das WriteOnlyArrayAttribute-Attribut verfügen, verhalten sich abhängig davon, ob der Aufrufer in systemeigenem Code oder in verwaltetem Code geschrieben wird, unterschiedlich. Wenn es sich bei dem Aufrufer um systemeigenen Code (JavaScript oder Komponentenerweiterungen für Visual C++) handelt, wird der Arrayinhalt wie folgt behandelt:
ReadOnlyArrayAttribute: Das Array wird kopiert, wenn der Aufruf die Grenze der Anwendungsbinärdateischnittstelle (ABI) überschreitet. Die Elemente werden ggf. konvertiert. Daher sind versehentliche Änderungen, die die Methode an einem nur für die Eingabe bestimmten Array vornimmt, für den Aufrufer nicht sichtbar.
WriteOnlyArrayAttribute: Die aufgerufene Methode kann keine Annahmen über den Inhalt des ursprünglichen Arrays vornehmen. Beispielsweise wird das Array, das die Methode empfängt, möglicherweise nicht initialisiert oder enthält Standardwerte. Die Methode soll die Werte aller Elemente im Array festlegen.
Wenn es sich bei dem Aufrufer um verwalteten Code handelt, ist das ursprüngliche Array für die aufgerufene Methode wie bei jedem Methodenaufruf in .NET Framework verfügbar. Arrayinhalte sind in .NET Framework-Code änderbar. Daher sind alle Änderungen, die die Methode am Array vornimmt, für den Aufrufer sichtbar. Dies muss beachtet werden, da es sich auf die für die Windows-Runtime-Komponente geschriebenen Komponententests auswirkt. Wenn die Tests in verwaltetem Code geschrieben werden, erscheint der Inhalt eines Arrays während des Tests als änderbar.
Siehe auch
Referenz
Konzepte
Erstellen von Windows-Runtime-Komponenten in C# und Visual Basic