C# 调用Delphi dll
delphi dll 源码:
library dllres; type char10 = array[0..9] of char; TMydata = packed record id: Integer; name: char10; married: Boolean; salary: Double; end; PMydata = ^TMydata; const RESSTR: array[0..4] of string = ('HELLO', 'COLOR', 'DELPHI', 'shared', 'library'); NO_RESULT= 'no result'; var mydata: TMydata; {$R *.res} // 返回字符串指针 function getResStr(aindex: Integer): PChar; stdcall; begin if aindex < Length(RESSTR) then begin Result := pchar(RESSTR[aindex]); end else begin Result := pchar(NO_RESULT); end; end; // 返回结构体指针 function getMydata: PMydata; stdcall; begin with mydata do begin id := 123; name := 'obama'; married := false; salary := 1200; end; Result := @mydata; end; exports getResStr, getMydata; begin end.
C# 调用示例:
class Invoke_Delphi_Dll_Exam { [DllImport("dllres.dll", CallingConvention = CallingConvention.StdCall)] public static extern IntPtr getResStr(int index); [DllImport("dllres.dll", CallingConvention = CallingConvention.StdCall)] public static extern IntPtr getMydata(); public struct Mydata { public int id; //0 public string name; //4 public bool married; //24 public double salary; //25 public Mydata(byte[] data) { if (data != null && data.Length == 33) { id = BitConverter.ToInt32(data, 0); name = Encoding.Unicode.GetString(data, 4, 20).Replace("\0",""); // 去掉尾部的0字符 married = BitConverter.ToBoolean(data, 24); salary = BitConverter.ToDouble(data, 25); } else { id = 0; name = String.Empty; married = false; salary = 0; } } public override string ToString() { return String.Format("id: {0}, name: {1}, married: {2}, salary: {3}", id, name, married, salary); } } private static void Main(string[] args) { Console.WriteLine(Marshal.PtrToStringAuto(getResStr(0))); byte[] data = new byte[33]; Marshal.Copy(getMydata(), data, 0, 33);
Mydata mydata = new Mydata(data); Console.WriteLine(mydata); } }
~做事情贵在坚持~