Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

personalizzazione di wrapper COM richiamabili

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 parametro di metodo, un campo di classe o un valore restituito 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 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 intero a 4 byte, ad esempio, si ottiene sempre un intero a 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.


void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
    // ...
}



class MsgText
{
    [MarshalAs(UnmanagedType.LPWStr)]
    public string msg = "";
}



[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
    string msg = new string(new char[128]);
    // Load message here ...
    return msg;
}


Impostare l'enumerazione System.Runtime.InteropServices.UnmanagedType 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.

Mostra: