Type
  TParaBuf=record
    ComNo:integer;        //串口号
    Baud:integer;         //波特率
    Sys_Sec:array [1..3] of integer;   //系统扇区1,2,3
    User_Sec:array [1..3] of integer;   //用户扇区1,2,3
    AuthorNo:array [1..6] of PChar;     //授权码1,2,3,4,5,6
  end;
  TPParaBuf=^TParaBuf; 
如题。

解决方案 »

  1.   

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    public int[3] Sys_Sec;
    public int[3] User_Sec;
    public int[6] AuthorNo;
                       }
      

  2.   

    语法错误。public int[3] Sys_Sec;
    public int[3] User_Sec;
    public int[6] AuthorNo;
    C#不可以这样定义数组的。
      

  3.   

    int[] myArray = new int [5];
      

  4.   

    public struct TParaBuf
    {
        public int ComNo;
        public int Baud;
        public int[] Sys_Sec;
        public int[] User_Sec;
        public string[] AuthorNo;
    }
      

  5.   

    public struct TParaBuf
    {
        public int ComNo;
        public int Baud;
        public int[] Sys_Sec = new int[3];
        public int[] User_Sec = new int[3];
        public string[] AuthorNo = new string[6];
    }
      

  6.   

    结构(strauct)里不能定义数组的长度,应该在外面new的时候定义它们的长度.
      

  7.   

    如果和串口通讯还是不成功,还是在Delphi里写好DLL,然后在C#里调用吧.这样简单一些.
      

  8.   

    没错,现在正是delphi写好的dll,可以有一个函数要有这样结构的参数。所以很烦。
      

  9.   

    public struct TParaBuf
    {
        public int ComNo;
        public int Baud;
        public int[] Sys_Sec;
        public int[] User_Sec;
        public string[] AuthorNo;
    }
      

  10.   

    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    public int[] Sys_Sec;
    public int[] User_Sec;
    public string[] AuthorNo;
    }
      

  11.   

    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    public int[] Sys_Sec;
    public int[] User_Sec;
    public string[] AuthorNo;
    }
    这种方法我试过了。int还行。数组,就无法识别了。
      

  12.   

    有没有什么方法,可以让delphi识别到。数组。
      

  13.   

    你可以找类似的api函数的例子参看一下
      

  14.   

    好象是这样,我不记得PChar是什么类型了,看前面的都定为string,就顺着写了:
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    public int[] Sys_Sec, User_Sec;
    [MarshalAs(UnmanagedType.LPStr, SizeConst=6)]
    public string[] AuthorNo;
    }
      

  15.   

    不好意思,DELPHI真实忘得差不多了,它的integer类型应该对应int16吧:
    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Ansi)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    public System.Int16[] Sys_Sec, User_Sec;
    [MarshalAs(UnmanagedType.LPStr, SizeConst=6)]
    public string[] AuthorNo;
    }
      

  16.   

    integer对应的是Int32 好的我试试: Brunhild() 的方法。
      

  17.   

    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Ansi)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    public System.Int16[] Sys_Sec, User_Sec;
    [MarshalAs(UnmanagedType.LPStr, SizeConst=6)]
    public string[] AuthorNo;
    }
    用这个方法会说对像没有实例化。
      

  18.   

    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Ansi)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    public int[] Sys_Sec, User_Sec;
    [MarshalAs(UnmanagedType.LPStr, SizeConst=6)]
    public string[] AuthorNo;
    }
    ------------------------------------
    TParaBuf a=new TParaBuf();
    a.ComNo=*;
    a.Baud=*;
    a.Sys_Sec=new int[]{*,*,*};
    a.User_Sec=new int[]{*,*,*};
    a.AuthorNo=new string[]{...};
    然后将参数传入函数不行吗?
      

  19.   

    用Brunhild()的方法最接近了不过会提示“用未将对象引用设置到对象的实例。”
      

  20.   

    我试过了会出现。"无法封送类型 Carddll.TParaBuf 的字段 AuthorNo:该类型无法作为结构字段进行封送处理。"的错误信息。
      

  21.   

    在delphi中如何调用的(结构中 AuthorNo是调用方分配,还是调用的函数分配)
    可以参考
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconstructssample.htm另外结构中的数组可以分开写(幸好不是255长的数组,呵呵)[StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    public int Sys_Sec1;
    public int Sys_Sec2;
    public int Sys_Sec3;
    public int User_Sec1;
    public int User_Sec2;
    public int User_Sec3;
    public string AuthorNo1;
    public string AuthorNo2;
    public string AuthorNo3;
    public string AuthorNo4;
    public string AuthorNo5;
    public string AuthorNo6;
    }
      

  22.   

    function ReadAuthorCard(buf:TPParaBuf):integer;stdcall;external 'pcsCardDll.dll';
      buf1:TParaBuf;
    begin
      buf1.ComNo:=strtoint(edComNo.Text);
      buf1.Baud:=strtoint(edBaud.Text);
      buf1.Sys_Sec[1]:=strtoint(cbSysSec1.Text);
      buf1.Sys_Sec[2]:=strtoint(cbSysSec2.Text);
      buf1.Sys_Sec[3]:=strtoint(cbSysSec3.Text);
      buf1.AuthorNo[1]:=stralloc(17);
      buf1.AuthorNo[2]:=stralloc(17);
      buf1.AuthorNo[3]:=stralloc(17);
      ReadAuthorCard(@buf1);
    Delphi里是这样调的。
      

  23.   

    [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet=CharSet.Ansi)]
    public struct TParaBuf
    {
    public int ComNo;
    public int Baud;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=3)]
    public int[] Sys_Sec, User_Sec;
    [MarshalAs(UnmanagedType.ByValArray ,ArraySubType=UnmanagedType.LPStr , SizeConst=6),]
    public StringBuilder[] AuthorNo;
    }
      

  24.   

    调用
    TParaBuf tpb = new TParaBuf();
    tpb.Baud = 9600;
    tpb.ComNo = 1;

    tpb.Sys_Sec = new int[3];
    tpb.Sys_Sec[0] = 1;
    tpb.Sys_Sec[1] = 2;
    tpb.Sys_Sec[2] = 3; tpb.AuthorNo = new StringBuilder[6];
    tpb.AuthorNo[0] = new StringBuilder(17);
    tpb.AuthorNo[1] = new StringBuilder(17);
    tpb.AuthorNo[2] = new StringBuilder(17); ReadAuthorCard(ref tpb);
      

  25.   

    public struct TParaBuf
    {
         public int ComNo;
         public int Baud;
         public int[] Sys_Sec;
         public int[] User_Sec;
         public string[] AuthorNo;
    }