ホームページ > バックエンド開発 > C++ > P/Invoke を使用して C# から C クラスにアクセスするにはどうすればよいですか?

P/Invoke を使用して C# から C クラスにアクセスするにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-05 02:42:38
オリジナル
151 人が閲覧しました

How Can I Access C   Classes from C# Using P/Invoke?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート