ホームページ > バックエンド開発 > C++ > C# からメンバー変数と非静的メソッドを含む C DLL クラスにアクセスするにはどうすればよいですか?

C# からメンバー変数と非静的メソッドを含む C DLL クラスにアクセスするにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-28 21:49:11
オリジナル
150 人が閲覧しました

How Can I Access a C   DLL Class with Member Variables and Non-Static Methods from C#?

C# コードで C DLL クラスにアクセスする

問題:

P/Invoke を使用して C 内の関数にアクセスするメンバー変数と非静的メソッドを含む DLL では、定義クラスのインスタンスを作成する必要があります。このクラスにアクセスするにはどうすればよいですか?

答え:

C# で C クラスを直接使用することはできません。代わりに、次の手順に従います。

  1. 各クラス メンバー関数の非メンバー関数を作成し、メンバー関数を呼び出します。
  2. 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# の場合:

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

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