你们能帮我解决以下问题吗?我有一个 C++ 函数 dll,它将被另一个 C# 应用程序调用。我需要的功能之一如下:
unsigned long makeArray(unsigned char* sendArr, unsigned long sendArrLen, unsigned char *recvArr, unsigned long *recvArrLen);
我用 C# 编写了以下代码:
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern ulong makeArray(byte[] sendArr, ulong sendArrLen, byte[] recvArr, ulong recvArrLen);
private byte[] MakeArray()
{
byte[] arrSend = new byte[] { 0x00, 0x12, 0x34 };
ulong nRecvArrLen = 0;
byte[] arrRecv = null; // assign in c++ dll function (variable size)
if(makeArray(arrSend, (ulong)arrSend.Length, arrRecv, nRecvArrLen) == 1)
{
return arrRecv;
}
return null;
}
不幸的是,上面的代码不起作用... 我可以知道如何将指针传递给 C++ func 吗?如果不可能,是否有任何解决方法?
谢谢。
最佳答案
unsigned long
在MSVC中是一个32位的无符号整数,所以应该映射到System.UInt32
.NET类型,对应uint
C# 中的关键字。
C#的ulong
是一个无符号的64位整数,对应MSVC的unsigned __int64
或者unsigned long long
。
我应该在 C# PInvoke 声明中使用 ref
映射 unsigned long *recvArrLen
参数,因为您有一个通过指针的间接级别。
似乎 arrRecv
数组参数应该由调用者(在您的情况下为 C#)分配,并由 DLL 函数填充。
如果 DLL 函数分配缓冲区,您应该添加另一层间接(unsigned char **recvArr
),并且您应该提供释放分配内存的方法(例如,DLL 应该导出还有释放功能)。
我会为 PInvoke 尝试这样的东西:
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint makeArray(
byte[] sendArr,
uint sendArrLen,
[Out] byte[] recvArr,
ref uint recvArrLen
);
关于C# 编码(C# 调用 C++ DLL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704321/