AccessViolationException при вызове метода DLLImport - PullRequest
0 голосов
/ 24 сентября 2018

Для Mifare Reader я получил пример кода с dll.В DemoApp все работает хорошо (WinForms), но когда я пытаюсь выполнить этот код в моем приложении .NET API, возникает AccessViolationException.

public string readBlock(String Block)
        {

            byte mode1 = (byte)0x00;
            byte mode2 = (byte)0x00;
            byte mode = (byte)((mode1 << 1) | mode2);
            byte blk_add = Convert.ToByte(Block, 16);
            byte num_blk = Convert.ToByte("01", 16);
            byte[] snr = new byte[6];
            snr = convertSNR("FF FF FF FF FF FF", 6);

            byte[] buffer = new byte[16 * num_blk];

            int nRet = MF_Read(mode, blk_add, num_blk, snr, buffer); 
}

[DllImport("function.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int MF_Read(byte mode, byte blk_add, byte num_blk, [In]byte[] snr, [In]byte[] buffer);

Я пытаюсь преобразовать byte [] в IntPtr с помощью GCHandle и Marshalно все еще не работает.

            byte[] buffer = new byte[16 * num_blk];
            GCHandle pinned = GCHandle.Alloc(buffer, GCHandleType.Pinned);
            IntPtr buff = pinned.AddrOfPinnedObject();
            GCHandle pinned2 = GCHandle.Alloc(snr, GCHandleType.Pinned);
            IntPtr snr1 = pinned2.AddrOfPinnedObject();
            int nRet = CardGate.MF_Read(mode, blk_add, num_blk, snr1, buff);
            pinned.Free();
...