Передача записываемого массива строк в C ++ из C # через P / Invoke - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь передать записываемый (предварительно выделенный) строковый массив из C # в C ++ dll. Не удается выполнить «Место записи нарушения доступа».

C ++:

int StringArrayTest(size_t numberOfStrings, char **valueOut, size_t maxStringLength) {
    for (unsigned int i = 0; i < numberOfStrings; i++) {
        auto str = std::to_string(i); //Create simple string
        strncpy(valueOut[i], str.c_str(), maxStringLength); //Copy to output
    } 
    return 0;
}

C #:

[DllImport("MyDLL", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
static extern int StringArrayTest(ulong arraySize, [MarshalAs(UnmanagedType.LPArray)]StringBuilder[] valuesOut, ulong maxStringLength);

public string[] GetTestStrings(ulong arraySize, ulong maxStringLength) {
    var stringBuilder = new StringBuilder[(int)arraySize];
    for (var i = 0; i < (int)arraySize; i++) {
        stringBuilder[i] = new StringBuilder((int)maxStringLength);
    }
    var result = StringArrayTest(arraySize, stringBuilder, maxStringLength);
    var returnValues = new string[arraySize];
    for (var i = 0; i < (int)arraySize; i++) {
        returnValues[i] = result.ToString();
    }
    return returnValues;
}

Обратите внимание, что это делается с помощью одной строки (символ * подпись)и передача одного StringBuilder) работает как задумано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...