7

I've defined a struct to send via socket. I'd like to get the size of it but sizeof is unsafe and the same for "System.Runtime.InteropServices.MarshalSizeOf". Is there a way to get its size in a safe way?

5
  • Define safe. Marshal.SizeOf is perfectly safe as far as the CLR is concerned. Commented Mar 10, 2010 at 16:50
  • 1
    Noldorin - Marshal.SizeOf requires UnSafe Code permission set to execute. This is the OP's issue Commented Mar 10, 2010 at 16:53
  • I tried System.Runtime.InteropServices.MarshalSizeOf(typeof(MyStruct)) and no "unsafe" anywhere and also unchecked the Allow unsafe code checkbox. It works fine to me now. ?????? Commented Mar 10, 2010 at 17:07
  • 1
    If you send data via a socket, then it is unsafe to assume, that sender and receiver share the same platform and thus the same size. It would be safer to serialize and send first the size and then the result of a serialization. Commented Nov 14, 2012 at 4:29
  • Marshal.SizeOf will fail if the struct is a generic type. See informit.com/guides/content.aspx?g=dotnet&seqNum=728 for info and one way to get around the problem. Commented Nov 14, 2012 at 5:03

2 Answers 2

3

There is no way to do it for managed structs. Marshal.SizeOf will only return the size of the data on the marshaled types that comprise the struct... that MIGHT be correct for the managed types on some platforms, but not on others.

This is by design so the JIT can lay structs differently depending on the platform it runs on.

More info here: Chris Brumme's blog

Sign up to request clarification or add additional context in comments.

7 Comments

The important question is why do you need to know the size of the struct? Odds are it's for an unsafe reason (in which case you can use sizeof) or it's for a P/Invoke (in which case Marshal.SizeOf is the correct answer).
Agreed. Was just trying to answer the original question: "why sizeof is unsafe and how to get size of a struct in a safe way?" :-)
One reason: you want to create an array of many structures and you need to know how many will fit into 2 GB. You need to know how much memory the runtime will allocate for the structure.
You might want to write the struct to file or a memory page. You need to know the size so you can calculate offsets, etc.
@MarkLauter well, you can use sizeof then, but that's unsafe (as per definition of unsafe by the JIT, i.e., outside its memory-checking limits) if you want to write directly to a memory page or unserialized (direct from memory) data to a file... there's no problem using sizeof (or unsafe blocks, or pointers, or pinning), but you are stepping outside the "correctnes" and memory safety that the CLR provides on its "safe" blocks
|
0

See my blog post for a wrapper library that lets you determine what the JIT will define the managed type's size will be(at runtime). It works by using the sizeof IL instruction which isn't exposed at all in C#. It can be run with no special permissions at all and is verifiable.

Note: this may or may not be what you actually want. This might return 8 for a structure that actually only has a single byte in it. I don't really understand your question completely, so I'm not sure if this is actually what you want or not.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.