<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7652.24">
<TITLE>Trouble with utf-16 marshaling</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->
<BR>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; My situation is this:&nbsp; I've got a C library that has a lot of UTF-16 inputs and outputs.&nbsp; The C type is always &quot;unsigned short*&quot; or &quot;const unsigned short*&quot; (because clearly wchar_t* isn't portable because it's 4 bytes on linux).&nbsp;&nbsp; All of my C# code has the &quot;[MarshalAs(UnsignedType.LPWStr)]&quot; attribute specified.</FONT></P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; It works properly in windows with MS .NET, but doesn't work for me in linux with mono.&nbsp;&nbsp; I've verified in gdb that the C library is returning the correct string, but immediately after the C dll returns and mono does the LPWStr marshaling the string is total garbage characters.&nbsp;&nbsp; I am under the impression from previous posts that 2-byte UTF-16 should marshal properly to mono with the LPWStr attribute.&nbsp; In fact it looks like some of the gdiplus calls use that same thing and work&#8230; any ideas what I can check on because mine doesn't?</FONT></P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; For more clarification my C library has a function signature like this:</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">void my_function(unsigned short* myArg);</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp; And my C# code looks like this:</FONT>
</P>
<BR>

<P><FONT SIZE=2 FACE="Arial">[DllImport(&quot;myCLib&quot;)]</FONT>

<BR><FONT SIZE=2 FACE="Arial">public static extern void my_function([MarshalAs(UnmanagedType.LPWStr)] string myArg);</FONT>
</P>

<P><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp; Thanks in advance for any ideas on what to check!</FONT>

<BR><FONT SIZE=2 FACE="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dan Maser</FONT>
</P>

</BODY>
</HTML>