[Mono-dev] Marshalling wchar_t

Jonathan Pryor jonpryor at vt.edu
Thu Jan 18 06:38:40 EST 2007


On Thu, 2007-01-18 at 12:03 +1100, Rajesh Gupta wrote:
> ...I read that it was due to the number of bytes used by wchar_t in
> Windows and Linux. Mono seems to be marshalling it like windows
> wchar_t even on Linux and thus the junk characters. Is there a way I
> can get wchar_t to work through marshalling?

Yes, but you need to do things manually on Linux, as wchar_t on Linux is
UTF-32, while Mono's LPWStr is UTF-16.  You would need to change
authenticate() to:

	[DllImport ("AuthController")]
	private static uint authenticate (
		int hwnd,
		[MarshalAs(UnmanagedType.LPArray)]
		ref ModuleAndType[] modules,
		int size,
		IntPtr inToken,
		ref IntPtr outToken
	);

Calling would become:

	IntPtr inToken = Mono.Unix.UnixMarshal.StringToHeap ("token",
		System.Text.Encoding.UTF32);
	ref IntPtr _outToken = IntPtr.Zero;
	authenticate (hwnd, modules, size, inToken, ref _outToken);
	Mono.Unix.UnixMarshal.FreeHeap (inToken);
	string outToken = Mono.Unix.UnixMarshal.PtrToString (_outToken,
		System.Text.Encoding.UTF32);
	// how was _outToken allocated?  You might need:
	// Mono.Unix.UnixMarshal.FreeHeap (_outToken)

i.e. you'd manually convert the wchar_t parameters on Linux.

Notes: System.Text.Encoding.UTF32 is a .NET 2.0 member,
Mono.Unix.UnixMarshal is in Mono.Posix.dll, and Mono.Unix.UnixMarshal
_should_ be portable to Win32 if necessary.  (Worst case you can always
copy the code into your own project, as Mono.Posix.dll is MIT/X11 code.)

 - Jon





More information about the Mono-devel-list mailing list