Share via


attributi direzionali

Ciascun parametro di metodo può essere associato a un'impostazione per l'attributo InAttribute, l'attributo OutAttribute o entrambi. Gli attributi direzionali vengono applicati in fase di progettazione per modificare il marshalling della fase di esecuzione tra la memoria gestita e quella non gestita.

Gli attributi InAttribute e OutAttribute si trovano nello spazio dei nomi System.Runtime.InteropServices e sono equivalenti agli attributi [in], [out], [in/out] e [out, retval] dell'interfaccia IDL (Interface Definition Language).

NotaNota

Il valore restituito della firma di un metodo gestito viene sempre mappato su [out, retval] in una libreria dei tipi.Non esistono attributi direzionali equivalenti applicabili.

Gli attributi direzionali sono facoltativi e vengono applicati ai parametri dei metodi quando si desidera modificare il comportamento predefinito del gestore di marshalling. Se si omettono gli attributi direzionali da un parametro dei metodi, il flusso direzionale basato sul tipo del parametro (valore o riferimento) e gli eventuali modificatori vengono determinati dal gestore di marshalling.

In alcuni linguaggi sono disponibili parole chiave che consentono la modifica del flusso direzionale dei parametri dei metodi. Nella tabella riportata di seguito vengono elencate le parole chiave relative alla direzione fornite da Visual Basic 2005 e C# con l'attributo dell'interfaccia IDL equivalente.

Visual Basic 2005

C#

Attributo IDL

ByVal

Nessun equivalente.

[in]

ByRef

ref

[in/out]

Nessun equivalente.

out

[out]

A causa dei modificatori di parametri ByRef, ref e out , il marshalling degli argomenti dei metodi viene eseguito per riferimento e non per valore. Per gli argomenti dei metodi passati per valore viene eseguito il marshalling sul codice non gestito come valori sullo stack, mentre il marshalling per gli argomenti passati per riferimento viene effettuato come puntatori sullo stack. Nell'illustrazione riportata di seguito viene mostrato il comportamento del marshalling predefinito dei tipi valore e tipi di riferimento con i modificatori dei parametri.

Marshalling predefinito degli argomenti dei metodi sul codice non gestito

Comportamento di marshalling predefinito

Per impostazione predefinita, il marshalling dei tipi di riferimento (classi, matrici, stringhe e interfacce) passati per valore viene effettuato come parametri In per motivi di prestazioni. Le modifiche apportate a questi tipi non sono visibili, a meno che non vengano applicati InAttribute e OutAttribute (o solo OutAttribute) al parametro dei metodi. Per la classe StringBuilder, che rappresenta un'eccezione alla regola, il marshalling viene eseguito come parametro in/out.

Per gli attributi direzionali dal gestore di marshalling di interoperabilità viene garantito il comportamento descritto di seguito.

  • Non viene mai generata un'operazione di scrittura in un parametro In passato dal codice non gestito. In questo modo, il codice non gestito può passare in modo sicuro un puntatore a una pagina di sola lettura o un puntatore ai dati ai quali si accede simultaneamente.

  • Quando l'oggetto copiato contiene un oggetto allocato, quale un BSTR, il gestore di marshalling rispetta sempre la sequenza corretta di allocazioni e distruzioni richiesta dalle impostazioni In/Out.

È importante applicare correttamente gli attributi direzionali nel codice. Se InAttribute e OutAttribute vengono applicati correttamente ai parametri nel codice gestito, l'utilità di esportazione della libreria dei tipi (Tlbexp.exe) utilizza questi bit per impostare i bit In/Out nella libreria dei tipi corrispondente, un'operazione particolarmente importante per i tipi di riferimento che possono essere bloccati, come alcune matrici e classi.

Vedere anche

Concetti

Gestione della memoria con il marshalling di interoperabilità

tipi copiabili e non copiabili

copia e blocco

Altre risorse

comportamento predefinito del marshaling