【发布时间】:2021-06-28 18:51:35
【问题描述】:
背景
假设我有一个结构。让我们也假装我们不知道它的类型。这就是为什么我们将它装箱而无法拆箱的原因。
public struct Player{
public float hp;
public float maxHP;
}
var boxedPlayer = (object)new Player();
var typeSize = typeof(Player);
var ourAllocatedMemoryPTR = (byte*)someAllocCall();
// Copy the object into the new memory
var objHandle = GCHandle.Alloc(boxedPlayer , GCHandleType.Pinned);
var adress = objHandle.AddrOfPinnedObject();
var ptr = adress.ToPointer();
Buffer.MemoryCopy(ptr, ourAllocatedMemoryPTR, typeSize, typeSize);
objHandle.Free();
据我所知,盒装结构......与结构本身的大小不同......因为它被装箱和管理。所以在头部或尾部有一些字节将其定义为一个对象,一个盒装结构。所以上面的例子将整个盒装结构复制到内存中。据我所知。这不是我们想要的。
问题
是否可以仅将框内的结构复制到分配的内存中?我们新分配的内存应该只存储结构,而不是装箱的。 我认为通过将结构从盒子中切出可能是可能的?在复制过程中切割将其定义为框的部分或头部/尾部?
这可能吗?结构究竟是如何装箱的?在它之前和之后添加了多少字节?它在记忆中的样子如何?
很高兴得到任何帮助!谢谢:)
【问题讨论】:
-
看来你已经有相当多的代码了。为什么不运行代码并查看调试器中的内存?
-
@ThomasWeller Havent 找到了一种统一的方法:/ 但我认为它只复制盒装结构。这是有道理的。或者你怎么看?
-
Marshal.StructureToPtr只复制未装箱的部分呢?你到底想做什么,为什么需要非托管内存中的结构? -
@Charlieface 如果我能解释一切……我可以交出一整本书。 Marshal.StructureToPtr 是否能够复制盒装结构?这就是重点......从它的装箱中删除结构并只复制结构......在编译时不知道它的类型^^
-
您无需解释所有内容,只需解释您在此处尝试执行的操作即可。你有一个预先存在的缓冲区要复制到(似乎是这样),你如何分配足够的空间(你当前的代码显然不起作用,我建议你使用
Marshal.SizeOf,它与sizeof不同),你在打电话给DllImport(然后就使用标准编组器)