C# コードの DLL 経由の C クラスへのアクセス
C# コードから C DLL とインターフェイスする場合、クラスに直接アクセスしようとすると制限が発生しますDLL 内で定義されます。 P/Invoke の関数公開機能にもかかわらず、クラス内の関数は非静的メンバー変数に依存しており、インスタンスの作成が必要です。
P/Invoke と間接アクセス
直接アクセスクラスへのアクセスは不可能ですが、P/Invoke を使用して間接的にクラス メンバーにアクセスできます。このアプローチには、クラス メンバー関数を呼び出す非メンバー関数の作成が含まれます。
サンプル コード
次の C コードを考えてみましょう。
class Foo { public: int Bar(); }; 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 コードは非メンバー関数を通じてクラス Foo を公開しています。
C#インターフェイス
C# では、P/Invoke は次の関数にアクセスできます:
[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 コードの直接所有権は不可能ですが、別の DLL を作成して元の DLL をラップし、P/Invoke レイヤーを提供して、C# コードと C クラスの対話を簡素化できます。
以上がP/Invoke を使用して C# から C クラスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。