繁体   English   中英

使用C#中的C ++ dll-无法获得预期的结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM