在C#中,如何将void *(指向托管堆)转换为对象?

时间:2018-06-14 03:44:04

标签: c# pointers

我有一个void*指向堆上的某个托管对象 如何将object值转换为GCHandle.ToIntPtr(指向相同的内容,而不是副本)?

请注意,这不是C# - How To Convert Object To IntPtr And Back?的重复,因为我没有GCHandle的输出可以转换回<child-component *ngIf="inputData" input-value= "inputData"></child-component> - 我有一个实际的地址一个对象。

1 个答案:

答案 0 :(得分:2)

您尝试做的事情在很多层面上都是错误的...如果托管对象没有固定,那么GC可以随时移动它,因此您的void*将变为非法

但是你提出了一个问题。而且我会给你绳索让自己挂起来。

[StructLayout(LayoutKind.Explicit)]
public struct ObjectToIntPtr
{
    [FieldOffset(0)]
    public object[] Objects;
    [FieldOffset(0)]
    public IntPtr[] Ptrs;
}

然后:

var array = new int[] { int.MaxValue, 1, 2, 3 };

IntPtr ptr = new ObjectToIntPtr { Objects = new[] { array } }.Ptrs[0];

int[] array2 = (int[])new ObjectToIntPtr { Ptrs = new[] { ptr } }.Objects[0];

你想要的是最后一行。请注意,我在ObjectToIntPtr中使用数组,因为如果我尝试structobjectIntPtr,.NET运行时不会喜欢},但如果它们是数组,则没有问题。 sizeof(object) == sizeof(IntPtr)所以即使在那里也没有问题(new object[10]使用的内存与new IntPtr[10]使用的内存相同。)