using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace MesAdaptor { public static class SajetConnectAdapter { [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern bool SajetTransStart(); [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern bool SajetTransClose(); //[DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] //public static extern bool SajetTransData(int command, IntPtr data, IntPtr length); [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern bool SajetTransData(int command, IntPtr data, IntPtr length); [DllImport("SajetConnect.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern bool SajetTransData_C(int command, out string data); public static bool SajetTransData(int command, ref string data) { var idByte = Encoding.ASCII.GetBytes(data); var length = idByte.Length; var dataArrayLength = Math.Max(length, 200); var dataArray = new byte[dataArrayLength]; Array.Copy(idByte, 0, dataArray, 0, length); IntPtr dataIntPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(dataArrayLength); System.Runtime.InteropServices.Marshal.Copy(dataArray, 0, dataIntPtr, dataArray.Length); IntPtr lengthIntPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(10); System.Runtime.InteropServices.Marshal.WriteInt32(lengthIntPtr, length); var sendResult = SajetConnectAdapter.SajetTransData(command, dataIntPtr, lengthIntPtr); var resultString1 = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(dataIntPtr); System.Runtime.InteropServices.Marshal.Copy(dataIntPtr, dataArray, 0, dataArrayLength); //System.Runtime.InteropServices.Marshal.Release(dataIntPtr); System.Runtime.InteropServices.Marshal.FreeCoTaskMem(dataIntPtr); var readLength = System.Runtime.InteropServices.Marshal.ReadInt32(lengthIntPtr); //System.Runtime.InteropServices.Marshal.Release(lengthIntPtr); var resultString = Encoding.ASCII.GetString(dataArray); data = resultString1.Substring(0, Math.Min(readLength, resultString1.Length)); return sendResult; } } }