zoukankan      html  css  js  c++  java
  • 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字符
                        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); } }
  • 相关阅读:
    Error Creating Deployment 有关Tomcat配置问题
    XML约束
    动态代理的一些问题。
    内部类的原理理解
    子父类覆盖方法和实现接口时牵扯到的细节问题。
    JavaSE 复习_4 接口多态和内部类
    JavaSE复习_3 继承
    JavaSE复习_2 对象与类
    JavaSE复习_1 Java的基本格式和运算符
    Linux 添加用户(user),组(Group)以及权限(Permission)
  • 原文地址:https://www.cnblogs.com/csMapx/p/csharp_delphi_dll.html
Copyright © 2011-2022 走看看