DLL 統合を介した C# コード内の C クラスへのアクセス
C# コードを既存の C DLL と統合する場合、C# コード内で定義されたクラスにアクセスするDLL は課題を引き起こす可能性があります。 P/Invoke を使用すると、DLL 内の関数とインターフェイスできますが、クラスへのアクセスは当然サポートされません。
この制限を克服するには、間接的な P/Invoke アプローチを採用できます。これには、メンバー関数呼び出しをラップするターゲット クラスのメンバー関数ごとに非メンバー関数を作成することが含まれます。
たとえば、メンバー関数 Bar():
class Foo { public: int Bar(); };を持つ C クラス Foo を考えてみましょう。
C# で Foo にアクセスするには、次の 3 つの外部関数を作成します。
extern "C" Foo* Foo_Create() { return new Foo(); } extern "C" int Foo_Bar(Foo* pFoo) { return pFoo->Bar(); } extern "C" void Foo_Delete(Foo* pFoo) { delete pFoo; }
C# では、これらの関数は次のようになります。 P/Invoked:
[DllImport("Foo.dll")] public static extern IntPtr Foo_Create(); [DllImport("Foo.dll")] public static extern int Foo_Bar(IntPtr value); [DllImport("Foo.dll")] public static extern void Foo_Delete(IntPtr value);
このアプローチでは C クラスへのアクセスが提供されますが、管理する必要がある不透明な IntPtr が導入されます。よりユーザーフレンドリーなインターフェイスを作成するには、このポインターの周囲に C# ラッパー クラスを作成し、必要な操作をカプセル化します。
C コードに直接アクセスできない場合でも、別のクラスを作成できます。元の DLL をラップする DLL は、P/Invoke レイヤーを提供し、C# コードにより適したインターフェイスを公開します。
以上がDLL 統合を使用して C# から C クラスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。