Вызов функции C ++, которая берет указатель на символ из C #

Я не могу понять, как передать char * в эту функцию C ++ из C #.

extern "C" __declspec(dllexport)
unsigned int extractSegment(char * startPoint, unsigned int sizeToExtract)
{
//do stuff
shared_ptr<std::vector<char>> content(new std::vector<char>(startPoint,startPoint+sizeToExtract));
//do more stuff
return content->size();
}

Эта функция используется для чтения сегмента из файла и выполнения некоторых двоичных операций над ним (почему я использую вектор символов). StartPoint — это начало сегмента, который я хочу прочитать. Я не могу изменить эту функцию.

В C # я пытался прочитать файл в массив byte [] и определить DllImport для использования StringBuilder, где экспорт имел char *. Я попытался назвать это так:

byte[] arr = File.ReadAllBytes(filename);
StringBuilder sb = new StringBuilder(System.Text.Encoding.Unicode.GetString(arr, startPoint,arr.Length - startPoiunt));
extractSegment(sb,200);

Это привело к SEHException.

0

Решение

char * может иметь несколько разных значений. В вашем случае это предопределенный и заполненный массив байтов, который используется в качестве входного параметра для extractSegment функция.

Эквивалентный метод C # тогда бы byte[] параметр, т.е.

[DllImport(...)]
public static extern int extractSegment(byte[] startPoint, uint sizeToExtract);

я использую byte[] потому что вы упоминаете бинарные операции, однако, если это на самом деле строка, вы также можете упорядочить ее, установив правильную кодировку в DllImport приписывать.


И просто для получения дополнительной информации, другие возможные варианты char * что я могу думать прямо сейчас ref byte, out byte, ref char, out char или же string, StringBuilder с другой стороны, используется, когда вызывающая функция выделяет и возвращает строку, т.е. char **,

1

Другие решения


По вопросам рекламы [email protected]