我一直在尝试从C#代码调用ImageMagick库中的NewPixelRegionIterator函数,并且一直遇到参数传递问题。
更具体地说,这是NewPixelRegionIterator的定义:
PixelIterator NewPixelRegionIterator(MagickWand *wand,const ssize_t x,
const ssize_t y,const size_t width,const size_t height)
以下是将此函数导入C#代码的代码:
[DllImport("libMagickWandDev.so")]
internal static extern PixelIterator NewPixelRegionIterator(IntPtr MagickWand,
IntPtr left, IntPtr top, UIntPtr width, UIntPtr height);
我导入 libMagickWandDev.so 而不是 libMagickWand.so 的事实是因为libMagickWandDev.so是在启用调试支持的情况下编译的,因此我可以使用gdb运行mono知道问题是否在C函数的调用中(事实上它是)。
通过gdb找到的问题是,当调用NewPixelRegionIterator时,例如:
PixelIterator PixIt = PixelIteratorImports.NewPixelRegionIterator(MagickWandPtr,
new IntPtr(x), new IntPtr(y), new UIntPtr(1), new UIntPtr(1));
通过gdb找到的实际参数是:
Breakpoint 1, NewPixelRegionIterator (wand=0x7fffffffc7a8, x=10744336, y=5,
width=6, height=1) at wand/pixel-iterator.c:418
再一次,先谢谢。
答案 0 :(得分:2)
您确定可以从PInvoke函数返回结构吗?你不需要使用参数/指针返回它吗?
因为参数被移位,我希望PixelIterator *类型的隐藏参数作为第一个或最后一个参数。还有一种回归式的虚空。这就是C编译器在底层实现结构返回功能的方法。
在评论中,您解释说返回PixelIterator *可以解决问题。原因可能是C函数正在分配一个对象并返回它的指针。虽然定义没有给出一个线索,但是......无论如何,当你完成返回的对象时,你可能需要释放内存。