文字セットとマーシャリング
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) |
文字セットを選択するときは、必ずネイティブ表現で期待される表現を必ず把握しておいてください。
.NET