I have done a bit of interop mapping, here is the basic mappings. [DllImport("Prodave6.dll",EntryPoint="LoadConnection_ex6",ExactSpelling=true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] private static extern int LoadConnection_ex6(ushort ConNr,char[] pAccessPoint, int ConTableLen,byte[] ConTable); [DllImport("Prodave6.dll",EntryPoint="UnloadConnection_ex6",ExactSpelling=true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] private static extern int UnloadConnection_ex6(ushort ConNr); [DllImport("Prodave6.dll",EntryPoint="SetActiveConnection_ex6",ExactSpelling=true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] private static extern int SetActiveConnection_ex6(ushort ConNr); [DllImport("Prodave6.dll",EntryPoint="db_read_ex6",ExactSpelling=true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] private static extern int db_read_ex6(ushort no_of_db,byte datatype,ushort startaddr, ref uint read_request_length,uint bufferlength, byte[] buffer,ref uint returnlength); [DllImport("Prodave6.dll",EntryPoint="db_write_ex6",ExactSpelling=true,CharSet=CharSet.Ansi,CallingConvention=CallingConvention.Cdecl)] private static extern int db_write_ex6(ushort no_of_db,byte datatype,ushort startaddr, ref uint write_request_length,uint bufferlength, byte[] buffer); //Connection creation char[] pAccessPoint={'S','7','O','N','L','I','N','E'}; byte[] conn = new byte[] {10,140,132,6,0,0,2,3,0}; int length = (int)conn.Length; res=LoadConnection_ex6((ushort)0, pAccessPoint,length,conn); //Simple read operation - buffer is a byte array int res = 0; uint amount_to_read = (uint)buffer.Length; try{ res = db_read_ex6(no_of_db,type,start_address_in_db,ref amount_to_read,(ushort)buffer.Length,buffer,ref realread); }