C# PInvoke 传递无符号字符 *
C# PInvoke pass out unsigned char*
我正在尝试用 C++ 创建一个简单的 dll,并使用 PInvoke 从 C# 调用它。我想传入一个字节数组,对其进行一些操作,然后发回另一个字节数组。我想我会传入框架和大小,然后创建一个非托管的 unsigned char*。我会把它传回一个 out IntPtr 和 return 大小。然后我会用另一个函数释放那个内存。一切正常,除了我无法让 out IntPtr 工作。我总是只得到 0 回来。我在 qt 中创建了我的 C++ dll。这是我目前的代码。
#pragma once
#ifdef TOOLS_EXPORTS
#define TOOLS_API __declspec(dllexport)
#else
#define TOOLS_API __declspec(dllimport)
#endif
class Tools
{
public:
int TOOLS_API TestFunction(const unsigned char *inData, int inSize, unsigned char *outData);
};
#include "Tools.h"
int Tools::TestFunction(const unsigned char *inData, int inSize, unsigned char* outData)
{
outData = (unsigned char*)malloc(sizeof(unsigned char) * inSize);
memcpy(outData, inData, sizeof(unsigned char) * inSize);
return inSize;
}
[DllImport("Tools.dll", EntryPoint = "?TestFunction@Tools@@QAEHPBEHPAE@Z", CallingConvention = CallingConvention.StdCall)]
public static extern int TestFunction(byte[] inData, int inSize, out IntPtr outData);
IntPtr outData;
int test = TestFunction(data, data.Length, out outData);
您的最终参数为:
unsigned char* outData
这是一个指针,按值传递。调用者看不到地址的任何修改,因为地址是按值传递的。
您需要return您分配给调用者的内存地址。所以你需要:
unsigned char** outData
然后在 C++ 代码中实现该函数时,将对 outData
的引用替换为 *outData
。
根据定义 sizeof(unsigned char) == 1
,将 sizeof(unsigned char) * inSize
替换为 inSize
是惯用的。
我正在尝试用 C++ 创建一个简单的 dll,并使用 PInvoke 从 C# 调用它。我想传入一个字节数组,对其进行一些操作,然后发回另一个字节数组。我想我会传入框架和大小,然后创建一个非托管的 unsigned char*。我会把它传回一个 out IntPtr 和 return 大小。然后我会用另一个函数释放那个内存。一切正常,除了我无法让 out IntPtr 工作。我总是只得到 0 回来。我在 qt 中创建了我的 C++ dll。这是我目前的代码。
#pragma once
#ifdef TOOLS_EXPORTS
#define TOOLS_API __declspec(dllexport)
#else
#define TOOLS_API __declspec(dllimport)
#endif
class Tools
{
public:
int TOOLS_API TestFunction(const unsigned char *inData, int inSize, unsigned char *outData);
};
#include "Tools.h"
int Tools::TestFunction(const unsigned char *inData, int inSize, unsigned char* outData)
{
outData = (unsigned char*)malloc(sizeof(unsigned char) * inSize);
memcpy(outData, inData, sizeof(unsigned char) * inSize);
return inSize;
}
[DllImport("Tools.dll", EntryPoint = "?TestFunction@Tools@@QAEHPBEHPAE@Z", CallingConvention = CallingConvention.StdCall)]
public static extern int TestFunction(byte[] inData, int inSize, out IntPtr outData);
IntPtr outData;
int test = TestFunction(data, data.Length, out outData);
您的最终参数为:
unsigned char* outData
这是一个指针,按值传递。调用者看不到地址的任何修改,因为地址是按值传递的。
您需要return您分配给调用者的内存地址。所以你需要:
unsigned char** outData
然后在 C++ 代码中实现该函数时,将对 outData
的引用替换为 *outData
。
根据定义 sizeof(unsigned char) == 1
,将 sizeof(unsigned char) * inSize
替换为 inSize
是惯用的。