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