2

グーグルは私が望んでいたように助けてくれなかったので、ここに投稿を書いています。私はchar(ANSI)*を必要とするC#およびC関数(dll)にUnicode文字列を持っています。私はやろうとする

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &tmp.ToCharArray()[0])
    {
        some_function(data);
    }
}

しかし、エンコードせずに直接変換することはできません。Encode クラスを使用しようとしましたが、効果はありません。some_function は char ポインターで呼び出す必要があることはわかっています。バイトの配列を指す場所。

4

2 に答える 2

6

これを自分で明示的に行う必要はありません。

代わりに、P/Invoke を使用して C メソッドを宣言し、 type のパラメーターを受け入れますstring

次に、P/Invoke 宣言に追加します。

 [DllImport("YourDllName.dll", CharSet=CharSet.Ansi)]

マーシャラーは文字列を ANSI に変換します。

文字列が呼び出された関数に渡されると想定しているため、パラメーターは、呼び出された関数から新しい文字列を返すために使用されるポインターではないことに注意してください。

詳細については、こちらを参照してください: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset.aspx

実際、デフォルトはそのため、代わりに(または今使用しているものは何でも)CharSet.Ansiパラメータを宣言するだけでよい場合があります。stringbyte*

于 2013-08-19T12:02:50.057 に答える
3

System.Text名前空間を使用する必要があります。

string tmp = "ala ma kota";
unsafe
{
    fixed (byte* data = &System.Text.Encoding.ASCII.GetBytes(tmp)[0])
    {
        some_function(data);
    }
}
于 2013-08-19T12:02:56.487 に答える