相互運用マーシャリングInterop Marshaling

相互運用マーシャリングは、メソッド引数と戻り値によって、呼び出し中にマネージド メモリとアンマネージド メモリの間でデータを渡す方法を制御します。Interop marshaling governs how data is passed in method arguments and return values between managed and unmanaged memory during calls. 相互運用マーシャリングは、共通言語ランタイムのマーシャリング サービスによって実行される、ランタイム アクティビティです。Interop marshaling is a run-time activity performed by the common language runtime's marshaling service.

ほとんどのデータ型は、マネージドとアンマネージドの両方のメモリに共通の表現があります。Most data types have common representations in both managed and unmanaged memory. 相互運用マーシャラーは、これらの型を処理します。The interop marshaler handles these types for you. その他の型は、あいまいな型であるか、マネージド メモリでまったく表現されていない型である可能性があります。Other types can be ambiguous or not represented at all in managed memory.

あいまいな型は、複数のアンマネージド表現が 1 つのマネージド型にマップされていたり、配列のサイズなどの型情報が欠落していたりします。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. あいまいな型の場合、マーシャラーは、既定の表現と複数の表現が存在するときのための代替表現とを提供します。For ambiguous types, the marshaler provides a default representation and alternative representations where multiple representations exist. あいまいな型をマーシャリングする方法について、マーシャラーに明示的な指示を与えることができます。You can supply explicit instructions to the marshaler on how it is to marshal an ambiguous type.

この概要は、次のセクションで構成されています。This overview contains the following sections:

プラットフォーム呼び出しと COM 相互運用のモデルPlatform Invoke and COM Interop Models

共通言語ランタイムは、アンマネージ コードと相互運用するために、次の 2 つのメカニズムを提供します。The common language runtime provides two mechanisms for interoperating with unmanaged code:

  • プラットフォーム呼び出しにより、マネージド コードは、アンマネージド ライブラリからエクスポートされた関数を呼び出すことができます。Platform invoke, which enables managed code to call functions exported from an unmanaged library.

  • COM 相互運用により、マネージド コードは、インターフェイスを介してコンポーネント オブジェクト モデル (COM) オブジェクトと対話できます。COM interop, which enables managed code to interact with Component Object Model (COM) objects through interfaces.

プラットフォーム呼び出しと COM 相互運用はどちらも、必要な場合に、相互運用マーシャリングを使用して呼び出し元と呼び出し先との間でメソッド引数を正確に移動します。Both platform invoke and COM interop use interop marshaling to accurately move method arguments between caller and callee and back, if required. 次の図が示すように、プラットフォーム呼び出しメソッドの呼び出しはマネージド コードからアンマネージド コードにフローして、コールバック関数が関係していない限りその逆の方向にはフローしません。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. プラットフォーム呼び出しの呼び出しはマネージド コードからアンマネージド コードにのみフローしますが、データは入出力パラメーターとして双方向にフローできます。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 相互運用のメソッド呼び出しは、どちらの方向にもフローできます。COM interop method calls can flow in either direction.

プラットフォーム呼び出しPlatform invoke

最下位のレベルでは、どちらのメカニズムも同じ相互運用マーシャリング サービスを使用します。ただし、特定のデータ型は、COM 相互運用またはプラットフォーム呼び出しでのみサポートされます。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. 詳しくは、「既定のマーシャリング動作」を参照してください。For details, see Default Marshaling Behavior.

ページのトップへBack to top

マーシャリングと COM アパートメントMarshaling and COM Apartments

相互運用マーシャラーは、共通言語ランタイム ヒープとアンマネージ ヒープの間でデータをマーシャリングします。The interop marshaler marshals data between the common language runtime heap and the unmanaged heap. 呼び出し元と呼び出し先がデータの同じインスタンスで機能できないときには常に、マーシャリングが生じます。Marshaling occurs whenever the caller and callee cannot operate on the same instance of data. 相互運用マーシャラーにより、呼び出し元と呼び出し先がデータの独自のコピーを持っている場合でも、見かけ上は同じデータに対して機能しているようにすることが可能になります。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 には、COM アパートメント間や異なる COM プロセス間でデータをマーシャリングするマーシャラーもあります。COM also has a marshaler that marshals data between COM apartments or different COM processes. 同じ COM アパートメント内でマネージド コードとアンマネージド コード間の呼び出しをする場合は、相互運用マーシャラーが関連する唯一のマーシャラーとなります。When calling between managed and unmanaged code within the same COM apartment, the interop marshaler is the only marshaler involved. 異なる COM アパートメントや異なるプロセス内でマネージド コードとアンマネージド コード間の呼び出しをする場合は、相互運用マーシャラーと COM マーシャラーの両方が関連します。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 クライアントとマネージド サーバーCOM Clients and Managed Servers

Regasm.exe (アセンブリ登録ツール) によって登録されたタイプ ライブラリのあるエクスポートされたマネージド サーバーでは、ThreadingModel レジストリ エントリが 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. この値は、シングルスレッド アパートメント (STA) またはマルチスレッド アパートメント (MTA) で、サーバーをアクティブ化できることを示します。This value indicates that the server can be activated in a single-threaded apartment (STA) or a multithreaded apartment (MTA). 次の表に示すように、サーバー オブジェクトは、その呼び出し元と同じアパートメント内に作成されます。The server object is created in the same apartment as its caller, as shown in the following table.

COM クライアントCOM client .NET サーバー.NET server マーシャリングの要件Marshaling requirements
STASTA Both は STA になります。Both becomes STA. 同じアパートメントでのマーシャリング。Same-apartment marshaling.
MTAMTA Both は MTA になります。Both becomes MTA. 同じアパートメントでのマーシャリング。Same-apartment marshaling.

クライアントとサーバーが同じアパートメント内にあるため、相互運用マーシャリング サービスはすべてのデータのマーシャリングを自動的に処理します。Because the client and server are in the same apartment, the interop marshaling service automatically handles all data marshaling. 次の図は、同じ COM スタイル アパートメント内のマネージド ヒープとアンマネージド ヒープの間で機能している、相互運用マーシャリング サービスを示しています。The following illustration shows the interop marshaling service operating between managed and unmanaged heaps within the same COM-style apartment.

マネージド ヒープとアンマネージド ヒープ間の相互運用マーシャリングInterop marshaling between managed and unmanaged heaps

マネージド サーバーをエクスポートする予定の場合は、サーバーのアパートメントが COM クライアントによって決定されることに注意してください。If you plan to export a managed server, be aware that the COM client determines the apartment of the server. MTA 内で初期化された COM クライアントから呼び出されるマネージド サーバーは、スレッド セーフを確保する必要があります。A managed server called by a COM client initialized in an MTA must ensure thread safety.

マネージド クライアントと COM サーバーManaged Clients and COM Servers

マネージド クライアントのアパートメントの既定の設定は MTA です。ただし、.NET クライアントのアプリケーションの種類によっては、既定の設定が変更されることがあります。The default setting for managed client apartments is MTA; however, the application type of the .NET client can change the default setting. たとえば、Visual Basic クライアント アパートメントの設定は STA です。For example, a Visual Basic client apartment setting is STA. System.STAThreadAttributeSystem.MTAThreadAttributeThread.ApartmentState プロパティ、または 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.

コンポーネントの作成者は、COM サーバーのスレッド アフィニティを設定します。The author of the component sets the thread affinity of a COM server. 次の表は、.NET クライアントと COM サーバーのアパートメント設定の組み合わせを示しています。The following table shows the combinations of apartment settings for .NET clients and COM servers. また、結果として生じる、組み合わせのためのマーシャリング要件も示しています。It also shows the resulting marshaling requirements for the combinations.

.NET クライアント.NET client COM サーバーCOM server マーシャリングの要件Marshaling requirements
MTA (既定)MTA (default) MTAMTA

STASTA
相互運用マーシャリング。Interop marshaling.

相互運用と COM マーシャリング。Interop and COM marshaling.
STASTA MTAMTA

STASTA
相互運用と COM マーシャリング。Interop and COM marshaling.

相互運用マーシャリング。Interop marshaling.

マネージド クライアントとアンマネージド サーバーが同じアパートメント内にあるとき、相互運用マーシャリング サービスはすべてのデータのマーシャリングを処理します。When a managed client and unmanaged server are in the same apartment, the interop marshaling service handles all data marshaling. ただし、クライアントとサーバーが異なるアパートメント内で初期化される場合は、COM マーシャリングも必要となります。However, when client and server are initialized in different apartments, COM marshaling is also required. 次の図は、アパートメント間の呼び出しの要素を示しています。The following illustration shows the elements of a cross-apartment call.

COM マーシャリングCOM marshaling

アパートメント間のマーシャリングでは、次の操作を実行できます。For cross-apartment marshaling, you can do the following:

  • アパートメント間のマーシャリングのオーバーヘッドを受け入れます。これは、境界を越える呼び出しが多くがある場合にのみ認識されます。Accept the overhead of the cross-apartment marshaling, which is noticeable only when there are many calls across the boundary. 呼び出しがアパートメントの境界を正常に越えるようにするためには、COM コンポーネントのタイプ ライブラリを登録する必要があります。You must register the type library of the COM component for calls to successfully cross the apartment boundary.

  • クライアント スレッドを STA または MTA に設定して、メイン スレッドを変更します。Alter the main thread by setting the client thread to STA or MTA. たとえば、C# クライアントが多くの STA COM コンポーネントを呼び出す場合には、メイン スレッドを 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.

    注意

    C# クライアントのスレッドを STA に設定すると、MTA COM コンポーネントへの呼び出しにはアパートメント間のマーシャリングが必要となります。Once the thread of a C# client is set to STA, calls to MTA COM components will require cross-apartment marshaling.

アパートメント モデルを明示的に選択する方法については、「マネージドとアンマネージド スレッド」を参照してください。For instructions on explicitly selecting an apartment model, see Managed and Unmanaged Threading.

ページのトップへBack to top

リモートの呼び出しのマーシャリングMarshaling Remote Calls

アパートメント間のマーシャリングの場合と同様に、COM マーシャリングは、オブジェクトが別個のプロセス内に存在するときには常に、マネージド コードとアンマネージド コード間の各呼び出しに関与します。As with cross-apartment marshaling, COM marshaling is involved in each call between managed and unmanaged code whenever the objects reside in separate processes. 次に例を示します。For example:

  • リモート ホスト上のマネージド サーバーを呼び出す COM クライアントは、分散 COM (DCOM) を使用します。A COM client that invokes a managed server on a remote host uses distributed COM (DCOM).

  • リモート ホスト上の COM サーバーを呼び出すマネージド クライアントは、DCOM を使用します。A managed client that invokes a COM server on a remote host uses DCOM.

次の図は、相互運用マーシャリングと COM マーシャリングが、プロセスとホストの境界を越えて通信チャネルを提供する方法を示しています。The following illustration shows how interop marshaling and COM marshaling provide communications channels across process and host boundaries.

COM マーシャリングCOM marshaling

ID の保持Preserving Identity

共通言語ランタイムは、マネージド参照とアンマネージド参照の ID を保持します。The common language runtime preserves the identity of managed and unmanaged references. 次の図は、プロセスとホストの境界を越えている、直接アンマネージド参照 (上の行) と直接マネージド参照 (下の行) のフローを示しています。The following illustration shows the flow of direct unmanaged references (top row) and direct managed references (bottom row) across process and host boundaries.

COM 呼び出し可能ラッパーとランタイム呼び出し可能ラッパーCOM callable wrapper and runtime callable wrapper

この図では:In this illustration:

  • アンマネージド クライアントは、COM オブジェクトへの参照を、リモート ホストからその参照を取得するマネージド オブジェクトから取得します。An unmanaged client gets a reference to a COM object from a managed object that gets this reference from a remote host. リモート処理のメカニズムは DCOM です。The remoting mechanism is DCOM.

  • マネージド クライアントは、マネージド オブジェクトへの参照を、リモート ホストからその参照を取得している COM オブジェクトから取得します。A managed client gets a reference to a managed object from a COM object that gets this reference from a remote host. リモート処理のメカニズムは DCOM です。The remoting mechanism is DCOM.

    注意

    マネージド サーバーのエクスポート済みタイプ ライブラリを登録する必要があります。The exported type library of the managed server must be registered.

呼び出し元と呼び出し先の間のプロセス境界の数は関連していません。同じ直接参照が、イン プロセスおよびアウト プロセスの呼び出しで発生します。The number of process boundaries between caller and callee is irrelevant; the same direct referencing occurs for in-process and out-of-process calls.

マネージド リモート処理Managed Remoting

ランタイムは、プロセスとホストの境界を越えてマネージド オブジェクト間に通信チャネルを確立するために使用できる、マネージド リモート処理も提供します。The runtime also provides managed remoting, which you can use to establish a communications channel between managed objects across process and host boundaries. 次の図に示すように、マネージド リモート処理は、通信コンポーネントの間のファイアウォールに対応できます。Managed remoting can accommodate a firewall between the communicating components, as the following illustration shows.

SOAP または TcpChannelSOAP or TcpChannel
SOAP または TcpChannel クラスを使用するファイアウォールを越えたリモート呼び出しRemote calls across firewalls using SOAP or the TcpChannel class

サービス コンポーネントと COM の間の呼び出しなど、一部のアンマネージド呼び出しは SOAP を介して伝達できます。Some unmanaged calls can be channeled through SOAP, such as the calls between serviced components and COM.

ページのトップへBack to top

TitleTitle 説明Description
既定のマーシャリング動作Default Marshaling Behavior 相互運用マーシャリング サービスがデータのマーシャリングに使用する規則について説明します。Describes the rules that the interop marshaling service uses to marshal data.
プラットフォーム呼び出しによるデータのマーシャリングMarshaling Data with Platform Invoke メソッドのパラメーターを宣言してアンマネージ ライブラリによってエクスポートされた関数に引数を渡す方法について説明します。Describes how to declare method parameters and pass arguments to functions exported by unmanaged libraries.
COM 相互運用機能によるデータのマーシャリングMarshaling Data with COM Interop COM ラッパーをカスタマイズしてマーシャリング動作を変更する方法について説明します。Describes how to customize COM wrappers to alter marshaling behavior.
方法: マネージド コード DCOM を WCF に移行するHow to: Migrate Managed-Code DCOM to WCF DCOM から WCF に移行する方法について説明します。Describes how to migrate from DCOM to WCF.
方法: HRESULT に例外を割り当てるHow to: Map HRESULTs and Exceptions HRESULT にカスタム例外をマップする方法について説明し、各 HRESULT から .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.
ジェネリック型を使用する相互運用Interoperating Using Generic Types COM 相互運用性のジェネリック型を使用するとき、どのアクションがサポートされるかについて説明します。Describes which actions are supported when using generic types for COM interoperability.
アンマネージ コードとの相互運用Interoperating with Unmanaged Code 共通言語ランタイムが提供する相互運用サービスについて説明します。Describes interoperability services provided by the common language runtime.
高度な COM 相互運用性Advanced COM Interoperability .NET Framework アプリケーションに COM コンポーネントを組み込む方法についての詳細情報へのリンクを示します。Provides links to more information about incorporating COM components into your .NET Framework application.
相互運用のためのデザインの考慮事項Design Considerations for Interoperation 統合 COM コンポーネントを記述するためのヒントを示します。Provides tips for writing integrated COM components.

ページのトップへBack to top

関連項目Reference

System.Runtime.InteropServices

ページのトップへBack to top