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

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

Susan Sarandon
リリース: 2025-01-03 19:35:41
オリジナル
309 人が閲覧しました

How to Seamlessly Pass Strings Between C# and C   DLLs?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート