Я уже несколько дней пытаюсь исправить сбои и отслеживаю его до импортированной неуправляемой функции 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 перед вызовом.