使用其参数可以在 c# 中作为 out 参数调用的函数创建 C++ dll

Create C++ dll with functions whose arguments can be called as out parameter in c#

我想在 c++ 中创建一个函数,它接受两个参数 (char[], int) 并修改参数(类似于 c# 中的 out 参数),然后创建一个可以在中使用的 dll c#.

C++ 示例代码:

static void funct(char * name, int size)
{
    char[] testName="John";
    name=&testName;
    size=5;
}

C# 示例代码:

  const string dllLocation = "D:\Test.dll";
  [DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
  private static extern void funct(StringBuilder name, int size);

这不是正确的代码。这只是为了让我知道我想要什么。我想用c#通过dll访问c++函数并获取名称和大小(字符数)。

在 C++ 端使用指针并在 C# 端通过 ref 编组这些指针。

static void funct(char** name, int* size)
{
    char[] testName="John";
    *name=&testName;
    *size=5;
}

const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size);

注意字符数组,它可能会造成内存泄漏或更糟的崩溃,如果有足够的空间,最好先测试缓冲区的大小和要传递给 C# 的数据的大小复制它,否则通知 C# 它需要更多大小,因此它由 C# 分配。

像这样:

static int funct(char** name, int* size, int bufferSize)
{
    if(bufferSize < 4)
        return 4;

    char[] testName="John";
    memcpy(name*, &char[0], 4);
    *size=5;
    return -1;
}


const string dllLocation = "D:\Test.dll";
[DllImport(dllLocation, CallingConvention = CallingConvention.Cdecl)]
private static extern void funct(ref StringBuilder name, ref int size, int bufferSize);

StringBuilder sb = null;
int size = 0;

//Request size
int neededSize = funct(ref sb, ref size, 0);
//Create buffer with appropiate size
sb = new StringBuilder(neededSize);
//Call with the correct size, test result.
if(funct(ref sb, ref size, neededSize) != -1)
    throw new Exception();