Partager via


personnaliser des wrappers pouvant être appelés par COM

La personnalisation d'un wrapper CCW (COM Callable Wrapper) est une tâche simple. Si le type que vous voulez exposer à un client COM possède une configuration de marshaling qui n'est pas standard, appliquez l'attribut System.Runtime.InteropServices.MarshalAsAttribute à un paramètre de méthode, un champ de classe ou une valeur de retour afin de changer le comportement de marshaling.

Ainsi que le montre l'illustration suivante, vous pouvez exporter une DLL managée sans personnaliser le wrapper (qui apparaît sur la gauche). Ou vous pouvez ajouter des informations de marshaling à la source, la compiler et utiliser Type Library Exporter (Tlbexp.exe) pour exporter la DLL modifiée et produire un wrapper personnalisé.

Informations de marshaling dans les DLL exportées

Exportateur de bibliothèques de types

RemarqueRemarque

Tous les types, méthodes, propriétés, champs et événements managés que vous voulez exposer à COM doivent être publics.Les types doivent posséder un constructeur public par défaut, seul constructeur pouvant être appelé via COM.Pour plus d'informations, consultez Qualification des types .NET en vue d'une interopérabilité.

Lors du marshaling des données entre du code managé et du code non managé, le marshaleur d'interopérabilité doit reconnaître les représentations des données qui sont passées :

  • Pour les types blittable, les représentations managées et non managées sont toujours identiques. Par exemple, un entier de 4 octets est toujours marshalé à un entier de 4 octets. Le marshaleur d'interopérabilité utilise la signature managée pour déterminer la représentation des données.

  • Pour les types non blittables, le marshaleur d'interopérabilité reconnaît la représentation managée à partir de sa signature de méthode sans toutefois pouvoir en faire de même pour la représentation non managée. Pour marshaler les types non blittables, vous pouvez utiliser l'une des techniques suivantes :

    • Permettre au marshaleur de déduire la représentation à partir de la représentation managée.

    • Fournir la représentation des données non managées de manière explicite.

Par exemple, une chaîne est convertie en un type BSTR lorsqu'elle est marshalée à partir du code managé vers du code non managé, sauf si vous appliquez explicitement MarshalAsAttribute pour marshaler la chaîne vers un autre type, tel que LPWSTR. Vous pouvez appliquer cet attribut à un paramètre, un champ ou une valeur de retour à l'intérieur de la source de la définition de type, comme le montrent les exemples suivants.

Application de l'attribut MarshalAsAttribute à un paramètre

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)
{
    // ...
}

Application de l'attribut MarshalAsAttribute à un champ à l'intérieur d'une 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 = "";
    }
};

Application de l'attribut MarshalAsAttribute à une valeur de retour

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;
}

Vous définissez l'énumération System.Runtime.InteropServices.UnmanagedType pour indiquer le format souhaité du type non managé. Dans les signatures précédentes, la donnée msg est marshalée comme mémoire tampon de caractères Unicode se terminant par null (LPWStr).

Dans certains cas, le marshaleur d'interopérabilité nécessite plus d'informations que celles fournies par le format de données non managé et managé. Par exemple, afin de marshaler un tableau, vous devez fournir le type d'élément, le rang, la taille et les limites du tableau. Vous pouvez utiliser l'attribut MarshalAsAttribute pour spécifier les informations supplémentaires nécessaires.

Voir aussi

Référence

Personnalisation des wrappers CCW (COM Callable Wrapper)

Concepts

Types de données COM

personnaliser des wrappers pouvant être appelés par le runtime

Autres ressources

marshaler des données avec COM Interop

comportement de marshaling par défaut