ホームページ >バックエンド開発 >C++ >C# と C DLL の間で文字列をシームレスに渡すにはどうすればよいですか?

C# と C DLL の間で文字列をシームレスに渡すにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-05 03:53:39968ブラウズ

How Can I Seamlessly Pass Strings Between C# and a C   DLL?

C# と C DLL の間の文字列のインターフェイス

C DLL 内で文字列操作をカプセル化し、C# から呼び出すことは簡単に思えるかもしれません。ただし、相互運用性の境界を越えて文字列を渡すことには課題が伴います。この記事では、このような交換に伴う複雑さを調査し、シームレスな文字列転送の回避策を説明します。

落とし穴

C 標準ライブラリ文字列 (std::string) を直接渡すC#/.NET の境界を越えたものには互換性がありません。これは、C# が std::string に相当するものを提供していないためです。その結果、相互運用を実行しようとすると、System.AccessViolationException が発生して失敗します。

解決策: 相互運用可能な文字列

この障害を克服するには、次の場所で相互運用可能な文字列型を採用する必要があります。境界線。そのようなオプションの 1 つは、C と C# の両方で便利に処理できる、NULL で終了する文字配列です。このアプローチでは、同じモジュール内でメモリの割り当てと割り当て解除を行う必要があります。

C# から C への文字列の受け渡し

NULL で終了する文字配列を受け入れる次の C 関数を考えてみましょう。

void foo(const char *str) {
  // ...
}

C# では、相互運用関数を次のように宣言できます。

[DllImport("...")]
static extern void foo(string str);

// ...

foo("bar");

このシナリオでは、C# コンパイラはマネージ文字列 (「bar」) を NULL で終わる文字配列に自動的にマーシャリングし、C 関数に渡します。

C から C# への文字列の受け渡し

一方、C 関数は文字列を C# に書き込むことができます。 C# 呼び出し元によって割り当てられたバッファ:

void foo(char *str, int len) {
  // Perform operations within len characters of str
}

C# では:

[DllImport("...")]
static extern void foo(StringBuilder str, int len);

// ...

StringBuilder sb = new StringBuilder(10);
foo(sb, sb.Capacity);

ここで、C# は StringBuilder オブジェクトを割り当て、その内部バッファを StringBuilder と Capacity を介して C 関数に公開します。パラメータ。 C 関数は、バッファーに最大 Capacity 文字を入力できます。

結論

相互運用可能な文字列型を採用することで、C# と C DLL の間で文字列をシームレスに受け渡すことができます。さまざまな言語やプラットフォーム間でテキスト データを交換するための便利なメカニズムを提供します。

以上がC# と C DLL の間で文字列をシームレスに渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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