C++ 写的DLL,但是遇到有CString 类型,调用发生错误,经查,各位高手都说需要在C++ 里将其改为char *;我的C++函数如下:
BYTE SecurityAccess (BYTE Level,char* keyorseed) //designed at 2008.9.22 
 {
                    InitSendFrame(2);//初始化CAN桢
                    Sendframeinfo.Data[0] =0X02;
                    Sendframeinfo.Data[1] =0X27;
                    Sendframeinfo.Data[2] =Level;// 55 普通权限   57开发权限
                    Sendframeinfo.Data[3] =0XFF;
                    Sendframeinfo.Data[4] =0XFF;
  Sendframeinfo.Data[5] =0XFF;
  Sendframeinfo.Data[6] =0XFF;
  Sendframeinfo.Data[7] =0XFF;
  CleanReceive15765Data();//清除接收缓冲区对应的数据
  if(SendData())//下发数据成功
  {
  int timecount =0;
  do
  {
  Sleep(10);
  timecount++;
  if(Re15765framinfo->Data[1]==0x67)
  { 
  CString temp1,temp2,temp3;
  temp1 = IntToHex(Re15765framinfo->Data[3],1);
  temp2 = IntToHex(Re15765framinfo->Data[4],1);
  temp3 = temp1+temp2;
  keyorseed = temp3.GetBuffer(temp3.GetLength()); 
                                                //现在将其改为char*
  return  1;
  }
  if(Re15765framinfo->Data[0]==0X7F)
  {
  return 0;//反馈
  }
  }while(timecount <100);
  return 254;//反馈数据超时1000ms
  }
  else
  {
  return 255;//物理连接断开,下发数据不成功
  }  
  }
如上,本来原来的函数返回值是CString ,以及参数keyorseed 也是CString 为了在C#里调用,我返回值改成 BYTE, keyorseed 改为了char *请问该如何在C#里对此函数操作??
我的方法:
byte Response;
char[] Receivepump = new char[10];
fixed (char* bf = &Receivepump[0])
Response = CANLINK.SecurityAccess(2, 0x57, bf);编译成功,经执行,发现Receivepump  里的值并没变化。
请问高手,SecurityAccess 该如何在C#里调用,而且在C# 里如何把char* 转换为string 呢??或者告诉可行的C++ 函数返回值与参数都带有CString 类型,该如何更改以便于c#调用.希望有做过CString 调用的赐教

解决方案 »

  1.   

    如何把char* 转换为string 呢??
    C++里直接写就OK了,但是C#该如何把char* 转string 呢?
      

  2.   

    char[]   i;   
    string   sj   =   new   String(i);
      

  3.   

    固定长度的字符串用类似的方式定义
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
        public struct Parameter
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string Name;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
            public string Value;
        };但非固定长度的字符串就必须把每个字节从内存拷贝出来了。很多文章都介绍了具体实现,比如: http://www.seoszcn.com/article/csharp/csharp2009061903.asp
      

  4.   

    我也碰到很多这样的问题,看来很多项目里还是少不了C++啊,而且核心功能基本上都是由C/C++完成的
      

  5.   

    c#里keyorseed参数声明为StringBuilder
      

  6.   

    string a =new string(char*)