本帖最后由 nancliu 于 2010-07-23 14:55:40 编辑

解决方案 »

  1.   

    private static extern int INIT_rs(int fd, ref int RSUStatus,StringBuilder RSUInfo, int TimeOut);
      

  2.   

     int r = INIT_rs(lfd, iStatus, sbInfo, TimeOut);
    iStatus 前面少了个ref,编译通过了?
      

  3.   


    前面加ref了,只是我贴过来的时候弄错了
      

  4.   

    没测试,这样试试看可以不可以。[DllImport("Comm.dll")]
    private static extern int INIT_rs(long fd, byte[] RSUStatus,StringBuilder RSUInfo, int TimeOut);
    //函数
    public int myINIT_rs(long fd,ref int Status,StringBuilder Info)
    {
    int TimeOut = 1000;
    long lfd = fd;
    StringBuilder sbInfo = new StringBuilder();
    byte[] bStatus = new byte[4];
    int r = INIT_rs(lfd, iStatus, bStatus, TimeOut); /////运行到这里出错
    Status = BitConvert.ToInt32(bStatus,0);
    Info = sbInfo;
    return r;
    }
      

  5.   


    试了,没有取回数据来,不知道是怎么回事. RSUINFO返回的string是空的
      

  6.   

    RSUInfo的内容定义:
    返回的RSU 信息(16 字节:厂商,1 字节;R编码,3; 版本号,2 字节;保留字
    节, 10 字节)
      

  7.   

    我觉得你这里应该不是传入stringbuilder,应该是一个string吧,而已还要初始化并指定的长度
    string Info = new string(Convert.ToChar(" "), 512);
    C++里面是一个指针,Info要初始化了之后才有一段地址
    我之前调用都是这样的
      

  8.   

    Out的参数不是用stringbuilder修饰吗
      

  9.   

    private static extern int RSU_INIT_rs(int fd, byte[] pRSUStatus, byte[] pRSUInfo, int TimeOut);
    问题解决,但还是不清楚为何不能用StringBuilder
      

  10.   

    数据结构不同啊,CHAR *就是对应C#中的BYTE[]数组啊
      

  11.   

    字符串没有 MarshalAs,这样就可以了:[DllImport("Target.dll")]
            public static extern int INIT_rs(int fd,
                ref int Status,            [MarshalAs(UnmanagedType.LPStr)]
                StringBuilder str, 
                
                int TimeOut);详情参考:p/invoke 使用方法万惊油
      

  12.   

      StringBuilder sbInfo = new StringBuilder(1024);
    试试看
      

  13.   

    请注意C++的PASCAL修饰符在C#中表示方法。
    CallingConvention = CallingConvention.Pascal