Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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# 从IntPtr获取结构的数组_C#_Arrays_Marshalling_Intptr - Fatal编程技术网

C# 从IntPtr获取结构的数组

C# 从IntPtr获取结构的数组,c#,arrays,marshalling,intptr,C#,Arrays,Marshalling,Intptr,我有一些这样的结构 struct MyStruct { public int field1; public int field2; public int field3; } 我有指向这个结构的数组的指针。 所以,我需要从这个指针获取数组。 我试图使用Marshal.PtrToStructure,但内存读取错误。 这是我的方法: public MyStruct[] GetArrayOfStruct(IntPtr pointerToStruct, int length) {

我有一些这样的结构

struct MyStruct
{
    public int field1;
    public int field2;
    public int field3;
}
我有指向这个结构的数组的指针。 所以,我需要从这个指针获取数组。 我试图使用Marshal.PtrToStructure,但内存读取错误。 这是我的方法:

public MyStruct[] GetArrayOfStruct(IntPtr pointerToStruct, int length)
{
    var sizeInBytes = Marshal.SizeOf(typeof(TCnt));
    MyStruct[] output = new MyStruct[length];

    for (int i = 0; i < length; i++)
    {
        IntPtr p = new IntPtr((pointerToStruct.ToInt32() + i * sizeInBytes));

        output[i] = (MyStruct)System.Runtime.InteropServices.Marshal.PtrToStructure(p, typeof(MyStruct));
    }

    return output;
}
public MyStruct[]GetArrayOfStruct(IntPtr pointerToStruct,int length)
{
var sizeInBytes=Marshal.SizeOf(typeof(TCnt));
MyStruct[]输出=新的MyStruct[length];
for(int i=0;i

那么,我做错了什么?两个问题。在Marshal.SizeOf()调用中使用TCnt而不是MyStruct。IntPtr算法无法在64位计算机上运行,必须使用IntPtr.ToInt64()或cast to(long)

当然,获取错误的IntPtr或长度也是可能的。使用Debug+Windows+Memory+Memory 1并将“pointerToStruct”放在地址框中进行基本验证。

C和C中的结构不是一回事。其中一个区别是,在C#中,您必须明确要求您的结构应该按顺序排列。如果你没有写信
[StructLayout(LayoutKind.Sequential)]
[StructLayout(LayoutKind.Explicit)]
属性到您的结构我不相信您可以用这种方式管理它。Microsoft声明将使用
PtrToStructure
将结构从非托管内存转换为托管内存


您应该测试将此属性添加到结构是否有帮助,如果没有帮助,请尝试使用
Marshal.AllocHGlobal(IntPtr)
分配内存,并使用
Marshal.Copy
初始化结构,然后尝试使用
PtrToStructure
。如果这样做有效,则无法将
PtrToStructure
与托管内存一起使用假设结构的大小是固定的,则此函数对我有效:

public static void MarshalUnmananagedArray2Struct<T>(IntPtr unmanagedArray, int length, out T[] mangagedArray)
{
    var size = Marshal.SizeOf(typeof(T));
    mangagedArray = new T[length];

    for (int i = 0; i < length; i++)
    {
        IntPtr ins = new IntPtr(unmanagedArray.ToInt64() + i * size);
        mangagedArray[i] = Marshal.PtrToStructure<T>(ins);
    }
 }
public static void marshallUnmanageDarray2struct(IntPtr unmanagedArray,int length,out T[]manageDarray)
{
var size=Marshal.SizeOf(typeof(T));
mangagedArray=新的T[长度];
for(int i=0;i
为什么是
sizeInBytes=Marshal.SizeOf(typeof(TCnt))而不是
sizeInBytes=Marshal.SizeOf(typeof(MyStruct))?TCnt是某种印刷错误。使用ntPtr.ToInt64()会产生相同的结果,我认为更常见的术语是“bug”。无论如何,我想这足以让你走了。内存窗口是您的最终调试工具。仅供参考,C#4引入了IntPtr.{Add,Subtract}使指针算术不易出错。看见