如何 DllImport char*

How to DllImport char*

我有一个像这样的 C++ 函数:

myExport.h

extern "C" { __declspec(dllexport) const int Run(char *input, char *output, int *length); }

myExport.cpp

const int Run(char *input, char *output, int *length) {

    std::ostringstream value;
    value
        << "FOO" << "|"
        << "BAR" << "|";

    auto str = value.str();

    auto i = stdext::checked_array_iterator<char*>(output, str.length());
    std::copy(str.begin(), str.end(), i);
    output[str.length()] = '[=11=]';

    return 1;
}

在 C# 中我有:

myImport.cs

[DllImport("MyExport.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int Run(
    [MarshalAs(UnmanagedType.LPStr)]string input,
    StringBuilder output,
    ref int length);

public static string Execute(string input)
{
    var length = 1024;
    var output = new StringBuilder(1024);
    var result = Run(input, output, ref length);
    return output.ToString();
}

但是,输出缓冲区总是空的。我做错了什么?

由于第二个参数的类型是char *,DLL函数会填充传递过来的缓冲区,C#声明应该如下:

[MarshalAs(UnmanagedType.LPStr)]System.Text.StringBuilder output