Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取作为对象存储的数组的第一个元素的地址_C#_.net_Reflection_Managed_Unsafe - Fatal编程技术网

C# 获取作为对象存储的数组的第一个元素的地址

C# 获取作为对象存储的数组的第一个元素的地址,c#,.net,reflection,managed,unsafe,C#,.net,Reflection,Managed,Unsafe,我需要获取任意类型数组的第一个元素的内存地址,该数组作为对象类型存储。例如,数组可以是double[]或int[],但在代码中它将被键入为对象 虽然获取已知类型数组的地址很简单,但在C#中不允许获取对象的地址。是否有一种类型(对象除外)可以用来存储这样的数组,并且其内存地址更容易获得?或者有没有一种方法可以使用互操作/反射直接访问地址而不需要中间数据副本 请注意,在下面的第二行中,double[]存储为对象。请注意,在fixed()行中,我试图获取o的地址,这在C#中是不允许的 提前谢谢 int

我需要获取任意类型数组的第一个元素的内存地址,该数组作为对象类型存储。例如,数组可以是double[]或int[],但在代码中它将被键入为对象

虽然获取已知类型数组的地址很简单,但在C#中不允许获取对象的地址。是否有一种类型(对象除外)可以用来存储这样的数组,并且其内存地址更容易获得?或者有没有一种方法可以使用互操作/反射直接访问地址而不需要中间数据副本

请注意,在下面的第二行中,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...
                }

    }
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();
    }
}