[英]Using a C++ dll from C# - not getting expected results
int JPEG_CODEC_API jpeg_decompress(unsigned char *jpeg_buf,
unsigned long jpeg_len,
EImage_S** * img);
* @param jpeg_buf [in] JPEG buffer
* @param jpeg_len [in] JPEG buffer length
* @param img [out] decompress data
internal struct EImage_S
{
public byte[] imagedata;
public int image_size;
public int width;
public int height;
public int widthStep;
};
我这样宣布:
[DllImport("JpegLib.dll", CallingConvention = CallingConvention.Cdecl)] internal static extern int jpeg_decompress(byte[] jpeg_buf, uint jpeg_len, ref IntPtr Img);
EImage_S obj = (EImage_S)Marshal.PtrToStructure(ptr, typeof(EImage_S));
当我调用PtrToStructure时,由于“ Managed Debugging Assistant'FatalExecutionEngineError'已检测到问题”,因此出现错误。
我不确定出什么问题了!
您可以并且应该删除unsafe
关键字。 这里没有必要。
在p / invoke中错误地声明了第一个参数。 它应该是:
byte[] jpeg_buf
在p / invoke中,将ref
用作托管类型永远是不正确的。 本机函数无法创建.net托管类型。
最终参数也可能不正确。 我认为,不可能凭您提供的信息确定如何声明和管理该参数。 您需要向我们展示什么是Image_S
,并清楚说明该参数的语义。 谁分配内存? 分配了多少? 是数组吗? 如果没有,那是什么。 调用该函数的示例C ++代码将有所帮助。
您的更新将删除上述答案所基于的代码。 由于数组的原因,现在显示的结构无法编组。 这就是运行时错误所在。
我无法告诉您如何封送该结构,因为您尚未描述接口的本机方面。
要解决此问题,您需要了解本机方面。 您不能期望没有取得任何进展。 就像我在上面说的那样,调用此函数的本机代码示例可能会很清楚。
最后,为什么要使用此库而不是内置的托管类?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.