从DLL中调用C#中的C++函数 - 奇怪的参数

Vla*_*adN 2 c# c++ com dll

我有一个用C++写的函数和下一个标题:

void EncodeFromBufferIN(void* bufferIN,int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
Run Code Online (Sandbox Code Playgroud)

我已经像这样编辑了.h和.cpp文件,以便能够通过在C#中导入DLL来调用该函数:

**EncodeFromBufferIN.h**
extern "C" {
     __declspec(dllexport) void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize);
}
**EncodeFromBufferIN.cpp**
extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, unsigned char*  &bufferOUT, int &bufferOUTSize){
    // stuff to be done
}
Run Code Online (Sandbox Code Playgroud)

但现在我的问题是我不知道如何在C#中调用该函数.我在C#中添加了下一个代码,但不确定如何将参数传递给函数.

[DllImport("QASEncoder.dll")]
        unsafe public static extern void EncodeFromBufferIN(void* bufferIN, int bufferINSize, out char[] bufferOUT, out int bufferOUTSize);
Run Code Online (Sandbox Code Playgroud)

bufferIN和bufferOUT应该是字符串,但如果我调用这样的函数:

public string prepareJointsForQAS()
{
   string bufferIN = "0 0 0 0 0";
   char[] bufferOUT;
   int bufferOUTSize;
   EncodeFromBufferIN(bufferIN, bufferIN.Length, bufferOUT, bufferOUTSize);
}
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:"最好的重载方法matrch for ...有一些无效的参数".那么参数应该如何传递?

ren*_*ick 5

编组在C Style调用中效果最佳.因此最好在公共接口上使用纯C.如果完全可以将本机代码更改为

void EncodeFromBufferIN(
    unsigned char* bufferIN, 
    int bufferINSize, 
    unsigned char* bufferOUT,     
    int* bufferOUTSize);
Run Code Online (Sandbox Code Playgroud)

然后可以在C#中调用

[DllImport("QASEncoder.dll")]
public static extern void EncodeFromBufferIN(
    String bufferIN, 
    int bufferINSize, 
    StringBuilder bufferOUT, 
    ref int bufferOUTSize);

String inStr = new String(255);
int inSize = 255;
// make an educated estimate for the output size 
// and preallocate in C# (I am guessing 255)
StringBuilder outStr = new StringBuilder(255);
int outSize = 255;

EncodeFromBufferIN(inStr, inSize, outStr, outSize);
Run Code Online (Sandbox Code Playgroud)

这样就可以避免非托管代码中的内存分配(虽然可行)可能会变得混乱.

希望这能让你前进.