次の方法で共有


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

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

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

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

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

CharSet 価値 ウィンドウズ 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)

文字セットを選択するときにネイティブ表現で想定される表現がわかっていることを確認します。