Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字节数组传递给PInvoke调用会将其更改为null_C#_.net_Arrays_Pinvoke_Marshalling - Fatal编程技术网

C# 将字节数组传递给PInvoke调用会将其更改为null

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

从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];
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

像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有找到非托管端。所以你只是在猜测有什么?像这样的问题确实需要界面的两面。你只展示了管理的一面。我在谷歌上搜索了非托管端,但我不能确定是否找到了正确的函数。不幸的是,我没有非托管端。所以你只是在猜那里有什么?