[Mono-bugs] [Bug 77960][Nor] New - Marshalling of fixed size char
arrays in structs is unicode only
bugzilla-daemon at bugzilla.ximian.com
bugzilla-daemon at bugzilla.ximian.com
Thu Mar 30 05:57:08 EST 2006
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
Changed by r.gerosa at gmail.com.
http://bugzilla.ximian.com/show_bug.cgi?id=77960
--- shadow/77960 2006-03-30 05:57:08.000000000 -0500
+++ shadow/77960.tmp.19081 2006-03-30 05:57:08.000000000 -0500
@@ -0,0 +1,79 @@
+Bug#: 77960
+Product: Mono: Runtime
+Version: 1.1
+OS:
+OS Details: Arch Linux 7.1
+Status: NEW
+Resolution:
+Severity:
+Priority: Normal
+Component: interop
+AssignedTo: mono-bugs at ximian.com
+ReportedBy: r.gerosa at gmail.com
+QAContact: mono-bugs at ximian.com
+TargetMilestone: ---
+URL:
+Cc:
+Summary: Marshalling of fixed size char arrays in structs is unicode only
+
+Description of Problem:
+When specifying the [StructLayout(CharSet=CharSet.Ansi)] in a struct
+and using Marshal.PtrToStructure to get the structure from a buffer,
+if there is a fixed size char array in the struct, it is
+marshaled as unicode chars (2 bytes), it should instead read
+ansi chars (1 byte)
+
+
+Steps to reproduce the problem:
+1. Define a struct decorated with
+[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
+and containing a fixed sixe char array:
+[MarshalAs (UnmanagedType.ByValArray, SizeConst=4)]
+public char[] test;
+2. Unmarshal the struct from a buffer, using Marshal.PtrToStructure
+3. The result is wrong
+
+here is an example of c# code reproducing the problem:
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace test
+{
+ [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
+ public struct TestStruct1 {
+ [MarshalAs (UnmanagedType.ByValArray, SizeConst=4)]
+ public char[] test;
+ }
+
+ class MainClass
+ {
+ public static void Main(string[] args)
+ {
+ GCHandle handle;
+ byte[] buffer = new byte[4]
+{(byte)'t',(byte)'e',(byte)'s',(byte)'t'};
+ int structSize = Marshal.SizeOf(typeof(TestStruct1));
+ Console.WriteLine("struct size: " + structSize);
+ handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
+ TestStruct1 testStruct1 = (TestStruct1) Marshal.PtrToStructure(
+ handle.AddrOfPinnedObject(),typeof(TestStruct1));
+ handle.Free();
+ Console.WriteLine("value: " + new String(testStruct1.test));
+ }
+ }
+}
+
+Actual Results:
+struct size: 8
+value: ??
+
+Expected Results:
+struct size: 4
+value: test
+
+How often does this happen?
+always
+
+Additional Information:
+the expected result is the one returned using .NET
More information about the mono-bugs
mailing list