C# 获取作为对象存储的数组的第一个元素的地址
我需要获取任意类型数组的第一个元素的内存地址,该数组作为对象类型存储。例如,数组可以是double[]或int[],但在代码中它将被键入为对象 虽然获取已知类型数组的地址很简单,但在C#中不允许获取对象的地址。是否有一种类型(对象除外)可以用来存储这样的数组,并且其内存地址更容易获得?或者有没有一种方法可以使用互操作/反射直接访问地址而不需要中间数据副本 请注意,在下面的第二行中,double[]存储为对象。请注意,在fixed()行中,我试图获取o的地址,这在C#中是不允许的 提前谢谢C# 获取作为对象存储的数组的第一个元素的地址,c#,.net,reflection,managed,unsafe,C#,.net,Reflection,Managed,Unsafe,我需要获取任意类型数组的第一个元素的内存地址,该数组作为对象类型存储。例如,数组可以是double[]或int[],但在代码中它将被键入为对象 虽然获取已知类型数组的地址很简单,但在C#中不允许获取对象的地址。是否有一种类型(对象除外)可以用来存储这样的数组,并且其内存地址更容易获得?或者有没有一种方法可以使用互操作/反射直接访问地址而不需要中间数据副本 请注意,在下面的第二行中,double[]存储为对象。请注意,在fixed()行中,我试图获取o的地址,这在C#中是不允许的 提前谢谢 int
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...
}
}
int len=100;
对象o=新的双精度[len];
不安全的
{
已修复(int*ptr=&o)
对于(int index=0;index
您可以通过以下方式实现:
只需确保您确实需要它。您可以通过以下方式实现:
只需确保您确实需要它。您为什么要这样做?这并不能完全回答问题(因此它是一个注释),但您可能可以通过声明类型为
Array
的引用并使用Array
类(例如,Array.Copy()
@Robert:我想自动化一些与使用DirectCompute相关的任务。我想使用自动来回复制数据并减少我编写的冗余代码量的对象将CPU结构阵列与GPU缓冲区绑定。可能有一种更好的方法,我可以使用,而不是不安全的代码,但现在我想使用是可以。@phoog:谢谢你指出类型数组。我不熟悉这个类型,将来可能会有帮助。我可以建议吗?不知道这是否是你要找的…你为什么要这样做?这并不能完全回答问题(因此是一个注释),但您可能可以通过声明类型为Array
的引用并使用Array
类(例如,Array.Copy())来完成大部分需要的操作
@Robert:我想自动化一些与使用DirectCompute相关的任务。我想使用自动来回复制数据并减少我编写的冗余代码量的对象将CPU结构阵列与GPU缓冲区绑定。可能有一种更好的方法,我可以使用,而不是不安全的代码,但现在我想使用是可以。@phoog:谢谢你指出类型数组。我不熟悉这种类型,将来可能会有帮助。我可以建议吗?我不知道这是否是你想要的…谢谢!这很有效。我讨厌在GC中固定对象,但这解决了我的问题。在我对@Robert的回复中,我解释了我想做的事情。谢谢!这很有效。我讨厌在GC中固定对象,但这解决了我的问题。在我对@Robert的回复中,我解释了我要做的事情。
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();
}
}