1. ホーム
  2. c#

c++のDLLで定義されたクラスをC#コードで使用する

2023-09-03 02:55:12

質問

私は c++ で書かれた dll を持っています。この dll を私の c# コードで使用する必要があります。検索した結果、P/Invoke を使用すると、必要な関数にアクセスできることがわかりましたが、これらの関数はクラスで定義され、非静的なプライベートメンバー変数を使用します。そのため、関数を適切に使用するには、このクラスのインスタンスを作成する必要があります。どうすれば、このクラスにアクセスしてインスタンスを作成できるようになるのでしょうか?これを行う方法を見つけることができませんでした。

私は、c++ dll が私のコードではないことに注意しなければならないと思います。

どのように解決するのですか?

C# コードで C++ クラスを直接使用する方法はありません。 型にアクセスするために間接的な方法で PInvoke を使用することができます。

基本的なパターンは、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; }

あとは、これらのメソッドをC#のコードにPInvokeするだけです。

[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#のラッパークラスを作って、より使いやすいモデルを作るのは、やや簡単な問題です。

このコードを所有していなくても、オリジナルのDLLをラップした別のDLLを作成し、小さなPInvokeレイヤーを提供することができます。