Re: unmanaged structure layout error
Mike Andrews <[email protected]> Wed, 11 Nov 2009 14:10:03 -0600
| Newsgroups | gmane.comp.windows.devel.dotnet.advanced |
|---|---|
| Message-ID | <[email protected]> |
I specified the CharSet = CharSet.Ansi in the StructLayout attribute as well so it should work as it shouldn't be trying to interpret the data as Unicode. I'm not trying to model a union so I guess I'll stick with LayoutKind.Sequential since it works. On Wed, Nov 11, 2009 at 2:03 PM, Richard Blewett <[email protected]>wrote: > At a guess the string was Unicode (TStr can be ansi or Unicode strings) and > so the null terminated string overran the next field > > LayoutKind.Sequential will do the right thing most of the time unless you > are trying to model unions etc > > Rich > > -----Original Message----- > From: Discussion of advanced .NET topics. > [mailto:[email protected]] On Behalf Of Mike Andrews > Sent: 11 November 2009 19:55 > To: [email protected] > Subject: Re: [ADVANCED-DOTNET] unmanaged structure layout error > > I just tried something different and it seemed to work. > > I remove the LayoutKind.Explicit and specified LayoutKind.Sequential. I > then removed the FieldOffset attribute and that seemd to fix the problem. > > I would still like to know why having explicit field offsets causes an > exception when the type is loaded. It really doesn't make any sense to me. > > On Wed, Nov 11, 2009 at 1:46 PM, Mike Andrews > <[email protected]>wrote: > > > Oh, ok. I get it. > > > > I kinda thought that might be it as well except that in .NET there is no > > specific size for a string. That's what I thought the MarshalAs > attribute > > was for; that I'm saying that the field starts and byte index 64 and > > continues for 70 bytes. That puts it at byte 134 for the next offest. > The > > previous offset is 64 - 133. I've tried specifying 133 and 135 or the > > offset for the _address1 but nothing seems to work. > > > > On Wed, Nov 11, 2009 at 1:38 PM, John Warner <[email protected]> wrote: > > > >> Please don't mistake my question for knowledge! Just given the error > >> message it seems to me the problem is in the last three fields and I > >> suspect really the last two. String_name must be going further than > offset > >> 134. > >> > >> But again, make no mistake my question here is not a show of knowledge > >> just a guess from the peanut gallery (if you are old enough to know that > >> one) > >> > >> John Warner > >> > >> > >> > -----Original Message----- > >> > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > >> > [email protected]] On Behalf Of Mike Andrews > >> > Sent: Wednesday, November 11, 2009 2:35 PM > >> > To: [email protected] > >> > Subject: Re: [ADVANCED-DOTNET] unmanaged structure layout error > >> > > >> > I'm not sure I understand. > >> > I assumed that by placing [MarshalAs(UnmanagedType.ByValTStr, > SizeConst > >> > = > >> > 70)] over the field that it would read the next 70 bytes as a string. > >> > > >> > But that still doesn't explain why the runtime is crying when it tries > >> to > >> > load the type. > >> > > >> > On Wed, Nov 11, 2009 at 1:26 PM, John Warner <[email protected]> > wrote: > >> > > >> > > Does the string class need more space than the data it contains? > >> > > > >> > > String_name > >> > > > >> > > John Warner > >> > > > >> > > > >> > > > -----Original Message----- > >> > > > From: Discussion of advanced .NET topics. [mailto:ADVANCED- > >> > > > [email protected]] On Behalf Of Mike Andrews > >> > > > Sent: Wednesday, November 11, 2009 2:04 PM > >> > > > To: [email protected] > >> > > > Subject: [ADVANCED-DOTNET] unmanaged structure layout error > >> > > > > >> > > > I'm having a problem with an unmanaged structure. > >> > > > > >> > > > I'm getting this error message when the system tries to load the > >> type: > >> > > > > >> > > > *Could not load type '_S' from assembly '...' because it contains > an > >> > > object > >> > > > field at offset 134 that is incorrectly aligned or overlapped by a > >> > > > non-object field.* > >> > > > > >> > > > For the life of me I cannot figure this out why this is failing. > >> > > > I've set the byte packing to 1 which means that there is no > padding > >> > > between > >> > > > bytes. I've also explicitly specified each field offset. > >> > > > > >> > > > Below is the structure that I have declared. It's only a partial > >> > > structure > >> > > > and I removed all the properties for brevity. Also there's more > >> members > >> > > but > >> > > > the last field is where the error is occurring. Also, if I remove > >> the > >> > > last > >> > > > field it works. When I add it back it fails. > >> > > > > >> > > > Any suggestions? > >> > > > > >> > > > Thanks, > >> > > > Mike > >> > > > > >> > > > [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi, Pack = > >> 1)] > >> > > > private struct _S { > >> > > > [FieldOffset(0)] > >> > > > private System.Double _height; > >> > > > [FieldOffset(8)] > >> > > > private System.Double _width; > >> > > > [FieldOffset(16)] > >> > > > private System.Double _depth; > >> > > > [FieldOffset(24)] > >> > > > private System.Double _a; > >> > > > [FieldOffset(32)] > >> > > > [MarshalAs(UnmanagedType.ByValArray, SizeConst = 24)] > >> > > > private System.Byte[] _u1; > >> > > > [FieldOffset(56)] > >> > > > private System.UInt16 _number; > >> > > > [FieldOffset(58)] > >> > > > private System.UInt16 _d; > >> > > > [FieldOffset(60)] > >> > > > [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] > >> > > > private System.Byte[] _u2; > >> > > > [FieldOffset(64)] > >> > > > [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 70)] > >> > > > private System.String _name; > >> > > > [FieldOffset(134)] > >> > > > [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] > >> > > > private System.String _address1; > >> > > > > >> > > > =================================== > >> > > > View archives and manage your subscription(s) at > >> > > > http://peach.ease.lsoft.com/archives > >> > > > >> > > =================================== > >> > > View archives and manage your subscription(s) at > >> > > http://peach.ease.lsoft.com/archives > >> > > > >> > > >> > =================================== > >> > View archives and manage your subscription(s) at > >> > http://peach.ease.lsoft.com/archives > >> > >> =================================== > >> View archives and manage your subscription(s) at > >> http://peach.ease.lsoft.com/archives > >> > > > > > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > No virus found in this incoming message. > Checked by AVG - www.avg.com > Version: 9.0.704 / Virus Database: 270.14.58/2493 - Release Date: 11/11/09 > 07:40:00 > > =================================== > View archives and manage your subscription(s) at > http://peach.ease.lsoft.com/archives > =================================== View archives and manage your subscription(s) at http://peach.ease.lsoft.com/archives