c#部分:结构声明:
[StructLayout(LayoutKind.Explicit, Size=96, CharSet=CharSet.Ansi)]
public struct HHNews_Head
{
 [FieldOffset(0)]public string re;
[FieldOffset(48)]public string code;
[FieldOffset(64)]public long tsflag;
[FieldOffset(80)]public short items;
[FieldOffset(82)]public short itemsize;
[FieldOffset(84)]public int  date;
[FieldOffset(88)]public int  time;
[FieldOffset(92)]public int  offset;
};调dll:
[DllImport("HQstruct.dll", EntryPoint="getNews_HeadStruct",CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int getNews_HeadStruct(string FileName, ref HHNews_Head pGetInfo);调用c中的函数:
HHNews_Head head = new HHNews_Head();
int n = getNews_HeadStruct("c:\\news.hni", ref head); 
// head得到的值不对,只有head.re有值,其余为0c的dll中结构定义及函数声明
struct HHNews_Head
{
    char  re[48];
    char  code[16];
    long  tsflag[4];
    short items;
    short itemsize;
    long  date;
    long  time;
    int   offset;
};extern "C" int __declspec(dllexport)getNews_HeadStruct(CString FileName, HHNews_Head ** pGetInfo);

解决方案 »

  1.   

    两者的数据类型,同名但不同内涵。string 最好用 byte[] 或者 StringBuilder
      

  2.   

    我把结构里的string改为byte[] 系统报错,内存越界?[StructLayout(LayoutKind.Explicit, Size=96, CharSet=CharSet.Ansi)]
    public struct HHNews_Head
    {
     [FieldOffset(0)]public byte[] re;
    [FieldOffset(48)]public byte[] code;
    [FieldOffset(64)]public long tsflag;
    [FieldOffset(80)]public short items;
    [FieldOffset(82)]public short itemsize;
    [FieldOffset(84)]public int  date;
    [FieldOffset(88)]public int  time;
    [FieldOffset(92)]public int  offset;
    };
      

  3.   

    应该是c#这边的代码有误,怀疑是数据没有对齐。
    c中的数据和c#中数据字长不等造成的,请高手解惑,急用。
      

  4.   

    lz:因为返回的数组是变长的,所以DllImport函数声明不能用数组作返回类型。
       必须使用IntPtr指针做返回值,然后用Marshal.PtrToStructure读取结构内容。代码如下:声明:
    public static extern int getNews_HeadStruct(string FileName, IntPtr pData);
    使用:
    HHNews_Head pGetInfo=new HHNews_Head();
    IntPtr ptr=IntPtr.Zero;
    int n = getNews_HeadStruct("c:\\news.hni", ptr); 
    Marshal.PtrToStructure(ptr,pGetInfo);