У меня есть библиотека C ++, в которой есть функция, которую я пытаюсь вызвать из приложения C #.
Вот код в заголовочном файле C ++
extern "C" _declspec(dllexport) int LabelStoringSSDsim(int devNum, UCHAR serial[40], UCHAR wwn[40],
UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode);
Вот код в исходном файле C ++
int LabelStoringSSDsim(int devNum, UCHAR serialLbl[40], UCHAR wwnLbl[40],
UCHAR ConfigID[5], UCHAR FrmRev[8], UCHAR DevName[40], int eCode)
{
string strConfigID="12111"; //5 bytes
string strFrmRev="1.25...."; //8 bytes
string strDevName="ABC-123................................."; //40 bytes
for (int i=0;i<5;i++)
ConfigID[i] = strConfigID[i];
for (int i=0;i<8;i++)
FrmRev[i] = strFrmRev[i];
for (int i=0;i<40;i++)
DevName[i] = strDevName[i];
return eCode;
}
Вот соответствующий код C #
[DllImport("LabelStoring.dll")]
static extern int LabelStoringSSDsim(
int devNum,
byte[] strserial,
byte[] strwwn,
[In] ref byte[] ConfigID,
[In] ref byte[] FrmRev,
[In] ref byte[] DevName,
int eCode
);
int errNum = LabelStoringSSDsim(devNum, bserial, bwwn, ref ConfigID, ref FrmRev, ref DevName, 123123);
Поэтому, когда я перехожу к последнему биту кода, я получаю сообщение «Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена». ошибка.
У меня нет предыдущего опыта импорта подобных библиотек DLL, и я много искал, но, похоже, не нашел решения проблемы.
Я попытался начать с нуля с простой функцией, возвращающей целое число, и это сработало. Затем я добавил int для передачи функции, и она все еще работала. Затем я добавил байтовый массив для передачи, и это сработало. Затем я попытался превратить этот массив байтов в ссылку, и это не удалось. Так что я предполагаю, что я получаю данные обратно неправильно.
Любая помощь приветствуется.