Direktionale Attribute
Aktualisiert: November 2007
Jedem Methodenparameter kann eine Einstellung für das InAttribute-Attribut, das OutAttribute-Attribut oder beide Attribute zugeordnet werden. Direktionale Attribute werden zur Entwurfszeit angewendet, um das Laufzeitmarshalling zwischen verwaltetem und nicht verwaltetem Speicher zu ändern.
InAttribute und OutAttribute befinden sich im System.Runtime.InteropServices-Namespace und sind äquivalent mit den Schnittstellenattributen [in], [out], [in/out] und [out, retval] der Sprache für Schnittstellendefinition (IDL, Interface Definition Language).
Hinweis: |
---|
Der Rückgabewert einer verwalteten Methodensignatur wird in einer Typbibliothek immer [out, retval] zugeordnet. Ein äquivalentes direktionales Attribut, das Sie anwenden können, ist nicht vorhanden. |
Direktionale Attribute sind optional. Sie werden auf Methodenparameter angewendet, wenn das Standardverhalten des Marshallers geändert werden soll. Wenn Sie für einen Methodenparameter direktionale Attribute auslassen, bestimmt der Marshaller den direktionalen Fluss basierend auf dem Typ des Parameters (Wert oder Verweis) und gegebenenfalls anhand seiner Modifizierer.
In einigen Sprachen gibt es Schlüsselwörter, mit denen Sie den direktionalen Fluss der Methodenparameter ändern können. In der folgenden Tabelle sind die richtungsbezogenen Schlüsselwörter in Visual Basic 2005 und C# sowie die äquivalenten IDL-Schnittstellenattribute aufgelistet.
Visual Basic 2005 |
C# |
IDL-Attribut |
---|---|---|
ByVal |
Kein Äquivalent. |
[in] |
ByRef |
ref |
[in/out] |
Kein Äquivalent. |
out |
[out] |
Durch den ByRef-Parametermodifizierer, den ref-Parametermodifizierer und den out-Parametermodifizierer werden Methodenargumente nicht durch einen Wert, sondern durch einen Verweis gemarshallt. Durch einen Wert übergebene Methodenargumente werden als Werte auf dem Stapel an nicht verwalteten Code gemarshallt. Durch einen Verweis übergebene Argumente werden als Zeiger auf dem Stapel gemarshallt. In der folgenden Abbildung ist das standardmäßige Marshallingverhalten von Werttypen und Referenztypen mit Parametermodifizierern dargestellt.
Standardmäßiges Marshalling von Methodenargumenten an nicht verwalteten Code
Damit die Gesamtleistung nicht beeinträchtigt wird, werden durch einen Wert übergebene Referenztypen (Klassen, Arrays, Zeichenfolgen und Schnittstellen) als In-Parameter gemarshallt. Änderungen an diesen Typen werden nur angezeigt, wenn Sie InAttribute und OutAttribute (oder nur OutAttribute) auf den Methodenparameter anwenden. Die StringBuilder-Klasse, die bezüglich dieser Regel eine Ausnahme bildet, wird als In/Out-Parameter gemarshallt.
Der Interop-Marshaller garantiert in Bezug auf die direktionalen Attribute folgendes Verhalten:
Der Interop-Marshaller generiert für aus nicht verwaltetem Code übergebene In-Parameter keine Schreibvorgänge. Somit kann der nicht verwaltete Code einen Zeiger auf eine schreibgeschützte Seite oder einen Zeiger auf Daten, auf die gleichzeitig zugegriffen wird, ohne Risiko übergeben.
Wenn das kopierte Objekt ein reserviertes Objekt (wie BSTR) enthält, führt der Marshaller die durch die In/Out-Einstellungen angeforderten Reservierungen und Zerstörungen immer in der richtigen Reihenfolge aus.
Die direktionalen Attribute müssen im Code unbedingt exakt angewendet werden. Durch die richtige Anwendung von InAttribute und OutAttribute auf Parameter in verwaltetem Code wird sichergestellt, dass der Type Library Exporter-Tool (Tlbexp.exe) diese Bits verwendet, um die In/Out-Bits in der entsprechenden Typbibliothek festzulegen. Dies ist vor allem für Referenztypen die fixiert werden können, von Bedeutung (beispielsweise für Arrays und Klassen).
Siehe auch
Konzepte
Speicherverwaltung mit dem Interop-Marshaller
Blitfähige und nicht blitfähige Typen