文字セットとマーシャリング

Note

次のガイダンスは [DllImport] の使用を目的としており、正しい結果を得るには手動で従う必要があります。 .NET 7 以降のユーザーは、代わりに [LibraryImport] を使用することを検討してください。 インボックス Roslyn アナライザー (既定で有効) は、コード内の [LibraryImport] 属性に必要なガイダンスを提供します。

char 値、string オブジェクト、および System.Text.StringBuilder オブジェクトのマーシャリング方法は、P/Invoke または構造体の CharSet フィールド値によって変わります。 P/Invoke の CharSet を設定するには、P/Invoke を宣言するときに DllImportAttribute.CharSet フィールドを設定します。 型の CharSet を設定するには、クラスまたは構造体宣言の StructLayoutAttribute.CharSet フィールドを設定します。 これらの属性フィールドが設定されていない場合、言語コンパイラによって使用する CharSet が決まります。 C#、Visual Basic、および F# は既定で None 文字セットを使用します。動作は Ansi 文字セットと同じになります。

C# または Visual Basic コードで System.Runtime.InteropServices.DefaultCharSetAttribute がモジュールに適用される場合、C# または Visual Basic コンパイラは CharSet.None を使用する代わりに、指定された CharSet を既定で出力します。 F# では DefaultCharSetAttribute がサポートされておらず、CharSet.None が常に既定で出力されます。

次の表は、各文字セット間のマッピングと、その文字セットでマーシャリングしたときに文字または文字列がどのように表現されるかをまとめたものです。

CharSet の値 Windows Unix 上での .NET Core 2.2 以前 Unix 上での .NET Core 3.0 以降および Mono
Ansi char (システム既定の Windows (ANSI) コード ページ) char (UTF-8) char (UTF-8)
Unicode wchar_t (UTF-16) char16_t (UTF-16) char16_t (UTF-16)
Auto wchar_t (UTF-16) char16_t (UTF-16) char (UTF-8)

文字セットを選択するときは、必ずネイティブ表現で期待される表現を必ず把握しておいてください。