gpt4 book ai didi

C# 编码(C# 调用 C++ DLL)

转载 作者:行者123 更新时间:2023-11-30 05:10:24 24 4
gpt4 key购买 nike

你们能帮我解决以下问题吗?我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com