Я пытаюсь передать записываемый (предварительно выделенный) строковый массив из 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) работает как задумано.