C# から C DLL への文字列の受け渡し
C# と C の間で文字列を受け渡そうとすると、開発者はしばしば困難に遭遇します。この記事では、この問題を詳しく掘り下げ、簡潔な解決策を提供します。
問題
次のコードを考えてみましょう。ここで、C は文字列を連結する関数を定義しています。
extern "C" { string concat(string a, string b){ return a + b; } }
C# では、関数は次を使用して呼び出されます。 interop:
[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b);
ただし、このアプローチでは System.AccessViolationException が発生します。
解決策
問題は C の非互換性にあります。 std::string と相互運用性境界。この問題を解決するには、null で終わる文字配列など、相互運用に適した型を境界で使用する必要があります。
C# から C への文字列の受け渡し
For C# から C に文字列を渡すと、C 関数を変更できます:
void foo(const char *str) { // do something with str }
そしてC#:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str);
C から C# に文字列を渡す
C から C# に文字列を渡す場合、C 関数は次のようになります。
void foo(char *str, int len) { // write no more than len characters into str }
C# の場合:
[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len);
これらに従うことでガイドラインに従って、開発者は C# と C DLL の間で文字列をシームレスに渡すことができます。
以上がC# と C DLL 間で文字列をシームレスに渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。