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レイヤーを提供することができます。
関連
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み] リフレクションを使ってプライベートメソッドを呼び出すには?
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み】C#の変数名における@の使い方・意味は?
-
[解決済み】クラスデータメンバー "::*" へのポインタ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み] 2つのリストを結合する
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。