How to get an IntPtr to a struct?
c#, interop
Solution
You want to use `Marshal.StructureToPtr`.
You will also have to allocate and deallocate memory for the struct.
A good blog on the subject can be found at http://www.developerfusion.com/article/84519/mastering-structs-in-c/
Problem
I've got a method with the signature ``` public int Copy(Texture texture, Rect? srcrect, Rect? dstrect) ``` `Rect` is a struct, but I need to allow the caller to pass `null` (or `IntPtr.Zero`) to the method as well. I want to then pass it off to a DLL with the signature ``` [DllImport("SDL2.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SDL_RenderCopy")] internal static extern int RenderCopy(IntPtr renderer, IntPtr texture, IntPtr srcrect, IntPtr dstrect); ``` I was hoping I could do something like the following: ``` return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? (IntPtr)srcrect.Value : IntPtr.Zero, dstrect.HasValue ? (IntPtr)dstrect.Value : IntPtr.Zero); ``` But I can't cast the struct like that. Is there some other way I can get an `IntPtr` out of it? There alternative is to create 4 overloads: - `ref Rect, ref Rect` - `IntPtr, IntPtr` - `ref Rect, IntPtr` - `IntPtr, ref Rect` which could get even messier if I ever need to pass more than 2 struct pointers. I came up with a solution, but I have some questions about it: ``` public int Copy(Texture texture, Rect? srcrect=null, Rect? dstrect=null) { return SDL.RenderCopy(_ptr, texture._ptr, srcrect.HasValue ? StructToPtr(srcrect) : IntPtr.Zero, dstrect.HasValue ? StructToPtr(dstrect) : IntPtr.Zero); } private static IntPtr StructToPtr(object obj) { var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(obj)); Marshal.StructureToPtr(obj, ptr, false); return ptr; } ``` Had I used `ref Rect` I wouldn't have had to allocate memory for the struct -- what does that do differently than this does? I did some experimentation. The `ref Rect` solution runs at about the same speed as converting a `Rect` to an `IntPtr` generating an `IntPtr` for a `Rect`, which leads me to suspect that C# is doing something very similar under the hood when you use refs. As soon as I make it a `Rect?` and add the conditional logic to the method it runs up to 50% slower... so the 4-overload route would probably be the fastest. However, we're talking 100-150ms for 100K iterations, which means the method itself is super cheap, which is probably why the conditionals have such a notable impact. As such, I'm sticking with my custom `StructToPtr` solution as it's the simplest solution.