Personalizzazione dei wrapper COM disponibili per la chiamata

Personalizzare un wrapper COM disponibile per la chiamata è un'attività semplice. Se il tipo che si desidera esporre a un client COM è caratterizzato da requisiti di marshalling non standard, applicare l'attributo System.Runtime.InteropServices.MarshalAsAttribute a un campo di classe, un valore restituito o un parametro del metodo per modificare il comportamento di marshalling.

Come mostrato nell'illustrazione riportata di seguito, è possibile esportare una DLL gestita senza personalizzare il wrapper (a sinistra). In alternativa, è possibile aggiungere informazioni sul marshalling all'origine, compilarla e utilizzare l'utilità di esportazione della libreria dei tipi (Tlbexp.exe) per esportare la DLL modificata e produrre un wrapper personalizzato.

Informazioni sul marshalling nelle DLL esportate

Utilità di esportazione della libreria dei tipi

Nota

È necessario che tutti i tipi gestiti, i metodi, le proprietà, i campi e gli eventi che si desidera esporre a COM siano pubblici. I tipi devono disporre di un costruttore pubblico predefinito, che costituisce l'unico costruttore che può essere chiamato tramite COM. Per ulteriori informazioni, vedere Qualificazione di tipi .NET per l'interoperabilità.

Quando si esegue il marshalling dei dati tra codice gestito e non gestito, è necessario che il gestore di marshalling di interoperabilità riconosca le rappresentazioni dei dati passati:

  • Le rappresentazioni gestite e non gestite per i tipi copiabili rimangono sempre invariate. Con il marshalling di un valore integer da 4 byte, ad esempio, si ottiene sempre un valore integer da 4 byte. La firma gestita viene utilizzata dal gestore di marshalling di interoperabilità per determinare la rappresentazione dei dati.

  • Per i tipi non copiabili, la rappresentazione gestita viene riconosciuta dal gestore di marshalling di interoperabilità mediante la firma del metodo, ma ciò non accade per la rappresentazione non gestita. Per eseguire il marshalling di tipi non copiabili, è possibile utilizzare una delle tecniche elencate di seguito:

    • Consentire al gestore di marshalling di dedurre la rappresentazione da quella gestita.

    • Fornire esplicitamente la rappresentazione dei dati non gestiti.

Una stringa viene ad esempio convertita in un tipo BSTR quando si esegue il marshalling da codice gestito a codice non gestito, a meno che non si applichi esplicitamente MarshalAsAttribute per effettuare il marshalling della stringa a un altro tipo, ad esempio LPWSTR. È possibile applicare questo attributo a un parametro, campo o valore restituito nell'origine della definizione del tipo, come mostrato negli esempi riportati di seguito.

Applicazione di MarshalAsAttribute a un parametro

Public Sub M1
(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
public void M1
([MarshalAs(UnmanagedType.LPWStr)]String msg);

Applicazione di MarshalAsAttribute a un campo all'interno di una classe

Class MsgText
<MarshalAs(UnmanagedType.LPWStr)> Public msg As String
End Class
class MsgText {
[MarshalAs(UnmanagedType.LPWStr)] Public String msg;
}

Applicazione di MarshalAsAttribute a un valore restituito

Public Function M2() _
As <MarshalAs(UnmanagedType.LPWStr)> String
[return: MarshalAs(UnmanagedType.LPWStr)]
public String GetMessage();

L'enumerazione System.Runtime.InteropServices.UnmanagedType viene impostata per indicare il formato desiderato del tipo non gestito. Nelle firme precedenti, viene eseguito il marshalling dei dati msg come buffer con terminazione null di caratteri Unicode (LPWStr).

Il gestore di marshalling di interoperabilità richiede talvolta una quantità di informazioni superiore rispetto a quella fornita dal formato dei dati gestiti e non gestiti. Per eseguire il marshalling di una matrice, ad esempio, è necessario fornire il tipo di elemento, il numero di dimensioni, la dimensione e i limiti della matrice. È possibile utilizzare MarshalAsAttribute per specificare ulteriori informazioni necessarie.

Vedere anche

Riferimenti

Personalizzazione dei wrapper COM disponibili per la chiamata

Concetti

Tipi di dati COM
Personalizzazione dei wrapper di runtime disponibili per la chiamata

Altre risorse

Marshalling dei dati con interoperabilità COM
Comportamento di marshalling predefinito