C# 将字节数组传递给PInvoke调用会将其更改为null
从Visual Studio 2012迁移到2013后,一些PInvoke调用不再像以前那样工作 例如,我正在努力处理以下代码: 签名:C# 将字节数组传递给PInvoke调用会将其更改为null,c#,.net,arrays,pinvoke,marshalling,C#,.net,Arrays,Pinvoke,Marshalling,从Visual Studio 2012迁移到2013后,一些PInvoke调用不再像以前那样工作 例如,我正在努力处理以下代码: 签名: [DllImport(LzoDll64Bit)] private static extern int lzo1x_decompress(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem); 用法: byte[] dst = new byte[origlen]; i
[DllImport(LzoDll64Bit)]
private static extern int lzo1x_decompress(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
用法:
byte[] dst = new byte[origlen];
int outlen = origlen;
if (Is64Bit())
lzo1x_decompress(src, src.Length - 4, dst, ref outlen, _workMemory);
else
lzo1x_decompress32(src, src.Length - 4, dst, ref outlen, _workMemory);
预计lzo1x_解压(…)以填充新初始化的字节[]dst数组,但在VS 2013中,奇怪的行为是调用该函数后,dst数组变为空值,而不是填充
此外,整个应用程序状态似乎是稳定的,在此期间没有发生错误
是什么导致了这种情况,或者如何避免这种情况,甚至调试出了什么问题?您的做法似乎是错误的。看到您根据代码是32位还是64位来切换行为,这是一个令人担忧的迹象。这是一个明显的迹象,表明你出了什么问题。我相信非托管声明是这样的:
int lzo1x_decompress(const unsigned char *in, size_t in_len,
unsigned char *out, size_t *out_len, unsigned char *wrkmem);
对于32位和64位代码,匹配的p/invoke声明为:
[DllImport(LzoDll, CallingConvention=CallingConvention.Cdecl)
static extern int lzo1x_decompress(byte[] in, IntPtr in_len,
[Out] byte[] out, ref IntPtr out_len, byte[] wrkmem);
您的代码错误地将
int
用于两个size\u t
参数。现在,size\u t
是Windows上的指针大小,因此匹配类型是IntPtr
你似乎走错了方向。看到您根据代码是32位还是64位来切换行为,这是一个令人担忧的迹象。这是一个明显的迹象,表明你出了什么问题。我相信非托管声明是这样的:
int lzo1x_decompress(const unsigned char *in, size_t in_len,
unsigned char *out, size_t *out_len, unsigned char *wrkmem);
对于32位和64位代码,匹配的p/invoke声明为:
[DllImport(LzoDll, CallingConvention=CallingConvention.Cdecl)
static extern int lzo1x_decompress(byte[] in, IntPtr in_len,
[Out] byte[] out, ref IntPtr out_len, byte[] wrkmem);
您的代码错误地将
int
用于两个size\u t
参数。现在,size\u t
是Windows上的指针大小,因此匹配类型是IntPtr
你似乎走错了方向。看到您根据代码是32位还是64位来切换行为,这是一个令人担忧的迹象。这是一个明显的迹象,表明你出了什么问题。我相信非托管声明是这样的:
int lzo1x_decompress(const unsigned char *in, size_t in_len,
unsigned char *out, size_t *out_len, unsigned char *wrkmem);
对于32位和64位代码,匹配的p/invoke声明为:
[DllImport(LzoDll, CallingConvention=CallingConvention.Cdecl)
static extern int lzo1x_decompress(byte[] in, IntPtr in_len,
[Out] byte[] out, ref IntPtr out_len, byte[] wrkmem);
您的代码错误地将
int
用于两个size\u t
参数。现在,size\u t
是Windows上的指针大小,因此匹配类型是IntPtr
你似乎走错了方向。看到您根据代码是32位还是64位来切换行为,这是一个令人担忧的迹象。这是一个明显的迹象,表明你出了什么问题。我相信非托管声明是这样的:
int lzo1x_decompress(const unsigned char *in, size_t in_len,
unsigned char *out, size_t *out_len, unsigned char *wrkmem);
对于32位和64位代码,匹配的p/invoke声明为:
[DllImport(LzoDll, CallingConvention=CallingConvention.Cdecl)
static extern int lzo1x_decompress(byte[] in, IntPtr in_len,
[Out] byte[] out, ref IntPtr out_len, byte[] wrkmem);
您的代码错误地将
int
用于两个size\u t
参数。现在,size\u t
是Windows上的指针大小,因此匹配类型是IntPtr
像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有非托管端。所以你只是在猜那里有什么?