Interop-MarshallingInterop Marshaling

Das Interop-Marshalling steuert, wie Daten in Methodenargumenten und Rückgabewerten zwischen verwaltetem und nicht verwaltetem Speicher während Aufrufen übergeben werden.Interop marshaling governs how data is passed in method arguments and return values between managed and unmanaged memory during calls. Interop-Marshalling ist eine Laufzeitaktivität, die vom Marshallingdienst der Common Language Runtime ausgeführt wird.Interop marshaling is a run-time activity performed by the common language runtime's marshaling service.

Die meisten Datentypen verfügen über gemeinsame Darstellungen im verwalteten und nicht verwalteten Speicher.Most data types have common representations in both managed and unmanaged memory. Der Interop-Marshaller behandelt diese Typen für Sie.The interop marshaler handles these types for you. Andere Typen können im verwalteten Speicher nicht eindeutig oder gar nicht dargestellt sein.Other types can be ambiguous or not represented at all in managed memory.

Ein nicht eindeutiger Typ kann entweder mehrere nicht verwaltete Darstellungen besitzen, die einem einzelnen verwalteten Typ zugeordnet werden, oder ihm können Typinformationen fehlen, wie z. B. die Größe eines Arrays.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. Für nicht eindeutige Typen stellt der Marshaller eine Standarddarstellung und alternative Darstellungen, wenn mehrere Darstellungen vorhanden sind, bereit.For ambiguous types, the marshaler provides a default representation and alternative representations where multiple representations exist. Sie können explizite Anweisungen für den Marshaller angeben, wie ein nicht eindeutiger Typ zu marshallen ist.You can supply explicit instructions to the marshaler on how it is to marshal an ambiguous type.

Plattformaufruf und COM-Interop-ModellePlatform Invoke and COM Interop Models

Die Common Language Runtime stellt zwei Mechanismen für die Interoperation mit nicht verwaltetem Code bereit:The common language runtime provides two mechanisms for interoperating with unmanaged code:

  • Plattformaufruf, wodurch verwalteter Code Funktionen aufrufen kann, die aus einer nicht verwalteten Bibliothek exportiert wurden.Platform invoke, which enables managed code to call functions exported from an unmanaged library.
  • COM-Interop, wodurch verwalteter Code über Schnittstellen mit COM-Objekten (Component Object Model) interagieren kann.COM interop, which enables managed code to interact with Component Object Model (COM) objects through interfaces.

Sowohl Plattformaufruf als auch COM-Interop verwenden Interop-Marshalling, um, falls erforderlich, Methodenargumente präzise zwischen Aufrufer und Aufgerufenem und umgekehrt zu verschieben.Both platform invoke and COM interop use interop marshaling to accurately move method arguments between caller and callee and back, if required. Wie die folgende Abbildung zeigt, fließt ein Methodenaufruf eines Plattformaufrufs vom verwalteten zum nicht verwalteten Code und niemals umgekehrt, es sei denn, dass Rückruffunktionen beteiligt sind.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. Obwohl Plattformaufrufe nur vom verwalteten zum nicht verwalteten Code fließen können, können Daten als Ein-oder Ausgabeparameter in beide Richtungen fließen.Even though platform invoke calls can flow only from managed to unmanaged code, data can flow in both directions as input or output parameters. COM-Interop-Methodenaufrufe können in beide Richtungen fließen.COM interop method calls can flow in either direction.

PlattformaufrufPlatform invoke

Auf der niedrigsten Ebene verwenden beide Mechanismen denselben Interop-Marshallingdienst. Bestimmte Datentypen werden aber ausschließlich nur von COM-Interop oder von Plattformaufrufen unterstützt.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. Details hierzu finden Sie unter Default Marshaling Behavior (Standardmäßiges Marshallingverhalten).For details, see Default Marshaling Behavior.

Marshalling und COM-ApartmentsMarshaling and COM Apartments

Der Interop-Marshaller marshallt Daten zwischen dem Common Language Runtime-Heap und dem nicht verwalteten Heap.The interop marshaler marshals data between the common language runtime heap and the unmanaged heap. Marshalling tritt auf, wenn der Aufrufer und der Aufgerufene nicht an derselben Instanz von Daten arbeiten können.Marshaling occurs whenever the caller and callee cannot operate on the same instance of data. Der Interop-Marshaller ermöglicht es dem Aufrufer und dem Aufgerufenen, scheinbar an denselben Daten zu arbeiten, auch wenn sie jeweils eine eigenen Kopie der Daten besitzen.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 verfügt ebenfalls über einen Marshaller, der Daten zwischen COM-Apartments oder verschiedenen COM-Prozessen marshallt.COM also has a marshaler that marshals data between COM apartments or different COM processes. Beim Aufrufen zwischen verwaltetem und nicht verwaltetem Code innerhalb desselben COM-Apartments ist der Interop-Marshaller als einziger Marschaller beteiligt.When calling between managed and unmanaged code within the same COM apartment, the interop marshaler is the only marshaler involved. Beim Aufrufen zwischen verwaltetem und nicht verwaltetem Code in einem anderen COM-Apartment oder einem anderen Prozess sind sowohl der Interop-Marshaller als auch der COM-Marschaller beteiligt.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.

COM-Clients und verwaltete ServerCOM Clients and Managed Servers

Ein exportierter verwalteter Server mit einer vom Assembly Registration-Tool (Regasm.exe) registrierten Typbibliothek besitzt einen auf Both festgelegten ThreadingModel-Registrierungseintrag.An exported managed server with a type library registered by the Regasm.exe (Assembly Registration Tool) has a ThreadingModel registry entry set to Both. Dieser Wert gibt an, dass der Server in einem Singlethread-Apartment (STA) oder einem Multithread-Apartment (MTA) aktiviert werden kann.This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). Wie in der folgenden Tabelle dargestellt, wird das Serverobjekt im selben Apartment wie sein Aufrufer erstellt.The server object is created in the same apartment as its caller, as shown in the following table:

COM-ClientCOM client .NET-Server.NET server MarshallinganforderungenMarshaling requirements
STASTA Both wird STA.Both becomes STA. Marshalling im selben Apartment.Same-apartment marshaling.
MTAMTA Both wird MTA.Both becomes MTA. Marshalling im selben Apartment.Same-apartment marshaling.

Da Client und Server im selben Apartment sind, verarbeitet der Interop-Marshallingdienst automatisch das gesamte Daten-Marshalling.Because the client and server are in the same apartment, the interop marshaling service automatically handles all data marshaling. Die folgende Abbildung zeigt, wie der Interop-Marshallingdienst zwischen verwalteten und nicht verwalteten Heaps innerhalb desselben COM-artigen Apartments agiert.The following illustration shows the interop marshaling service operating between managed and unmanaged heaps within the same COM-style apartment.

Interop-Marshalling zwischen verwalteten und nicht verwalteten HeapsInterop marshaling between managed and unmanaged heaps

Wenn Sie planen, einen verwalteten Server zu exportieren, sollten Sie daran denken, dass der COM-Client das Apartment des Servers bestimmt.If you plan to export a managed server, be aware that the COM client determines the apartment of the server. Ein von einem COM-Client aufgerufener und in einem MTA initialisierter verwalteter Server muss Threadsicherheit sicherstellen.A managed server called by a COM client initialized in an MTA must ensure thread safety.

Verwaltete Clients und COM-ServerManaged Clients and COM Servers

Die Standardeinstellung für verwaltete Clientapartments ist MTA. Der Anwendungstyp des .NET-Clients kann jedoch die Standardeinstellung ändern.The default setting for managed client apartments is MTA; however, the application type of the .NET client can change the default setting. Angenommen, eine Visual Basic-Clientapartmenteinstellung ist STA.For example, a Visual Basic client apartment setting is STA. Sie können eine der Eigenschaften System.STAThreadAttribute, System.MTAThreadAttribute, Thread.ApartmentState oder die Eigenschaft Page.AspCompatMode verwenden, um die Apartmenteinstellung eines verwalteten Clients zu untersuchen und zu ändern.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.

Der Autor der Komponente legt die Threadaffinität eines COM-Servers fest.The author of the component sets the thread affinity of a COM server. Die folgende Tabelle zeigt die Kombinationen von Apartmenteinstellungen für .NET-Clients und COM-Server.The following table shows the combinations of apartment settings for .NET clients and COM servers. Sie zeigt außerdem die resultierenden Marshallinganforderungen für die Kombinationen.It also shows the resulting marshaling requirements for the combinations.

.NET-Client.NET client COM-ServerCOM server MarshallinganforderungenMarshaling requirements
MTA (Standard)MTA (default) MTAMTA

STASTA
Interop-MarshallingInterop marshaling.

Interop- und COM-MarshallingInterop and COM marshaling.
STASTA MTAMTA

STASTA
Interop- und COM-MarshallingInterop and COM marshaling.

Interop-MarshallingInterop marshaling.

Wenn ein verwalteter Client und ein nicht verwalteter Server im selben Apartment sind, verarbeitet der Interop-Marshallingdienst das gesamte Daten-Marshalling.When a managed client and unmanaged server are in the same apartment, the interop marshaling service handles all data marshaling. Wenn Client und Server in unterschiedlichen Apartments initialisiert werden, ist jedoch auch COM-Marshalling erforderlich.However, when client and server are initialized in different apartments, COM marshaling is also required. Die folgende Abbildung zeigt die Elemente eines apartmentübergreifenden Aufrufs:The following illustration shows the elements of a cross-apartment call:

COM-MarshallingCOM marshaling

Für apartmentübergreifendes Marshalling können Sie Folgendes tun:For cross-apartment marshaling, you can do the following:

  • Akzeptieren Sie den Mehraufwand für das apartmentübergreifende Marshalling, der sich nur bemerkbar macht, wenn viele Aufrufe vorhanden sind, die die Apartmentgrenze überschreiten.Accept the overhead of the cross-apartment marshaling, which is noticeable only when there are many calls across the boundary. Sie müssen die Typbibliothek der COM-Komponente registrieren, damit Aufrufe erfolgreich die Apartmentgrenze überschreiten können.You must register the type library of the COM component for calls to successfully cross the apartment boundary.

  • Ändern Sie den Hauptthread, indem den Clientthread auf STA oder MTA festlegen.Alter the main thread by setting the client thread to STA or MTA. Wenn z. B. Ihr C#-Client viele STA-COM-Komponenten aufruft, können Sie apartmentübergreifendes Marshalling vermeiden, indem Sie den Hauptthread auf STA festlegen.For example, if your C# client calls many STA COM components, you can avoid cross-apartment marshaling by setting the main thread to STA.

    Hinweis

    Sobald der Thread eines C#-Clients auf STA festgelegt ist, erfordern Aufrufe von MTA-COM-Komponenten apartmentübergreifendes Marshalling.Once the thread of a C# client is set to STA, calls to MTA COM components will require cross-apartment marshaling.

Anleitungen zum expliziten Auswählen eines Apartmentmodells finden Sie unter Managed and Unmanaged Threading (Verwaltetes und nicht verwaltetes Threading).For instructions on explicitly selecting an apartment model, see Managed and Unmanaged Threading.

Marshalling von RemoteaufrufenMarshaling Remote Calls

Wie bei apartmentübergreifendem Marshalling ist bei jedem Aufruf zwischen verwaltetem und nicht verwaltetem Code COM-Marshalling beteiligt, wenn sich die Objekte in verschiedenen Prozessen befinden.As with cross-apartment marshaling, COM marshaling is involved in each call between managed and unmanaged code whenever the objects reside in separate processes. Zum Beispiel:For example:

  • Ein COM-Client, der einen verwalteten Server auf einem Remotehost aufruft, verwendet verteiltes COM (DCOM).A COM client that invokes a managed server on a remote host uses distributed COM (DCOM).
  • Ein verwalteter Client, der einen COM-Server auf einem Remotehost aufruft, verwendet DCOM.A managed client that invokes a COM server on a remote host uses DCOM.

Die folgende Abbildung zeigt, wie Interop-Marshalling und COM-Marshalling Kommunikationskanäle über Prozess- und Hostgrenzen hinweg bereitstellen:The following illustration shows how interop marshaling and COM marshaling provide communications channels across process and host boundaries:

COM-MarshallingCOM marshaling

Beibehalten der IdentitätPreserving Identity

Die Common Language Runtime behält die Identität verwalteter und nicht verwalteter Verweise bei.The common language runtime preserves the identity of managed and unmanaged references. Die folgende Abbildung zeigt den Fluss direkter, nicht verwalteter Verweise (obere Zeile) und direkter, verwalteter Verweise (untere Zeile) über Prozess- und Hostgrenzen hinweg.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 und Runtime Callable WrapperCOM callable wrapper and runtime callable wrapper

In dieser Abbildung:In this illustration:

  • Ein nicht verwalteter Client ruft einen Verweis auf ein COM-Objekt von einem verwalteten Objekt ab, das diesen Verweis von einem Remotehost abruft.An unmanaged client gets a reference to a COM object from a managed object that gets this reference from a remote host. Der Remotingmechanismus ist DCOM.The remoting mechanism is DCOM.

  • Ein verwalteter Client ruft einen Verweis auf ein verwaltetes Objekt von einem COM-Objekt ab, das diesen Verweis von einem Remotehost abruft.A managed client gets a reference to a managed object from a COM object that gets this reference from a remote host. Der Remotingmechanismus ist DCOM.The remoting mechanism is DCOM.

    Hinweis

    Die exportierte Typbibliothek des verwalteten Servers muss registriert sein.The exported type library of the managed server must be registered.

Die Anzahl der Prozessgrenzen zwischen Aufrufer und Aufgerufenem ist irrelevant. Dieselbe direkte Referenzierung tritt bei prozessinternen und -externen Aufrufen auf.The number of process boundaries between caller and callee is irrelevant; the same direct referencing occurs for in-process and out-of-process calls.

Verwaltetes RemotingManaged Remoting

Die Laufzeit bietet auch verwaltetes Remoting, das Sie zum Einrichten eines Kommunikationskanals zwischen verwalteten Objekten über Prozess- und Hostgrenzen hinweg verwenden können.The runtime also provides managed remoting, which you can use to establish a communications channel between managed objects across process and host boundaries. Das verwaltete Remoting kann eine Firewall zwischen den kommunizierenden Komponenten unterstützen. Dies wird in der folgenden Abbildung gezeigt.Managed remoting can accommodate a firewall between the communicating components, as the following illustration shows:

SOAP oder TcpChannel Firewallübergreifende Remoteaufrufe mit SOAP oder der TcpChannel-KlasseSOAP or TcpChannel Remote calls across firewalls using SOAP or the TcpChannel class

Einige nicht verwaltete Aufrufe können durch SOAP geleitet werden, z.B. die Aufrufe zwischen Serviced Components und COM.Some unmanaged calls can be channeled through SOAP, such as the calls between serviced components and COM.

TitelTitle BeschreibungDescription
Default Marshaling Behavior (Standardmäßiges Marshallingverhalten)Default Marshaling Behavior Beschreibt die Regeln, die der Interop-Marshallingdienst für das Marshalling von Daten verwendet.Describes the rules that the interop marshaling service uses to marshal data.
Marshallen von Daten mit PlattformaufrufMarshaling Data with Platform Invoke Beschreibt, wie Sie Methodenparameter deklarieren und Argumente an Funktionen übergeben, die aus nicht verwalteten Bibliotheken exportiert wurden.Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.
Marshaling Data with COM Interop (Marshallen von Daten mit COM-Interop)Marshaling Data with COM Interop Beschreibt, wie Sie COM-Wrapper anpassen, um das Marshallingverhalten zu ändern.Describes how to customize COM wrappers to alter marshaling behavior.
How to: Migrieren von verwaltetem Code DCOM zu WCFHow to: Migrate Managed-Code DCOM to WCF Beschreibt, wie Sie von DCOM zu WCF migrieren.Describes how to migrate from DCOM to WCF.
How to: Zuordnen von HRESULT-Werten und AusnahmenHow to: Map HRESULTs and Exceptions Beschreibt, wie Sie benutzerdefinierte Ausnahmen zu HRESULTs zuordnen, und stellt die vollständige Zuordnung von jedem HRESULT zu seiner vergleichbaren Ausnahmeklasse in .NET Framework bereit.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.
Interoperation mit generischen TypenInteroperating Using Generic Types Beschreibt, welche Aktionen bei Verwendung von generischen Typen für COM-Interoperabilität unterstützt werden.Describes which actions are supported when using generic types for COM interoperability.
Interoperabilität mit nicht verwaltetem CodeInteroperating with Unmanaged Code Beschreibt Interoperabilitätsdienste, die von der Common Language Runtime bereitgestellt werden.Describes interoperability services provided by the common language runtime.
Erweiterte COM-InteroperabilitätAdvanced COM Interoperability Stellt Links zu weiteren Informationen über das Einbinden von COM-Komponenten in Ihre .NET Framework-Anwendung bereit.Provides links to more information about incorporating COM components into your .NET Framework application.
Entwurfsüberlegungen für die InteroperationDesign Considerations for Interoperation Bietet Tipps zum Schreiben integrierter COM-Komponenten.Provides tips for writing integrated COM components.

ReferenzReference

System.Runtime.InteropServices