StructLayoutAttribute.CharSet Field
Indicates whether string data fields within the class should be marshaled as LPWSTR or LPSTR by default.
Assembly: mscorlib (in mscorlib.dll)
If the CharSet field is set to CharSet.Unicode, all string arguments are converted to Unicode characters (LPWSTR) before they are passed to the unmanaged implementation. If the field is set to CharSet.Ansi, the strings are converted to ANSI strings (LPSTR). If the CharSet field is set to CharSet.Auto, the conversion is platform-dependent (ANSI on Windows 98 and Windows Me, and Unicode on later versions).
Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
This means that your structure might be larger in managed memory (where char is 2 bytes) than it is when marshalled. Marshal.SizeOf() returns the marshalled size, so you can't always used that size with managed data. Use C#'s operator sizeof() to get the unmarshalled in-memory size.
- 10/10/2010
- Daniel N. Johnson
- 10/10/2010
- Daniel N. Johnson
If you are actually using an older version of .NET to support Windows 98 or something, you will want CharSet.Auto so you still get Unicode on recent versions of Windows.
If you aren't supporting Windows 95, 98 or Me, you just want Unicode here. Unicode is natively supported on Windows NT, XP, Vista, etc, and it's also what .NET uses internally, so there will be no conversions and no data loss.
Sometimes a structure will contain no character data, and this property will do nothing, but it is harmless to set it even then. Better safe than sorry.
- 10/10/2010
- Daniel N. Johnson