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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-01 14:23:09754ブラウズ

How Can I Access C   Classes from C# Using DLL Integration?

DLL 統合を介した C# コード内の C クラスへのアクセス

C# コードを既存の C DLL と統合する場合、C# コード内で定義されたクラスにアクセスするDLL は課題を引き起こす可能性があります。 P/Invoke を使用すると、DLL 内の関数とインターフェイスできますが、クラスへのアクセスは当然サポートされません。

この制限を克服するには、間接的な P/Invoke アプローチを採用できます。これには、メンバー関数呼び出しをラップするターゲット クラスのメンバー関数ごとに非メンバー関数を作成することが含まれます。

たとえば、メンバー関数 Bar():

class Foo {
public:
  int Bar();
};
を持つ C クラス Foo を考えてみましょう。

C# で Foo にアクセスするには、次の 3 つの外部関数を作成します。

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# では、これらの関数は次のようになります。 P/Invoked:

[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# ラッパー クラスを作成し、必要な操作をカプセル化します。

C コードに直接アクセスできない場合でも、別のクラスを作成できます。元の DLL をラップする DLL は、P/Invoke レイヤーを提供し、C# コードにより適したインターフェイスを公開します。

以上がDLL 統合を使用して C# から C クラスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。