C# 取消结构指针数组的对齐
我需要使用C接口连接到第三方应用程序,但我迄今为止尝试的所有方法都是在使用C# 取消结构指针数组的对齐,c#,pinvoke,C#,Pinvoke,我需要使用C接口连接到第三方应用程序,但我迄今为止尝试的所有方法都是在使用ImageArray.images字段时使应用程序崩溃 其方法之一需要声明为以下结构: typedef struct { int size; Image **images; } ImageArray; int Segment(Image *image, ImageArray **images); Image类型是一个简单的结构,只有int字段(如宽度和高度): 可以首先解除对数组元素的限制,而不是解除对
ImageArray.images
字段时使应用程序崩溃
其方法之一需要声明为以下结构:
typedef struct {
int size;
Image **images;
} ImageArray;
int Segment(Image *image, ImageArray **images);
Image
类型是一个简单的结构,只有int
字段(如宽度和高度):
可以首先解除对数组元素的限制,而不是解除对图像
结构的引用,来访问图像。例如:
ImageArray imageArray = ... // initialize it somehow.
imageArray[0]->width
我试图从C#调用的函数声明为:
typedef struct {
int size;
Image **images;
} ImageArray;
int Segment(Image *image, ImageArray **images);
到目前为止,我已经声明了以下与本机库接口的结构和方法:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct Image
{
public int Width;
public int Height;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal unsafe struct ImageArray
{
public Int32 Size;
public IntPtr Images;
}
public static extern int Segment([In] ref Image image, [Out] out IntPtr images);
此外,我还实现了以下包装器,它会触发错误:
IntPtr imagesArrayPtr;
Segment(ref nImage, out imagesArrayPtr));
var imageArray = (ImageArray)Marshal.PtrToStructure(imagesArrayPtr, typeof(ImageArray));
var sz = imageArray.Size;
var ptr = imageArray.Images;
var images = new Image[imageArray.Size];
for (var i = 0; i < imageArray.Size; i++)
{
images[i] = (Image)Marshal.PtrToStructure(ptr, typeof(Image));
ptr = new IntPtr(ptr.ToInt32() + Marshal.SizeOf(typeof(IntPtr)));
}
函数
ImageLoadFromFile
在其第二个参数的第一个参数处加载指定的图像,如果成功(错误检查ommited),则返回true
。@我不熟悉C++/CLI。你能详细说明一下吗?C++不是一个选项(老板命令…)我添加了一个代码片段,显示对Segment()
方法的调用。谢谢你的时间!