SajetConnectAdapter.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace MesAdaptor
  8. {
  9. public static class SajetConnectAdapter
  10. {
  11. [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  12. public static extern bool SajetTransStart();
  13. [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  14. public static extern bool SajetTransClose();
  15. //[DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  16. //public static extern bool SajetTransData(int command, IntPtr data, IntPtr length);
  17. [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  18. public static extern bool SajetTransData(int command, IntPtr data, IntPtr length);
  19. [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
  20. public static extern bool SajetTransData_C(int command, out string data);
  21. public static bool SajetTransData(int command, ref string data)
  22. {
  23. var idByte = Encoding.ASCII.GetBytes(data);
  24. var length = idByte.Length;
  25. var dataArrayLength = Math.Max(length, 200);
  26. var dataArray = new byte[dataArrayLength];
  27. Array.Copy(idByte, 0, dataArray, 0, length);
  28. IntPtr dataIntPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(dataArrayLength);
  29. System.Runtime.InteropServices.Marshal.Copy(dataArray, 0, dataIntPtr, dataArray.Length);
  30. IntPtr lengthIntPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(10);
  31. System.Runtime.InteropServices.Marshal.WriteInt32(lengthIntPtr, length);
  32. var sendResult = SajetConnectAdapter.SajetTransData(command, dataIntPtr, lengthIntPtr);
  33. var resultString1 = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(dataIntPtr);
  34. System.Runtime.InteropServices.Marshal.Copy(dataIntPtr, dataArray, 0, dataArrayLength);
  35. //System.Runtime.InteropServices.Marshal.Release(dataIntPtr);
  36. System.Runtime.InteropServices.Marshal.FreeCoTaskMem(dataIntPtr);
  37. var readLength = System.Runtime.InteropServices.Marshal.ReadInt32(lengthIntPtr);
  38. //System.Runtime.InteropServices.Marshal.Release(lengthIntPtr);
  39. var resultString = Encoding.ASCII.GetString(dataArray);
  40. data = resultString1.Substring(0, Math.Min(readLength, resultString1.Length));
  41. return sendResult;
  42. }
  43. }
  44. }