我有一个void*
指向堆上的某个托管对象
如何将object
值转换为GCHandle.ToIntPtr
(指向相同的内容,而不是副本)?
请注意,这不是C# - How To Convert Object To IntPtr And Back?的重复,因为我没有GCHandle
的输出可以转换回<child-component *ngIf="inputData" input-value= "inputData"></child-component>
- 我有一个实际的地址一个对象。
答案 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
中使用数组,因为如果我尝试struct
加object
加IntPtr
,.NET运行时不会喜欢},但如果它们是数组,则没有问题。 sizeof(object) == sizeof(IntPtr)
所以即使在那里也没有问题(new object[10]
使用的内存与new IntPtr[10]
使用的内存相同。)