我需要获取任意类型数组的第一个元素的内存地址,该数组存储为一种Object类型。例如,数组可以是double []或int [],但在代码中它将被键入为Object。
虽然直接获取已知类型的数组的地址,但在C#中不允许获取对象的地址。是否有一个类型(除了Object)我可以用来存储这样一个数组,并且可以更容易地获得其内存地址?或者有没有办法使用Interop / Reflection直接访问地址而无需中间数据副本?
请注意,在下面的第二行中,double []存储为对象。并注意在fixed()行中我试图获取o的地址,这在C#中是不允许的。
提前致谢!
int len=100;
object o = new double [len];
unsafe
{
fixed(int*ptr=&o)
for (int index = 0; index < len; index++)
{
// access data directly to copy it, etc...
}
}
答案 0 :(得分:4)
您可以使用GCHandle
:
int len=100;
object x = new long[len];
unsafe
{
var gch = GCHandle.Alloc(x, GCHandleType.Pinned);
try
{
void* addr = (void*)gch.AddrOfPinnedObject();
// do whatever you want with addr
}
finally
{
gch.Free();
}
}
确定你真的需要这个。