将结构的C数组编组为C#

马丁·科瓦切夫(Martin Kovachev)

我正在尝试(在过去的10个小时内.... grr)使此功能正常工作,但到目前为止,无论我尝试了什么-它都拒绝:)

基本上,我正在为某人提供帮助-我的实力肯定不是Windows / .NET编码,并且我正尝试从已有的东西中修补一些代码。

问题是什么?

我试图调用C DLL库方法,将二维结构数组返回给c#。

但是似乎我在从c#中读取数据方面做错了。

我已经开发了一个简单的C控制台应用程序,并且从那里调用DLL-很好-完全没有问题。只有C#失败!

这是该方法的C实现:

int get_available_devices(idevice_info_t **devices, uint32_t *count) {
char **dev_list = NULL;
char *dev_name = NULL;
int i, total_devices;

if (idevice_get_device_list(&dev_list, &total_devices) < 0) {
    fprintf(stderr, "ERROR: Unable to retrieve device list!\n");
    return -1;
}

idevice_info_t *tmpArr = (idevice_info_t*)calloc(total_devices, sizeof(idevice_info));

int ii = 0;
int res_name = 0;

idevice_info_t dtmp = NULL;

for (i = 0; i <= total_devices - 1; i++) {
    res_name = idevice_get_device_name(dev_list[i], &dev_name);
    dev_name = (res_name == 0 ? dev_name : "");

    printf("%s: %s\n", dev_name, dev_list[i]);

    dtmp = (idevice_info_t)malloc(sizeof(struct idevice_info));
    strncpy_s(dtmp->udid, sizeof dtmp->udid - 1, dev_list[i], sizeof dtmp->udid - 1);
    strncpy_s(dtmp->name, sizeof dtmp->name - 1, dev_name, sizeof dtmp->name - 1);
    tmpArr[i] = dtmp;
}
idevice_device_list_free(dev_list);

*devices = tmpArr;
*count = total_devices;

return 0;}

这是我在C#方面正在做的事情:

[DllImport(LIBNAME, CallingConvention = CallingConvention.Cdecl)]
    static public extern short get_available_devices(out IntPtr devices, out uint count);

public static Dictionary<string, string> getAvailableDevices()
    {
        IntPtr p = IntPtr.Zero;
        Dictionary<string, string> ret = null;

        uint totalDevices = 0;

        int res = External.get_available_devices(out p, out totalDevices);

        if (res != 0 || totalDevices < 1)
        {
            return null;
        }

        ret = new Dictionary<string, string>();

        External.idevice_info ppStruct;
        int sSize = Marshal.SizeOf(typeof(External.idevice_info));

        for (int i = 0; i <= totalDevices - 1; i++)
        {
            p = (IntPtr)Marshal.PtrToStructure(p, typeof(IntPtr));
            ppStruct = (External.idevice_info)Marshal.PtrToStructure(p, typeof(External.idevice_info));

            ret.Add(ppStruct.udid, ppStruct.name);

            p = new IntPtr(p.ToInt64() + sSize);
        }

        return ret;
    }

实际问题是什么?

一旦到达for cycle()的第二次迭代,我就会遇到访问冲突:

An unhandled exception of type 'System.AccessViolationException' occurred in mscorlib.dll

未处理的异常:访问冲突

我想我没有正确计算指针,但是...我确实尝试了很多不同的情况,但没有任何效果。

帮助!:)

您使用取消引用pp = (IntPtr)Marshal.PtrToStructure(p, typeof(IntPtr));然后在尝试增加时最后,所有地狱都松散了。

使用新鲜的本地,以便不会连续取消引用原始指针。

例如:

    for (int i = 0; i <= totalDevices - 1; i++)
    {
        IntPtr pp = (IntPtr)Marshal.PtrToStructure(p, typeof(IntPtr));
        ppStruct = (External.idevice_info)Marshal.PtrToStructure(pp, 
                      typeof(External.idevice_info));

        ret.Add(ppStruct.udid, ppStruct.name);

        p += sSize; // easier, does the same :)
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将C#结构编组为C ++ VARIANT

来自分类Dev

我可以将数据从C / C ++结构编组为具有属性的C#结构吗?

来自分类Dev

将复杂的结构编组到C#

来自分类Dev

将具有固定大小的数组的C ++结构编组到C#中

来自分类Dev

在 C# 中编组布尔数组与将单个布尔值(定义为 int)编组为 bool

来自分类Dev

如何将C指针编组为C#的struct数组

来自分类Dev

从C#到VC ++的结构体编组数组

来自分类Dev

将C char [] []数组编组到C#

来自分类Dev

在C#/ C ++之间编组复杂结构

来自分类Dev

从C#到C编组复杂的结构

来自分类Dev

将动态数组编组到C#委托(回调)

来自分类Dev

将浮点数组编组到C#

来自分类Dev

C#中结构内的嵌入式结构的编组数组

来自分类Dev

将结构数组编组为不带父标记的xml

来自分类Dev

如何将Python cv2.cv.LoadImage编组为C IplImage-> imageData结构

来自分类Dev

将C Struct编组为C#委托的返回值

来自分类Dev

无法使用Marshal.PtrToStringAuto(IntPtr)将C ++ char []编组为C#字符串

来自分类Dev

将带有char *的结构编组到C#

来自分类Dev

将具有嵌入式结构数组的结构编组为非托管代码

来自分类Dev

在C#中编组C数组-简单的HelloWorld

来自分类Dev

将浮点数组编组为结构数组而不复制吗?

来自分类Dev

将结构数组从c返回到c#

来自分类Dev

使用IntPtr将结构数组从C#传递到C ++

来自分类Dev

在 C# 中编组数组 - 为什么使用 AllocCoTaskMem 与 new []?

来自分类Dev

使用P / Invoke从C#将“ EGLRenderResolutionScaleProperty”编组到ANGLE

来自分类Dev

将结构数组从C#传递到Delphi

来自分类Dev

结构的多维数组C#

来自分类Dev

C ++ 11:将结构数组重新解释为结构成员数组

来自分类Dev

将数组操作从C ++重写为C#

Related 相关文章

  1. 1

    将C#结构编组为C ++ VARIANT

  2. 2

    我可以将数据从C / C ++结构编组为具有属性的C#结构吗?

  3. 3

    将复杂的结构编组到C#

  4. 4

    将具有固定大小的数组的C ++结构编组到C#中

  5. 5

    在 C# 中编组布尔数组与将单个布尔值(定义为 int)编组为 bool

  6. 6

    如何将C指针编组为C#的struct数组

  7. 7

    从C#到VC ++的结构体编组数组

  8. 8

    将C char [] []数组编组到C#

  9. 9

    在C#/ C ++之间编组复杂结构

  10. 10

    从C#到C编组复杂的结构

  11. 11

    将动态数组编组到C#委托(回调)

  12. 12

    将浮点数组编组到C#

  13. 13

    C#中结构内的嵌入式结构的编组数组

  14. 14

    将结构数组编组为不带父标记的xml

  15. 15

    如何将Python cv2.cv.LoadImage编组为C IplImage-> imageData结构

  16. 16

    将C Struct编组为C#委托的返回值

  17. 17

    无法使用Marshal.PtrToStringAuto(IntPtr)将C ++ char []编组为C#字符串

  18. 18

    将带有char *的结构编组到C#

  19. 19

    将具有嵌入式结构数组的结构编组为非托管代码

  20. 20

    在C#中编组C数组-简单的HelloWorld

  21. 21

    将浮点数组编组为结构数组而不复制吗?

  22. 22

    将结构数组从c返回到c#

  23. 23

    使用IntPtr将结构数组从C#传递到C ++

  24. 24

    在 C# 中编组数组 - 为什么使用 AllocCoTaskMem 与 new []?

  25. 25

    使用P / Invoke从C#将“ EGLRenderResolutionScaleProperty”编组到ANGLE

  26. 26

    将结构数组从C#传递到Delphi

  27. 27

    结构的多维数组C#

  28. 28

    C ++ 11:将结构数组重新解释为结构成员数组

  29. 29

    将数组操作从C ++重写为C#

热门标签

归档