C# PInvoke,数据来回传输

C# PInvoke,数据来回传输,c#,c++,pinvoke,bytearray,dllimport,C#,C++,Pinvoke,Bytearray,Dllimport,我试图用p/Unjk调用C++中的C++函数。 匹配的C++函数如下: extern DECLSPEC int PQunescapeByteaWrapper(unsigned char* src, unsigned char* dst) { size_t dst_len; dst = PQunescapeBytea(src, &dst_len); return ((int)dst_len); } 还有C#的召唤: C++,我可以看到“Src”被正确地传输,并且“dST”也被计算出来,

我试图用p/Unjk调用C++中的C++函数。

匹配的C++函数如下:

extern DECLSPEC int PQunescapeByteaWrapper(unsigned char* src, unsigned char* dst)
{
size_t dst_len;
dst = PQunescapeBytea(src, &dst_len);
return ((int)dst_len);
}
还有C#的召唤:

<调试> C++,我可以看到“Src”被正确地传输,并且“dST”也被计算出来,但是当我跳回C++的时候,<>“dST”字节[] /<强>不持有<强>“dST”的无符号char数组>值,但是在c++ p/jck之前的原来的一个!! 如何转移计算值


,斯特凡

< P>你是C++方法签名,实现错误。您正在为参数分配一个新地址。你应该使用指向指针的指针

extern DECLSPEC int PQunescapeByteaWrapper(unsigned char* src, unsigned char** dst)
{
    size_t dst_len;
    *dst = PQunescapeBytea(src, &dst_len);
    return ((int)dst_len);
}

顺便说一句,你这里没有内存泄漏吗?您是打算覆盖dst引用的现有数组中的值,还是打算创建一个新数组并将其分配给dst?

我认为您应该这样编写,并将
dst
缓冲区分配到C#代码外部


在我看来,有几个问题

1) C#使用u stdcall调用C函数。 因此,您必须添加属性[DllImport(PATH,CallingConvention=CallingConvention.Cdecl)]或为C函数指定u stdcall属性

2) 如果需要传递数组,则不需要“ref”关键字

3)不能用C++分配的C语言数组。 您需要将其复制到托管内存(一个C#数组)中。 为此,您可以执行两个功能,例如。 一个计算新数组需要多少字符的函数。 另一个在目标数组中执行转换的

所以你可以这样做:

public static byte[] MyConvert(byte[] myArray)
{
    // Function defined in your C/C++ dll that compute how much space you need.
    int count = CountRequiredChars(myArray);

    byte[] myNewArray = new byte[count];

    // Function defined in your C/C++ dll that writes into myNewArray the output.
    PerformMyConversion(myArray, myNewArray);

    return myNewArray;
}

PerformMyConversion不能返回新数组,它必须将转换内容复制到输出参数中。

I打算覆盖现有数组。
ref byte[]dst
已在我的C#code中分配。你认为内存泄漏在哪里?@luckymanStefanc-这就是为什么我问我的问题;)可能是希望在C++方法中分配DST,并将其返回到C++,因为这就是C++方法的实现方式。如果您想将PUnescapeByteA的结果复制到预先分配的dst缓冲区中,您必须这样做。请参见另一个答案,以获取相关示例。如果您想在C++中分配一个新数组并返回到C++,请参阅我的答案,谢谢,现在它工作了。要理解,如果按照您的建议使用临时数组,有什么区别?
extern DECLSPEC int PQunescapeByteaWrapper(unsigned char* src, unsigned char** dst)
{
    size_t dst_len;
    *dst = PQunescapeBytea(src, &dst_len);
    return ((int)dst_len);
}
int PQunescapeByteaWrapper(unsigned char* src, unsigned char* dst, size_t maxlen)
{
   size_t dst_len = 0;
   unsgigned char* tmp = PQunescapeBytea( src, &dst_len );
   memcpy( dst, tmp, min( maxlen, dst_len ));
}
[DllImport(PATH)]
public static extern int MyFunction(byte[] src);

extern DECLSPEC int __stdcall MyFunction(unsigned char* src);
public static byte[] MyConvert(byte[] myArray)
{
    // Function defined in your C/C++ dll that compute how much space you need.
    int count = CountRequiredChars(myArray);

    byte[] myNewArray = new byte[count];

    // Function defined in your C/C++ dll that writes into myNewArray the output.
    PerformMyConversion(myArray, myNewArray);

    return myNewArray;
}