当前位置:编程学习 > C#/ASP.NET >>

c# 调用delphi dll 传结构体参数

Delphi里的一个结构如下:   
      TParaBuf=record   
          ComNo:integer;                 //串口号   
          Baud:integer;                   //波特率   (一般设为115200)   
          Sys_Sec:array   [1..3]   of   integer;       //系统扇区1,2,3   (一般设为0,1,2)   
          User_Sec:array   [1..3]   of   integer;       //用户扇区1,2,3   (一般设为3,4,5,可以自由设置)   
          AuthorNo:array   [1..6]   of   PChar;           //授权码1,2,3,4,5,6   (该授权码由授权卡内的授权码计算得到。)   
      end;   
    
      TPParaBuf=^TParaBuf; //指向以上结构的指针。   
  我要在C#里改写 ,该怎么传呢,望赐教,在线等啊,不好意思,分就这么多了 --------------------编程问答-------------------- 自己先顶一下 --------------------编程问答-------------------- 哎,一看就知道是弄IC卡的.弄发卡器吧.
TParaBuf=record  
          ComNo:integer;                //串口号  
          Baud:integer;                  //波特率  (一般设为115200)  
          Sys_Sec:array  [1..3]  of  integer;      //系统扇区1,2,3  (一般设为0,1,2)  
          User_Sec:array  [1..3]  of  integer;      //用户扇区1,2,3  (一般设为3,4,5,可以自由设置)  
          AuthorNo:array  [1..6]  of  PChar;

结构体对齐就是内存要对齐.它这里使用了默认的DELPHI字节对齐方式,你在定义结构体的时候也要.
按照上面的定义一个C#版本,然后packed = 4就可以了. --------------------编程问答--------------------
引用 2 楼 gxj760998 的回复:
哎,一看就知道是弄IC卡的.弄发卡器吧.
TParaBuf=record 
          ComNo:integer;                //串口号 
          Baud:integer;                  //波特率  (一般设为115200) 
          Sys_Sec:array  [1..3]  of  integer;      //系统扇区1,2,3  (一般设为0,1,2) 
          User_Sec:array  [1..3]  of  integer;      //用户扇区1,2,3  (一般设为3,4,5,可以自由设置) 
          AuthorNo:array  [1..6]  of  PChar;

结构体对齐就是内存要对齐.它这里使用了默认的DELPHI字节对齐方式,你在定义结构体的时候也要.
按照上面的定义一个C#版本,然后packed = 4就可以了.

我这样定义的,不知对不对
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
        public struct TParaBuf
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public int ComNo;
            [MarshalAs(UnmanagedType.LPStr)]
            public int Baud;
            [MarshalAs(UnmanagedType.LPStr)]
            public int Sys_Sec;
            [MarshalAs(UnmanagedType.LPStr)]
            public int User_Sec;
            [MarshalAs(UnmanagedType.LPStr)]
            public string AuthorNo;

        } --------------------编程问答--------------------
引用 2 楼 gxj760998 的回复:
哎,一看就知道是弄IC卡的.弄发卡器吧.
TParaBuf=record 
          ComNo:integer;                //串口号 
          Baud:integer;                  //波特率  (一般设为115200) 
          Sys_Sec:array  [1..3]  of  integer;      //系统扇区1,2,3  (一般设为0,1,2) 
          User_Sec:array  [1..3]  of  integer;      //用户扇区1,2,3  (一般设为3,4,5,可以自由设置) 
          AuthorNo:array  [1..6]  of  PChar;

结构体对齐就是内存要对齐.它这里使用了默认的DELPHI字节对齐方式,你在定义结构体的时候也要.
按照上面的定义一个C#版本,然后packed = 4就可以了.

我这样定义的,不知对不对
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
        public struct TParaBuf
        {
            [MarshalAs(UnmanagedType.LPStr)]
            public int ComNo;
            [MarshalAs(UnmanagedType.LPStr)]
            public int Baud;
            [MarshalAs(UnmanagedType.LPStr)]
            public int Sys_Sec;
            [MarshalAs(UnmanagedType.LPStr)]
            public int User_Sec;
            [MarshalAs(UnmanagedType.LPStr)]
            public string AuthorNo;

        }
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,