Я пишу оболочку для DLL, которая управляет устройством OCR. В DLL есть метод, подпись которого похожа на следующее:
unsigned long aMethod(char **firstParameter, char **secondParameter);
aMethod возвращает строковые указатели на все параметры.
Я написал эту подпись в C#
... она почти функциональна:
[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl,
CharSet = CharSet.Auto)]
static unsafe extern ulong aMethod(ref IntPtr firstParameter,
ref IntPtr secondParameter);
Я делаю вызов следующим образом:
aMethod(ref firstParameter, ref secondParameter);
Маршаллинг и демаршаллинг, относящийся к строкам, выполняется так:
Marshal.PtrToStringAnsi(firstParameter)
Marshal.PtrToStringAnsi(secondParameter)
Очевидно, этот маршаллинг был выбран на основе соглашений API DLL.
Теперь процесс сортировки имеет проблему. Предположим, что устройство имеет вход с этой строкой "abcdefg". Если я использую DLL из чистого кода C ++, я получаю «abcdefg» в качестве вывода. Но если я использую подпись C #, которую я написал, строка теряет свой первый символ и выглядит как «bcdefg».
Что происходит не так? Как я могу исправить метод C #?