C# コードでの C 共有ライブラリ (DLL) からの関数の呼び出しは、相互運用性の目的で必要になることがよくあります。ただし、C 関数がプライベート メンバー変数を使用するクラスに属している場合、C# コードでそのクラスのインスタンスを直接作成することは不可能になります。
間接 P/Invoke を使用した回避策
解決策は、間接的な P/Invoke アプローチにあります。これには、クラスのメンバー関数を呼び出す非メンバー関数を C クラスの外で作成することが含まれます。
非メンバー関数の作成
C クラスの各メンバー関数について、メンバー関数を呼び出す外部「C」関数を作成します。これにより、プライベート メンバー変数に間接的にアクセスできるようになります。
C# でラッパー クラスを作成する
これらの非メンバー関数を C DLL で定義すると、次のことが可能になります。 C# でラッパー クラスを作成してそれらと対話します。このラッパー クラスは、2 つのプラットフォーム間で受け渡される厄介な IntPtr を管理し、より使いやすいインターフェイスを提供します。
P/ラッパー クラス関数の呼び出し
C# ラッパー クラス内を使用すると、C DLL で作成された非メンバー関数を P/Invoke できます。これらの関数は適切なメンバー関数を順番に呼び出し、C クラスの機能へのアクセスを許可します。
制限事項と推奨事項
このアプローチの欠点は、次のことが必要なことです。 IntPtr を管理しますが、これは面倒な場合があります。使いやすさを向上させるには、C クラスの機能を反映する C# インターフェイスを作成することを検討してください。関数呼び出しを P/Invoke 関数に委任するラッパー クラスに C# インターフェイスを実装します。このアプローチにより、IntPtr を手動で管理する必要がなくなり、よりクリーンなプログラミング モデルが提供されます。
代替オプション
元の C コードにアクセスできない場合は、次のように作成できます。元の DLL をラップし、P/Invoke レイヤーを提供する新しい DLL。これにより、元の DLL の実装を変更せずに C クラスに間接的にアクセスできるようになります。
以上がプライベートメンバー変数が関係する場合、C# コードから C クラスにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。