Это было отмечено как дубликат Передача записываемого массива 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
?