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
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.
Applicazione di MarshalAsAttribute a un parametro
Public Sub M1(<MarshalAs(UnmanagedType.LPWStr)> msg As String)
' ...
End Sub
void M1([MarshalAs(UnmanagedType.LPWStr)] string msg)
{
// ...
}
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 = "";
}
ref class MsgText
{
public:
[MarshalAs(UnmanagedType::LPWStr)]
String^ msg;
MsgText()
{
msg = "";
}
};
Applicazione di MarshalAsAttribute a un valore restituito
Public Function M2() As <MarshalAs(UnmanagedType.LPWStr)> String
Dim msg As New String(New char(128){})
' Load message here ...
Return msg
End Function
[return: MarshalAs(UnmanagedType.LPWStr)]
public string GetMessage()
{
string msg = new string(new char[128]);
// Load message here ...
return msg;
}
[returnvalue: MarshalAs(UnmanagedType::LPWStr)]
String^ GetMessage()
{
String^ msg = gcnew String(gcnew array<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.
Vedere anche
Riferimenti
Personalizzazione dei wrapper COM disponibili per la chiamata
Concetti
personalizzazione di wrapper di runtime richiamabili