ラッパーを手動で作成する方法

Note

このガイダンスは、.NET Framework に固有です。 最新.NET COM 相互運用機能の場合は、ソースによって生成された COM 相互運用機能または System.Runtime.InteropServices.ComWrappers API を使用します。 詳細については、 COM 相互運用の概要COM ソースの生成に関するページを参照してください。

マネージド ソース コードで COM 型を手動で宣言する場合は、既存のインターフェイス定義言語 (IDL) ファイルまたはタイプ ライブラリを使用することをお勧めします。 IDL ファイルがない場合、またはタイプ ライブラリ ファイルを生成できない場合は、マネージド宣言を作成し、結果のアセンブリをタイプ ライブラリにエクスポートすることで、COM 型をシミュレートできます。

マネージド ソースから COM 型をシミュレートする

  1. 共通言語仕様 (CLS) に準拠している言語で型を宣言し、ファイルをコンパイルします。

  2. タイプ ライブラリ エクスポーター (Tlbexp.exe) を使用して、型を含むアセンブリをエクスポートします。

  3. COM 指向のマネージド型を宣言するための基礎として、エクスポートされた COM タイプ ライブラリを使用します。

ランタイム呼び出し可能ラッパー (RCW) を作成する

  1. IDL ファイルまたはタイプ ライブラリ ファイルがあると仮定して、カスタム RCW に含めるクラスとインターフェイスを決定します。 アプリケーションで直接または間接的に使用しない型は除外できます。

  2. CLS 準拠言語でソース ファイルを作成し、型を宣言します。 インポート変換プロセスの詳細については、「 タイプ ライブラリからアセンブリへの変換の概要 」を参照してください。 実際には、カスタム RCW を作成するときに、 タイプ ライブラリ インポーター (Tlbimp.exe) によって提供される型変換アクティビティを手動で実行します。 次のセクションの例では、IDL またはタイプ ライブラリ ファイルの型と、C# コード内の対応する型を示します。

  3. 宣言が完了したら、他のマネージド ソース コードをコンパイルするときにファイルをコンパイルします。

  4. Tlbimp.exeでインポートされた型と同様に、コードに直接追加できる追加情報が必要なものもあります。 詳細については、「 方法: 相互運用機能アセンブリを編集する」を参照してください。

Example

次のコードは、IDL の ISATest インターフェイスと SATest クラスの例と、C# ソース コードの対応する型を示しています。

IDL またはタイプ ライブラリ ファイル

 [
object,
uuid(40A8C65D-2448-447A-B786-64682CBEF133),
dual,
helpstring("ISATest Interface"),
pointer_default(unique)
 ]
interface ISATest : IDispatch
 {
[id(1), helpstring("method InSArray")]
HRESULT InSArray([in] SAFEARRAY(int) *ppsa, [out,retval] int *pSum);
 };
 [
uuid(116CCA1E-7E39-4515-9849-90790DA6431E),
helpstring("SATest Class")
 ]
coclass SATest
 {
  [default] interface ISATest;
 };

マネージド ソース コード内のラッパー

using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

[assembly:Guid("E4A992B8-6F5C-442C-96E7-C4778924C753")]
[assembly:ImportedFromTypeLib("SAServerLib")]
namespace SAServer
{
 [ComImport]
 [Guid("40A8C65D-2448-447A-B786-64682CBEF133")]
 [TypeLibType(TypeLibTypeFlags.FLicensed)]
 public interface ISATest
 {
  [DispId(1)]
  //[MethodImpl(MethodImplOptions.InternalCall,
  // MethodCodeType=MethodCodeType.Runtime)]
  int InSArray( [MarshalAs(UnmanagedType.SafeArray,
      SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
 }
 [ComImport]
 [Guid("116CCA1E-7E39-4515-9849-90790DA6431E")]
 [ClassInterface(ClassInterfaceType.None)]
 [TypeLibType(TypeLibTypeFlags.FCanCreate)]
 public class SATest : ISATest
 {
  [DispId(1)]
  [MethodImpl(MethodImplOptions.InternalCall,
  MethodCodeType=MethodCodeType.Runtime)]
  extern int ISATest.InSArray( [MarshalAs(UnmanagedType.SafeArray,
  SafeArraySubType=VarEnum.VT_I4)] ref int[] param );
 }
}

こちらも参照ください