C # Передача беззнакового символа * в C для записи - PullRequest
0 голосов
/ 30 марта 2019

Я уже несколько дней пытаюсь исправить сбои и отслеживаю его до импортированной неуправляемой функции C (импортируемой управляемым C #).

__int32 __stdcall Foo (uchar* pBuffer);

pBuffer должен быть выделен C # и передан в Foo(). Foo() пишет pBuffer и возвращает. Данные в pBuffer затем анализируются, побайтно (8 бит) и pBuffer затем могут быть отброшены. Значения байтов, записанные Foo(), находятся в полном диапазоне от 0 до 255.

Я пытался:

[DllImport(SCD_DLL_NAME, CallingConvention = CallingConvention.StdCall)]
private static extern __int32 Foo ([MarshalAs(UnmanagedType.LPStr)] StringBuilder pBuffer);

var pBuffer = new StringBuilder(375);
Foo(pBuffer);

Это запускает функцию, извлекает данные, и я могу анализировать их побайтово. Но как только я инициализирую другой несвязанный объект C # сбой. Сначала я подумал, что это что-то с этим другим объектом, но я случайно получаю «нарушение доступа к памяти» или «исключения переполнения стека» в зависимости от времени и того, какой код C # я включаю / отключаю.

Как только я не позвоню Foo(), проблема исчезнет.

Я также пробовал:

private static extern __int32 Foo (ref byte[] pBuffer);
private static extern __int32 Foo ([Out] byte[] pBuffer);
private static extern __int32 Foo ([In,Out] byte[] pBuffer);

C # не является моим основным языком (я более знаком с c / c ++), поэтому я не уверен, как сделать этот импорт и pBuffer правильное распределение.

[EDIT] Просто чтобы заявить об очевидном, я выделяю pBuffer перед вызовом.

...