将字符串数组从C ++传递到C#

时间:2015-09-25 15:58:46

标签: c# c++ marshalling

我已经编写了这段代码,工作正常:
C ++代码

extern "C"
{
    const MYLIBRARY_EXPORT char* giefStrPlx(char* addon)
    {
        return addon;
    }
}

C#代码

[DllImport("ClassLibrary1")]
private static extern IntPtr giefStrPlx(string x);

void Start()
{

    IntPtr stringPtr = giefStrPlx("Huntsman");
    string huntsman = Marshal.PtrToStringAnsi(echoedStringPtr);
}

huntsman包含“Huntsman”。

我的问题是为字符串数组做类似的事情。我写了以下函数

extern "C"
{
    const MYLIBRARY_EXPORT bool fillStrArray(char** lizt, int* length)
    {
        char* one = "one";
        char* two = "two";
        char* three = "three";

        lizt[0] = one;
        lizt[1] = two;
        lizt[2] = three;

        *length = 3;
    }
}

然后我尝试在C#中编写以下代码

[DllImport("ClassLibrary1")]
private static extern bool fillStrArray(ref IntPtr array, ref int length);

void Start()
{
    IntPtr charArray = IntPtr.Zero;
    int charArraySize = 0;
    fillStrArray(ref charArray, ref charArraySize);

    IntPtr[] results = new IntPtr[charArraySize];
    Marshal.Copy(charArray, results, 0, charArraySize);

    foreach (IntPtr ptr in results)
    {
        string str = Marshal.PtrToStringAnsi(ptr);
    }
}

哪个不起作用。所以现在我对如何实现这一点感到有些失落。

1 个答案:

答案 0 :(得分:1)

以下是我从CLR到std :: string以及从std :: string到string CLR的两个辅助函数

std::string CLROperations::ClrStringToStdString(String^ str)
{
    if (String::IsNullOrEmpty(str))
        return "";

    std::string outStr;
    IntPtr ansiStr = System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str); 
    outStr = (const char*)ansiStr.ToPointer(); 
    System::Runtime::InteropServices::Marshal::FreeHGlobal(ansiStr); 
    return outStr;
}

String ^ CLROperations::StdStringToClr(std::string str)
{
    return gcnew String(str.c_str());
}

要使用字符串列表,您需要使用List<String^>^注意大写字符串。对于std :: string的列表,请使用std::vector<std::string>