使用DLL编写C#程序,在DLL中有一结构,其中包含byte*变量,该变量存储字符串,图片或结构等信息,请问在C#中如何得到正确的信息。主要代码如下:
[StructLayout(LayoutKind.Sequential)] 
public struct LPRKERNEL
{
   public byte type; //数据类型
   public int dwDeviceId; //设备号码
   public int dwSerialNo; //识别序列号
   //[MarshalAs(UnmanagedType.LPStr)] public string pData; 数据----字符串正确
   unsafe public byte* pData; //数据
   public int cbData; //数据长度
   public int lParam; //数据类型相关数据
   public bool bError; //是否校验错误
}
public LPRKERNEL lprkernel = new LPRKERNEL();
Type mytype = lprkernel.GetType();
lprkernel =(LPRKERNEL)m.GetLParam(mytype);
可以得到lprkernel.pData(byte*类型),但如何转换为string,或图片,或结构?

解决方案 »

  1.   

    [MarshalAs(UnmanagedType.LPArray)]  
    public byte[] pData;byte[] 根据数据格式转换为string,或图片,或结构
      

  2.   

    谢谢楼上的,但修改后,错误如下:
    未处理的“System.TypeLoadException”类型的异常出现在 mscorlib.dll 中。
    其他信息: 无法封送类型 LPRKERNEL 的字段 pData:该类型无法作为结构字段进行封送处理。
      

  3.   

    dll中结构的参数怎么定义的?
    这里应该是MemoryCopy,你得到指针之后,还要知道Memory的长度,否则没有用。public int cbData; //数据长度
    这个字段应该是定义长度的,但是感觉不太对,通常传递的时候应该用ref cbData
      

  4.   

    如果封送和处理dou正确的话,
    检查cbData看否得到了正确的内存的长度
      

  5.   

    使用IntPtr和byte*一样,可是怎么转换为string呢,请教楼上的,谢谢
      

  6.   

    我的意思是用tostring()转换完之后,不是正确的字符串,好像是地址信息吧
      

  7.   

    new string (Encoding.Unicode.GetChars(<byte[]变量名>));
    不知有没有更简单的
      

  8.   

    fixed(byte * p = pData)
    { byte * p2 = p
      for(int i = 0;i < cbData;++i)
      { 
         // get the charater
         char c = (char) (*p2++);
         // your operation
      }
    }