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

标签 c# c++ dll marshalling

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

相关文章:

c# - 如何取消订阅使用 lambda 表达式的事件?

c++ - 指向const对象的指针可以改变对象吗?

c# - 使用 System.Reflection 从 DLL 程序集中获取 DataMember

c++ - 从存档加载 DLL

c# - 为什么我在 Datagrid 中已经有了 Columnheader?

c# - 如何使用 TcpListener 监听多个 IP?

c# - 如何打开进程并使整个类(class)都可以使用 Steam 读/写器

c++ - 使用 QTableWidget 排序

c++ - 三元运算符在递归中的奇怪行为

java - Java中卸载dll