使用SWIG将错误的值作为参数传递给C库

在我之前的 三篇 文章之后 ,我现在可以将一个托管数组的struct传递给我的包装方法。 以下是文件摘录:

// packer.i typedef struct { int width; // input int height; // input frame_t view; // output frame_t dest; // output } image_t; CSHARP_ARRAYS(image_t, image_t) %apply image_t INOUT[] { image_t *images } int pack(image_t *images, int nb_images, parameters_t params); 

使用此签名生成一个函数:

 // packer_cs.cs public static int pack(image_t[] images, int nb_images, parameters_t arg2) 

我称之为:

 // Program.cs var files = Directory.GetFiles("./images"); var images = new image_t[files.Length]; for (var f = 0; f < files.Length; f++) { using (var imgInfo = Image.FromFile(files[f])) { var imgStruct = new image_t() { width = imgInfo.Width, height = imgInfo.Height, dest = new frame_t(), view = new frame_t() }; images[f] = imgStruct; } } var result = packer_cs.pack(images, images.Length, new parameters_t()); 

一切都很好,但是当我运行pack()方法时,我有一个受保护的内存访问问题( System.AccessViolationException )。 值得庆幸的是,我可以访问C库的源代码,并且只要我启用非托管代码调试,Visual Studio就会自动打开它以进行调试和单步执行。

所以,如果我在pack()函数的开头添加断点,并且我使用手表来检查images[x] ,我可以看到宽度和高度值与提供的内容无关(有时它甚至是均匀的) 0或负数)。 这是怎么回事 ? 如果我在C#端检查我的托管数组,则会正确存储和检索这些值。 为什么C没有得到正确的价值? 其他参数(nb_images和params)没有任何问题。

谢谢 !

请执行下列操作:

  1. 检查images[f].width和height是否具有您期望的值
  2. 如果是,则检查SWIG生成的代码以validation是否正确复制了这些字段。
  3. 如果你不能通过查看代码发现任何问题,你应该打破packer_cs.pack并使用调试器来查看将C#数组复制到C ++数组的包装器代码,看看有什么问题。

这可能是字体图中不正确的内容。 一旦你知道那是什么,你就可以将来自SWIG源(csharp_array.i文件)的类型映射代码复制到.i中的新类型映射,并根据需要进行修复。