問題:
P/Invoke を使用して C 内の関数にアクセスするメンバー変数と非静的メソッドを含む DLL では、定義クラスのインスタンスを作成する必要があります。このクラスにアクセスするにはどうすればよいですか?
答え:
C# で 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# の場合:
[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# ラッパー クラスへのポインター:
public class FooWrapper { private IntPtr _foo; public FooWrapper() { _foo = Foo_Create(); } public int Bar() { return Foo_Bar(_foo); } public void Dispose() { Foo_Delete(_foo); } }
代替アプローチ:
元の DLL を変更できない場合は、元の DLL をラップして公開する中間 DLL を作成します。ラップされたクラスを C# に変換します。
以上がC# からメンバー変数と非静的メソッドを含む C DLL クラスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。