У меня есть функция на C++ и экспортирована в DLL. функцияПередача указателя структуры, который содержит массив как параметр в C#
LONG LOGIN(LPDEVINFO info);
структура из LPDEVINFO
является:
struct{
BYTE sSerialNumber[20];
} *LPDEVINFO;
пройти LPDEVINFO
параметр, я определил класс в управляемом коде:
class DEVINFO{
Byte[] sSerialNumber = new Byte[20];
}
, а затем P/Invoke например:
[DllImport ('MyDll.dll')]
public static extern Int32 LOGIN(DEVINFO info);
, а затем вызвать его в C#:
DEVINFO info = new DEVINFO();
Int id = LOGIN(info)
Когда я запускаю этот код, я получил следующее сообщение об ошибке:
An unhandled exception of type 'System.AccessViolationException' occurred in WindowsFormsApplication1.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Я думаю, что проблема вызвана массивом sSerialNumber
. Но я не знаю, как правильно определить его.
Заранее благодарен!
Если 'LONG' определен как 64-разрядный целочисленный тип в C++, вам придется либо экспортировать эту функцию как' extern Int64 LOGIN (DEVINFO info); 'или' extern long LOGIN (информация DEVINFO); '. Что касается класса 'DEVINFO', я бы сделал его структурой и применил атрибут' [MarshalAs (UnmanagedType.ByValArray, SizeConst = 20)] 'к массиву байтов. [см. этот ответ] (http://stackoverflow.com/questions/1354275/marshaling-a-byte-array-to-ac-sharp-structure) –
@Jim 'LONG' - 32-битное целое число в C и C++ в Windows , –
А, я видел, как это переопределено. Я не знаю, почему это было бы. –