Проблема с C # <-> C ++ DLLImport «Попытка чтения или записи в защищенную память».

У меня есть библиотека 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 для передачи функции, и она все еще работала. Затем я добавил байтовый массив для передачи, и это сработало. Затем я попытался превратить этот массив байтов в ссылку, и это не удалось. Так что я предполагаю, что я получаю данные обратно неправильно.

Любая помощь приветствуется.

6
задан Chris 14 January 2019 в 18:52
поделиться