Массив StringBuilders, не работающий с P / Invoke - PullRequest
0 голосов
/ 08 октября 2019

Это было отмечено как дубликат Передача записываемого массива StringBuilder в C ++ из C # , но это вовсе не решает проблему использования StringBuilder[] и только комментирует неправильное использование wcsncpy и MarshalAs. Я даже не использую wcsncpy или MarshalAs где-либо в своем вопросе.


Итак, я пытаюсь использовать одну из моих функций C ++ в C #, например:

[DllImport("CPPDLLImport", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
static extern void StringBuilderArrayTest(StringBuilder[] text, int[] textLengths, int numberOfTextItems);

Теперь, обычно это нормально работает, конечно, но я не думаю, что получаю правильные данные в C ++ из text.

Итак, чтобы проверить это, я установилвверх по проекту P / Invoke.

Я вызываю метод в C #, используя это:

var stringBuilderArray = new StringBuilder[]
{
    new StringBuilder("abc"),
    new StringBuilder("def"),
    new StringBuilder("ghi")
};
var stringBuilderLengths = new int[3] { 3, 3, 3 };
StringBuilderArrayTest(stringBuilderArray, stringBuilderLengths, 3);

И это мой метод в C ++ - чтобы проверить его, я просто печатаю его вэкран, и чтобы убедиться, что он определенно не был printf, я буквально печатаю его посимвольно, чтобы быть уверенным:

EXPORT void StringBuilderArrayTest(wchar_t** text, int* textLengths, int numberOfTextItems) {
    for (int i = 0; i < numberOfTextItems; i++)
        for (int j = 0; j < textLengths[i]; j++)
    printf("%c", text[i][j]);
}

И, ну, параметр text - этоопределенно не прав. Это просто дает мне «ÇPÿ» три раза - определенно не строку «abc», «def» или «ghi».

Это просто не маршалинг массива StringBuilder правильно? Если так, как я могу получить этот массив строк?


ОБНОВЛЕНИЕ: ОК, я решил использовать string[] для отправки данных в мой код C ++, однако теперь мне нужно сделатьнаоборот - отправка данных из C ++ в C #. Итак, какие есть альтернативы использованию массива StringBuilder?

...