Я не могу понять, как передать 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.
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 **
,