Для 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();