Marshaling d’interopérabilitéInterop Marshaling

Le marshaling d'interopérabilité détermine la façon dont les données sont transmises dans les arguments de méthode et les valeurs de retour entre la mémoire managée et non managée lors des appels.Interop marshaling governs how data is passed in method arguments and return values between managed and unmanaged memory during calls. Le marshaling d'interopérabilité est une activité d'exécution effectuée par le service de marshaling du common language runtime.Interop marshaling is a run-time activity performed by the common language runtime's marshaling service.

La plupart des types de données ont des représentations communes dans la mémoire managée et la mémoire non managée.Most data types have common representations in both managed and unmanaged memory. Le marshaleur d’interopérabilité gère ces types à votre place.The interop marshaler handles these types for you. D'autres types peuvent être ambigus ou non représentés dans la mémoire managée.Other types can be ambiguous or not represented at all in managed memory.

Un type ambigu peut avoir plusieurs représentations non managées qui correspondent à un seul type managé ou bien ne pas avoir d'informations de type (par exemple, la taille d'un tableau).An ambiguous type can have either multiple unmanaged representations that map to a single managed type, or missing type information, such as the size of an array. Pour les types ambigus, le marshaleur fournit une représentation par défaut et des représentations alternatives où plusieurs représentations existent.For ambiguous types, the marshaler provides a default representation and alternative representations where multiple representations exist. Vous pouvez fournir des instructions explicites au marshaleur sur la façon de marshaler un type ambigu.You can supply explicit instructions to the marshaler on how it is to marshal an ambiguous type.

Appel de code non managé et modèles d'interopérabilité COMPlatform Invoke and COM Interop Models

Le common language runtime fournit deux mécanismes d'interopérabilité avec le code non managé :The common language runtime provides two mechanisms for interoperating with unmanaged code:

  • L'appel de code non managé, qui permet au code managé d'appeler des fonctions exportées à partir d'une bibliothèque non managée.Platform invoke, which enables managed code to call functions exported from an unmanaged library.
  • COM Interop, qui permet au code managé d'interagir avec les objets COM via des interfaces.COM interop, which enables managed code to interact with Component Object Model (COM) objects through interfaces.

L’appel de code non managé et COM Interop utilisent tous deux le marshaling d’interopérabilité pour faire passer les arguments de méthode de l’appelant à l’appelé, puis dans l’autre sens, si nécessaire.Both platform invoke and COM interop use interop marshaling to accurately move method arguments between caller and callee and back, if required. Comme le montre l’illustration suivante, un appel de méthode d’appel de code non managé passe du code managé au code non managé et jamais dans l’autre sens, sauf quand des fonctions de rappel sont impliquées.As the following illustration shows, a platform invoke method call flows from managed to unmanaged code and never the other way, except when callback functions are involved. Même si les appels de code non managé peuvent uniquement passer du code managé au code non managé, les données peuvent circuler dans les deux sens en tant que paramètres d'entrée ou de sortie.Even though platform invoke calls can flow only from managed to unmanaged code, data can flow in both directions as input or output parameters. Les appels de méthode COM Interop peuvent circuler dans les deux sens.COM interop method calls can flow in either direction.

Appel de plateformePlatform invoke

Au niveau le plus bas, ces deux mécanismes utilisent le même service de marshaling d’interopérabilité. Toutefois, certains types de données sont pris en charge exclusivement par COM Interop ou par l’appel de code non managé.At the lowest level, both mechanisms use the same interop marshaling service; however, certain data types are supported exclusively by COM interop or platform invoke. Pour plus d’informations, consultez Comportement de marshaling par défaut.For details, see Default Marshaling Behavior.

Marshaling et cloisonnements COMMarshaling and COM Apartments

Le marshaleur d'interopérabilité marshale les données entre le tas du common langage runtime et le tas non managé.The interop marshaler marshals data between the common language runtime heap and the unmanaged heap. Le marshaling se produit chaque fois que l’appelant et l’appelé ne peuvent pas agir sur une même instance de données.Marshaling occurs whenever the caller and callee cannot operate on the same instance of data. Le marshaleur d'interopérabilité permet à l'appelant et à l'appelé d'utiliser les mêmes données, même s'ils possèdent chacun leur propre copie des données.The interop marshaler makes it possible for the caller and callee to appear to be operating on the same data even if they have their own copy of the data.

COM possède également un marshaleur qui marshale les données entre des cloisonnements COM ou différents processus COM.COM also has a marshaler that marshals data between COM apartments or different COM processes. Lors d'un appel entre du code managé et du code non managé au sein d'un même cloisonnement COM, le marshaleur d'interopérabilité est le seul marshaleur impliqué.When calling between managed and unmanaged code within the same COM apartment, the interop marshaler is the only marshaler involved. Lors d'un appel entre du code managé et du code non managé au sein de cloisonnements COM (ou autres processus) différents, le marshaleur d'interopérabilité et le marshaleur COM sont tous les deux impliqués.When calling between managed code and unmanaged code in a different COM apartment or a different process, both the interop marshaler and the COM marshaler are involved.

Clients COM et serveurs managésCOM Clients and Managed Servers

L’entrée de Registre ThreadingModel d’un serveur managé exporté avec une bibliothèque de types inscrite par l’outil Regasm.exe (outil d’inscription d’assemblys) a la valeur Both.An exported managed server with a type library registered by the Regasm.exe (Assembly Registration Tool) has a ThreadingModel registry entry set to Both. Cette valeur indique que le serveur peut être activé dans un thread unique cloisonné (STA) ou dans un multithread cloisonné (MTA).This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). L’objet serveur est créé dans le même cloisonnement que son appelant, comme indiqué dans le tableau suivant :The server object is created in the same apartment as its caller, as shown in the following table:

Client COMCOM client Serveur .NET.NET server Configuration requiseMarshaling requirements
STASTA Both deviennent un STA.Both becomes STA. Marshaling dans un même cloisonnement.Same-apartment marshaling.
MTAMTA Both deviennent un MTA.Both becomes MTA. Marshaling dans un même cloisonnement.Same-apartment marshaling.

Étant donné que le client et le serveur se trouvent dans le même cloisonnement, le service de marshaling d’interopérabilité gère automatiquement tout le marshaling de données.Because the client and server are in the same apartment, the interop marshaling service automatically handles all data marshaling. L'illustration suivante montre le service de marshaling d'interopérabilité agissant entre les tas managés et non managés au sein du même cloisonnement de style COM.The following illustration shows the interop marshaling service operating between managed and unmanaged heaps within the same COM-style apartment.

Marshaling d’interopérabilité entre des tas managés et non managésInterop marshaling between managed and unmanaged heaps

Si vous prévoyez d'exporter un serveur managé, n'oubliez pas que le client COM détermine le cloisonnement du serveur.If you plan to export a managed server, be aware that the COM client determines the apartment of the server. Un serveur managé appelé par un client COM initialisé dans un MTA doit garantir la cohérence des threads.A managed server called by a COM client initialized in an MTA must ensure thread safety.

Clients managés et serveurs COMManaged Clients and COM Servers

Le paramètre par défaut des cloisonnements de clients managés est MTA. Toutefois, le type d'application du client .NET peut modifier le paramètre par défaut.The default setting for managed client apartments is MTA; however, the application type of the .NET client can change the default setting. Par exemple, le paramètre de cloisonnement d’un client Visual Basic est STA.For example, a Visual Basic client apartment setting is STA. Vous pouvez utiliser l'attribut System.STAThreadAttribute, l'attribut System.MTAThreadAttribute, la propriété Thread.ApartmentState ou la propriété Page.AspCompatMode pour examiner et modifier le paramètre de cloisonnement d'un client managé.You can use the System.STAThreadAttribute, the System.MTAThreadAttribute, the Thread.ApartmentState property, or the Page.AspCompatMode property to examine and change the apartment setting of a managed client.

L'auteur du composant définit l'affinité de thread d'un serveur COM.The author of the component sets the thread affinity of a COM server. Le tableau suivant montre les combinaisons de paramètres de cloisonnement pour les serveurs COM et les clients .NET.The following table shows the combinations of apartment settings for .NET clients and COM servers. Il montre également la configuration de marshaling requise qui en résulte pour les combinaisons.It also shows the resulting marshaling requirements for the combinations.

Client .NET.NET client Serveur COMCOM server Configuration requiseMarshaling requirements
MTA (par défaut)MTA (default) MTAMTA

STASTA
Marshaling d’interopérabilité.Interop marshaling.

Marshaling COM et marshaling d’interopérabilité.Interop and COM marshaling.
STASTA MTAMTA

STASTA
Marshaling COM et marshaling d’interopérabilité.Interop and COM marshaling.

Marshaling d’interopérabilité.Interop marshaling.

Quand un client managé et un serveur non managé se trouvent dans un même cloisonnement, le service de marshaling d'interopérabilité gère tout le marshaling de données.When a managed client and unmanaged server are in the same apartment, the interop marshaling service handles all data marshaling. Toutefois, quand le client et le serveur sont initialisés dans des cloisonnements différents, le marshaling COM est également requis.However, when client and server are initialized in different apartments, COM marshaling is also required. L’illustration suivante montre les éléments d’un appel inter-cloisonnement :The following illustration shows the elements of a cross-apartment call:

Marshaling COMCOM marshaling

Pour le marshaling intercloisonnements, vous pouvez procéder comme suit :For cross-apartment marshaling, you can do the following:

  • Acceptez la surcharge du marshaling intercloisonnements, qui se remarque uniquement quand de nombreux appels dépassent la limite.Accept the overhead of the cross-apartment marshaling, which is noticeable only when there are many calls across the boundary. Vous devez inscrire la bibliothèque de types du composant COM pour que les appels puissent franchir les limites des cloisonnements.You must register the type library of the COM component for calls to successfully cross the apartment boundary.

  • Modifiez le thread principal en définissant le thread client sur STA ou MTA.Alter the main thread by setting the client thread to STA or MTA. Par exemple, si votre client C# appelle plusieurs composants COM STA, vous pouvez éviter le marshaling intercloisonnements en définissant le thread principal sur STA.For example, if your C# client calls many STA COM components, you can avoid cross-apartment marshaling by setting the main thread to STA.

    Notes

    Une fois le thread d’un client C# défini sur STA, les appels aux composants COM MTA nécessiteront un marshaling intercloisonnements.Once the thread of a C# client is set to STA, calls to MTA COM components will require cross-apartment marshaling.

Pour obtenir des instructions sur la sélection explicite d’un modèle de cloisonnement, consultez Threading managé et non managé.For instructions on explicitly selecting an apartment model, see Managed and Unmanaged Threading.

Marshaling des appels distantsMarshaling Remote Calls

Comme pour le marshaling intercloisonnements, le marshaling COM est impliqué dans chaque appel effectué entre du code managé et du code non managé chaque fois que les objets résident dans des processus distincts.As with cross-apartment marshaling, COM marshaling is involved in each call between managed and unmanaged code whenever the objects reside in separate processes. Exemple :For example:

  • Un client COM qui appelle un serveur managé sur un hôte distant utilise le modèle DCOM (Distributed COM).A COM client that invokes a managed server on a remote host uses distributed COM (DCOM).
  • Un client managé qui appelle un serveur COM sur un hôte distant utilise le modèle DCOM.A managed client that invokes a COM server on a remote host uses DCOM.

L’illustration suivante montre comment le marshaling d’interopérabilité et le marshaling COM fournissent des canaux de communication entre les limites des processus et des hôtes :The following illustration shows how interop marshaling and COM marshaling provide communications channels across process and host boundaries:

Marshaling COMCOM marshaling

Conservation d'identitéPreserving Identity

Le common language runtime préserve l'identité des références managées et non managées.The common language runtime preserves the identity of managed and unmanaged references. L'illustration suivante montre le flux des références non managées directes (ligne du haut) et des références managées directes (ligne du bas) entre plusieurs hôtes et processus.The following illustration shows the flow of direct unmanaged references (top row) and direct managed references (bottom row) across process and host boundaries.

Wrapper CCW (COM Callable Wrapper) et Wrapper pouvant être appelé par le RuntimeCOM callable wrapper and runtime callable wrapper

Dans cette illustration :In this illustration:

  • Un client non managé obtient une référence à un objet COM provenant d'un objet managé qui reçoit cette référence d'un hôte distant.An unmanaged client gets a reference to a COM object from a managed object that gets this reference from a remote host. Le mécanisme de communication à distance est DCOM.The remoting mechanism is DCOM.

  • Un client managé obtient une référence à un objet managé provenant d'un objet COM qui reçoit cette référence d'un hôte distant.A managed client gets a reference to a managed object from a COM object that gets this reference from a remote host. Le mécanisme de communication à distance est DCOM.The remoting mechanism is DCOM.

    Notes

    La bibliothèque de types exportée du serveur managée doit être inscrite.The exported type library of the managed server must be registered.

Le nombre de limites de processus entre l'appelant et l'appelé est sans importance. Le même référencement direct se produit pour les appels de type in-process et out-of-process.The number of process boundaries between caller and callee is irrelevant; the same direct referencing occurs for in-process and out-of-process calls.

Communication à distance managéeManaged Remoting

Le runtime fournit également une communication à distance managée que vous pouvez utiliser pour établir un canal de communication entre des objets managés de plusieurs hôtes et processus.The runtime also provides managed remoting, which you can use to establish a communications channel between managed objects across process and host boundaries. La communication à distance managée peut prendre en charge un pare-feu entre les composants communicants, comme le montre l’illustration suivante :Managed remoting can accommodate a firewall between the communicating components, as the following illustration shows:

SOAP ou TcpChannel Appels distants via des pare-feu à l’aide de SOAP ou de la classe TcpChannelSOAP or TcpChannel Remote calls across firewalls using SOAP or the TcpChannel class

Certains appels non managés peuvent être transmis par le biais de SOAP, tels que les appels entre composants pris en charge et COM.Some unmanaged calls can be channeled through SOAP, such as the calls between serviced components and COM.

TitreTitle DescriptionDescription
Comportement de marshaling par défautDefault Marshaling Behavior Décrit les règles utilisées par le service de marshaling d’interopérabilité pour marshaler des données.Describes the rules that the interop marshaling service uses to marshal data.
Marshaling de données à l’aide de l’appel de code managéMarshaling Data with Platform Invoke Décrit comment déclarer des paramètres de méthode et passer des arguments à des fonctions exportées par des bibliothèques non managées.Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.
Marshaler des données avec COM InteropMarshaling Data with COM Interop Décrit comment personnaliser des wrappers COM pour modifier le comportement de marshaling.Describes how to customize COM wrappers to alter marshaling behavior.
Comment : migrer DCOM de code managé vers WCFHow to: Migrate Managed-Code DCOM to WCF Décrit comment effectuer une migration de DCOM à WCF.Describes how to migrate from DCOM to WCF.
Guide pratique pour mapper des HRESULT et des exceptionsHow to: Map HRESULTs and Exceptions Décrit comment mapper des exceptions personnalisées aux HRESULT et fournit le mappage complet de chaque HRESULT à sa classe d'exception comparable dans .NET Framework.Describes how to map custom exceptions to HRESULTs and provides the complete mapping from each HRESULT to its comparable exception class in the .NET Framework.
Interopérabilité à l’aide de types génériquesInteroperating Using Generic Types Décrit les actions prises en charge lors de l'utilisation de types génériques pour l'interopérabilité COM.Describes which actions are supported when using generic types for COM interoperability.
Interopération avec du code non managéInteroperating with Unmanaged Code Décrit les services d'interopérabilité fournis par le common language runtime.Describes interoperability services provided by the common language runtime.
Interopérabilité COM avancéeAdvanced COM Interoperability Fournit des liens vers des informations sur l'incorporation de composants COM dans une application .NET Framework.Provides links to more information about incorporating COM components into your .NET Framework application.
Considérations de design pour l’interopérabilitéDesign Considerations for Interoperation Fournit des conseils pour l'écriture de composants COM intégrés.Provides tips for writing integrated COM components.

ReferenceReference

System.Runtime.InteropServices