static void Copy() { var src = new Src { A = 3, B = 4 }; var dst = new Dest(); unsafe { Src* srcPtr = &src; dst.Data = new byte[sizeof(Src)]; Marshal.Copy((IntPtr)srcPtr, dst.Data, 0, sizeof(Src)); } }
static void Copy() { var str = "Hello"; var src = new Src { A = 3, B = 4, StringHandle = GCHandle.Alloc(str, GCHandleType.Normal) }; var dst = new Dest(); unsafe { Src* srcPtr = &src; dst.Data = new byte[sizeof(Src)]; Marshal.Copy((IntPtr)srcPtr, dst.Data, 0, sizeof(Src)); } // When you're sure no one can reference the string anymore // (Including by accessing the data you put in dst.Data!) src.StringHandle.Free(); }