C コードからコンパイルされた DLL を C# コード内で使用する場合は、P/Invoke を使用するのが簡単です。ただし、DLL がクラス内で関数を定義する場合、特にこれらの関数が非静的プライベート メンバー変数にアクセスする場合には、課題が発生します。このような場合、クラスのインスタンスを作成する必要があり、大きな障害となります。
この障害を克服するには、C への直接アクセスを理解することが不可欠です。 C# コードからのクラスは実現できません。代わりに、P/Invoke を使用した間接的なアプローチが必要です。このアプローチでは、非メンバー関数を C クラスの各メンバー関数に関連付け、非メンバー関数が対応するメンバー関数を呼び出す必要があります。
たとえば、メンバー関数 Bar を持つ C クラス Foo を考えてみましょう。関連する非メンバー関数は次のように定義できます。
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; }
これらの非メンバー関数は、P/Invoke を使用して C# コードにインポートできます。 :
[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);
このアプローチには扱いにくい IntPtr 変数の処理が含まれますが、このポインターの周囲に C# ラッパー クラスを作成すると、
C# コードで C クラスを直接使用することはできない場合がありますが、間接的な P/Invoke アプローチにより、その機能にアクセスできます。 C コードが制御できない場合でも、ラッパー DLL を作成すると、C# コードとのシームレスな統合に必要な抽象化を提供できます。
以上がP/Invoke を使用して C# から C クラスの機能にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。