Marshalling di interoperabilitàInterop Marshaling

Il marshalling di interoperabilità determina il passaggio di dati in argomenti di metodo e i valori restituiti tra memoria gestita e non gestita durante le chiamate.Interop marshaling governs how data is passed in method arguments and return values between managed and unmanaged memory during calls. Il marshalling di interoperabilità è un'attività di run-time eseguita dal servizio di marshalling di Common Language Runtime.Interop marshaling is a run-time activity performed by the common language runtime's marshaling service.

La maggior parte dei tipi di dati hanno rappresentazioni comuni nella memoria gestita e non gestita.Most data types have common representations in both managed and unmanaged memory. Il gestore di marshalling di interoperabilità gestisce questi tipi per conto dell'utente.The interop marshaler handles these types for you. Altri tipi possono essere ambigui o non essere rappresentati nella memoria gestita.Other types can be ambiguous or not represented at all in managed memory.

Un tipo ambiguo può avere più rappresentazioni non gestite che eseguono il mapping a un singolo tipo gestito o informazioni sul tipo mancante, ad esempio le dimensioni della matrice.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. Per i tipi ambigui, il gestore del marshalling fornisce una rappresentazione predefinita e rappresentazioni alternative in cui sono presenti più rappresentazioni.For ambiguous types, the marshaler provides a default representation and alternative representations where multiple representations exist. È possibile fornire istruzioni esplicite al gestore del marshalling su come eseguire il marshalling di un tipo ambiguo.You can supply explicit instructions to the marshaler on how it is to marshal an ambiguous type.

In questa panoramica sono incluse le sezioni seguenti:This overview contains the following sections:

Modelli basati su platform invoke e sull'interoperabilità COMPlatform Invoke and COM Interop Models

In Common Language Runtime vengono forniti due meccanismi per l'interoperabilità con il codice non gestito:The common language runtime provides two mechanisms for interoperating with unmanaged code:

  • Platform invoke, che consente la chiamata di funzioni esportate da una libreria non gestita da parte del codice gestito.Platform invoke, which enables managed code to call functions exported from an unmanaged library.

  • L'interoperabilità COM, che consente l'interazione del codice gestito con oggetti COM (Component Object Model) mediante interfacce.COM interop, which enables managed code to interact with Component Object Model (COM) objects through interfaces.

Il marshalling di interoperabilità viene usato sia da platform invoke che dall'interoperabilità COM per spostare con precisione gli argomenti dei metodi tra chiamante e chiamato e viceversa, se necessario.Both platform invoke and COM interop use interop marshaling to accurately move method arguments between caller and callee and back, if required. Come mostrato nella figura seguente, una chiamata al metodo di platform invoke viene effettuata dal codice gestito al codice non gestito e mai viceversa, ad eccezione del caso in cui sono coinvolte funzioni di callback.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. Benché il flusso delle chiamate platform invoke possa andare solo dal codice gestito a quello non gestito, il flusso dei dati può essere in entrambe le direzioni, come parametri di input o di output.Even though platform invoke calls can flow only from managed to unmanaged code, data can flow in both directions as input or output parameters. Le chiamate al metodo di interoperabilità COM possono scorrere in entrambe le direzioni.COM interop method calls can flow in either direction.

Platform invokePlatform invoke

Al livello inferiore, lo stesso servizio di marshalling di interoperabilità viene usato da entrambi i meccanismi. Alcuni tipi di dati sono tuttavia supportati esclusivamente dall'interoperabilità COM o da platform invoke.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. Per informazioni dettagliate, vedere Comportamento di marshalling predefinito.For details, see Default Marshaling Behavior.

Torna all'inizioBack to top

Marshalling e apartment COMMarshaling and COM Apartments

Il gestore di marshalling di interoperabilità esegue il marshalling dei dati tra l'heap di Common Language Runtime e quello non gestito.The interop marshaler marshals data between the common language runtime heap and the unmanaged heap. Il marshalling ha luogo ogni volta che il chiamante e il chiamato non possono operare sulla stessa istanza di dati.Marshaling occurs whenever the caller and callee cannot operate on the same instance of data. Il gestore di marshalling di interoperabilità fa sì che il chiamante e il chiamato sembrino operare sugli stessi dati benché dispongano ognuno della propria copia dei dati.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.

In COM è anche disponibile un gestore che effettua il marshalling dei dati tra apartment COM o diversi processi COM.COM also has a marshaler that marshals data between COM apartments or different COM processes. Quando le chiamate tra codice gestito e non gestito sono effettuate all'interno dello stesso apartment COM, il gestore di marshalling di interoperabilità è il solo a essere coinvolto.When calling between managed and unmanaged code within the same COM apartment, the interop marshaler is the only marshaler involved. Quando si effettuano chiamate tra codice gestito e non gestito in un diverso apartment COM o processo, sono coinvolti sia il gestore di marshalling COM che quello di interoperabilità.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.

Server gestiti e client COMCOM Clients and Managed Servers

Un server gestito esportato con una libreria dei tipi registrata da Regasm.exe (strumento di registrazione di assembly) include una voce ThreadingModel del Registro di sistema impostata su 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. Questo valore indica che il server può essere attivato in un apartment a thread singolo (Single-Threaded Apartment, STA) o in un apartment con multithreading (Multithreaded Apartment, MTA).This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). L'oggetto server viene creato nello stesso apartment del chiamante, come indicato nella tabella riportata di seguito.The server object is created in the same apartment as its caller, as shown in the following table.

Client COMCOM client Server .NET.NET server Requisiti di marshallingMarshaling requirements
STASTA Both diventa STA.Both becomes STA. Marshalling nello stesso apartment.Same-apartment marshaling.
MTAMTA Both diventa MTA.Both becomes MTA. Marshalling nello stesso apartment.Same-apartment marshaling.

Poiché il client e il server si trovano nello stesso apartment, tutto il marshalling dei dati viene gestito automaticamente dal servizio di marshalling di interoperabilità.Because the client and server are in the same apartment, the interop marshaling service automatically handles all data marshaling. L'illustrazione seguente mostra il servizio di marshalling di interoperabilità tra gli heap gestiti e non gestiti all'interno dello stesso apartment di tipo COM.The following illustration shows the interop marshaling service operating between managed and unmanaged heaps within the same COM-style apartment.

Marshalling di interoperabilità tra heap gestiti e non gestitiInterop marshaling between managed and unmanaged heaps

Se si intende esportare un server gestito, ricordare che il client COM determina l'apartment del server.If you plan to export a managed server, be aware that the COM client determines the apartment of the server. Un server gestito chiamato da un client COM inizializzato in un MTA deve garantire la thread safety.A managed server called by a COM client initialized in an MTA must ensure thread safety.

Client gestiti e server COMManaged Clients and COM Servers

Benché l'impostazione predefinita per gli apartment dei client gestiti sia MTA, è possibile che essa venga modificata dal tipo di applicazione del client .NET.The default setting for managed client apartments is MTA; however, the application type of the .NET client can change the default setting. L'impostazione di apartment per i client di Visual Basic, ad esempio, è STA.For example, a Visual Basic client apartment setting is STA. Per esaminare e modificare l'impostazione di apartment di un client gestito, è possibile usare l'oggetto System.STAThreadAttribute, l'oggetto System.MTAThreadAttribute, la proprietà Thread.ApartmentState o la proprietà Page.AspCompatMode.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'autore del componente imposta l'affinità di thread di un server COM.The author of the component sets the thread affinity of a COM server. La tabella riportata di seguito mostra le combinazioni delle impostazioni di apartment per i client .NET e i server COM,The following table shows the combinations of apartment settings for .NET clients and COM servers. nonché i requisiti di marshalling per le diverse combinazioni.It also shows the resulting marshaling requirements for the combinations.

Client .NET.NET client Server COMCOM server Requisiti di marshallingMarshaling requirements
MTA (predefinito)MTA (default) MTAMTA

STASTA
Marshalling di interoperabilità.Interop marshaling.

Marshalling di interoperabilità e COM.Interop and COM marshaling.
STASTA MTAMTA

STASTA
Marshalling di interoperabilità e COM.Interop and COM marshaling.

Marshalling di interoperabilità.Interop marshaling.

Quando un client gestito e un server non gestito si trovano nello stesso apartment, tutto il marshalling dei dati viene eseguito dal servizio di marshalling di interoperabilità.When a managed client and unmanaged server are in the same apartment, the interop marshaling service handles all data marshaling. Tuttavia, quando il client e il server vengono inizializzati in apartment diversi, è necessario anche il marshalling COM.However, when client and server are initialized in different apartments, COM marshaling is also required. L'illustrazione riportata di seguito mostra gli elementi di una chiamata su diversi apartment.The following illustration shows the elements of a cross-apartment call.

Marshalling COMCOM marshaling

Per effettuare il marshalling su diversi apartment, procedere come indicato di seguito:For cross-apartment marshaling, you can do the following:

  • Accettare l'overhead del marshalling su diversi apartment, evidente solo quando sono presenti molte chiamate oltre il limite.Accept the overhead of the cross-apartment marshaling, which is noticeable only when there are many calls across the boundary. Registrare la libreria dei tipi del componente COM per consentire alle chiamate di attraversare correttamente il limite dell'apartment.You must register the type library of the COM component for calls to successfully cross the apartment boundary.

  • Modificare il thread principale impostando il thread del client su STA o MTA.Alter the main thread by setting the client thread to STA or MTA. Se il client C# chiama ad esempio molti componenti COM STA, è possibile evitare il marshalling su diversi apartment impostando il thread principale su 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.

    Nota

    Dopo avere impostato il thread di un client C# su STA, occorre effettuare il marshalling su diversi apartment per le chiamate ai componenti COM MTA.Once the thread of a C# client is set to STA, calls to MTA COM components will require cross-apartment marshaling.

Per istruzioni sulla selezione esplicita di un modello di apartment, vedere Threading gestito e non gestito.For instructions on explicitly selecting an apartment model, see Managed and Unmanaged Threading.

Torna all'inizioBack to top

Marshalling di chiamate remoteMarshaling Remote Calls

Come per il marshalling su diversi apartment, si ricorre al marshalling COM nelle chiamate tra il codice gestito e non gestito ogni volta che gli oggetti si trovano in processi separati.As with cross-apartment marshaling, COM marshaling is involved in each call between managed and unmanaged code whenever the objects reside in separate processes. Ad esempio:For example:

  • Un client COM che richiama un server gestito in un host remoto usa DCOM.A COM client that invokes a managed server on a remote host uses distributed COM (DCOM).

  • Un client gestito che richiama un server COM su un host remoto usa DCOM.A managed client that invokes a COM server on a remote host uses DCOM.

Nell'illustrazione seguente viene mostrato come il marshalling di interoperabilità e il marshalling COM forniscano canali di comunicazione attraverso i limiti dell'host e del processo.The following illustration shows how interop marshaling and COM marshaling provide communications channels across process and host boundaries.

Marshalling COMCOM marshaling

Mantenimento dell'identitàPreserving Identity

In Common Language Runtime l'identità di riferimenti gestiti e non gestiti viene mantenuta.The common language runtime preserves the identity of managed and unmanaged references. L'illustrazione riportata di seguito mostra il flusso di riferimenti non gestiti diretti (prima riga) e di riferimenti gestiti diretti (ultima riga) attraverso i limiti dell'host e del processo.The following illustration shows the flow of direct unmanaged references (top row) and direct managed references (bottom row) across process and host boundaries.

COM Callable Wrapper e Runtime Callable WrapperCOM callable wrapper and runtime callable wrapper

In questa illustrazione:In this illustration:

  • Un client non gestito recupera un riferimento a un oggetto COM da un oggetto gestito che lo recupera da un host remoto.An unmanaged client gets a reference to a COM object from a managed object that gets this reference from a remote host. Il meccanismo dei servizi remoti è DCOM.The remoting mechanism is DCOM.

  • Un client gestito recupera un riferimento a un oggetto gestito da un oggetto COM che lo recupera da un host remoto.A managed client gets a reference to a managed object from a COM object that gets this reference from a remote host. Il meccanismo dei servizi remoti è DCOM.The remoting mechanism is DCOM.

    Nota

    La libreria dei tipi esportata del server gestito deve essere registrata.The exported type library of the managed server must be registered.

Il numero di limiti di processo tra chiamante e chiamato non è rilevante. La creazione di riferimenti diretti è identica per le chiamate in-process e per quelle 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.

Servizi remoti gestitiManaged Remoting

Tra i servizi di runtime vengono inoltre forniti servizi remoti gestiti, utilizzabili per stabilire un canale di comunicazione tra gli oggetti gestiti attraverso i limiti dell'host e del processo.The runtime also provides managed remoting, which you can use to establish a communications channel between managed objects across process and host boundaries. I servizi remoti gestiti possono contenere un firewall tra i componenti di comunicazione, come mostrato nell'illustrazione riportata di seguito.Managed remoting can accommodate a firewall between the communicating components, as the following illustration shows.

SOAP o TcpChannelSOAP or TcpChannel
Chiamate remote attraverso i firewall mediante SOAP o la classe TcpChannelRemote calls across firewalls using SOAP or the TcpChannel class

È possibile incanalare tramite SOAP alcune chiamate non gestite, ad esempio quelle tra i componenti serviti e COM.Some unmanaged calls can be channeled through SOAP, such as the calls between serviced components and COM.

Torna all'inizioBack to top

TitoloTitle DESCRIZIONEDescription
Comportamento di marshalling predefinitoDefault Marshaling Behavior Descrive le regole usate dal servizio di marshalling di interoperabilità per effettuare il marshalling dei dati.Describes the rules that the interop marshaling service uses to marshal data.
Marshalling dei dati con platform invokeMarshaling Data with Platform Invoke Descrive come dichiarare i parametri dei metodi e passare gli argomenti alle funzioni esportate dalle librerie non gestite.Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.
Dati di marshalling con interoperabilità COMMarshaling Data with COM Interop Descrive come personalizzare i wrapper COM per modificare il comportamento di marshalling.Describes how to customize COM wrappers to alter marshaling behavior.
Procedura: Eseguire la migrazione di codice gestito da DCOM a WCFHow to: Migrate Managed-Code DCOM to WCF Descrive come eseguire la migrazione da DCOM a WCF.Describes how to migrate from DCOM to WCF.
Procedura: Eseguire il mapping di HRESULT ed eccezioniHow to: Map HRESULTs and Exceptions Descrive come mappare le eccezioni personalizzate agli oggetti HRESULT e illustra le relazioni di mapping tra ogni oggetto HRESULT e la classe di eccezioni corrispondente in .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.
Interoperabilità tramite tipi genericiInteroperating Using Generic Types Descrive le azioni supportate quando si usano tipi generici per l'interoperabilità COM.Describes which actions are supported when using generic types for COM interoperability.
Interoperabilità con codice non gestitoInteroperating with Unmanaged Code Descrive i servizi di interoperabilità forniti da Common Language Runtime.Describes interoperability services provided by the common language runtime.
Interoperabilità COM avanzataAdvanced COM Interoperability Contiene collegamenti per accedere ad altre informazioni sull'inclusione di componenti COM nell'applicazione .NET Framework.Provides links to more information about incorporating COM components into your .NET Framework application.
Considerazioni di progettazione per l'interoperabilitàDesign Considerations for Interoperation Fornisce suggerimenti per la scrittura di componenti COM integrati.Provides tips for writing integrated COM components.

Torna all'inizioBack to top

RiferimentiReference

System.Runtime.InteropServices

Torna all'inizioBack to top