本帖最后由 ztfljy 于 2014-11-13 21:22:11 编辑

解决方案 »

  1.   

    StructLayout的约定最好声明完整
    例如 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]在结构体中嵌套结构体,没有特殊的写法
    直接写就可以
       public struct SServer
        {
           public SAdvance m_advanceCfg;
        }char[] 也可以用string来对应         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 19)]
            public string mStrTemp;
      

  2.   

    把char改为byte就对了。其它的看似正常
      

  3.   

    [StructLayout(LayoutKind.Sequential)]
    public struct OBE{
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)]
    public string a;
    public byte b;
    public UInt16 c;

     
    //外层结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct CARD{
    public UInt32 d;
    public OBE ObeInfo;
    }
      

  4.   

    以上几种方法挨个都试过了,仍然报AccessViolationException异常。
    继续求答案。
      

  5.   

    函数调用时实例化外层结构体CARD时需要先实例化内层结构体OBE么?
    CARD Card = new CARD;
    Card.d = 123;OBE Obe = new OBE();
    Obe.a = "aaa";
    Obe.b = 123;
    Obe.c = 456;函数调用:
    FunctionA(ref Card);这样写是否有问题?
      

  6.   

    [StructLayout(LayoutKind.Sequential, CharSet= CharSet.Ansi)]
    public struct OBE{
    [MarshalAs(UnmanagedType.ByValTStr,SizeConst=19)]
    public string a;
    public sbyte b;
    public UInt16 c;

      
    //外层结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct CARD{
    public UInt32 d;
    public OBE ObeInfo;
    }
      

  7.   

    现已明确知道是内层结构体不正确,把内层结构体注掉后对方返回参数错误的errorCode,不报异常。
      

  8.   

    你调用的时候有给结构体分配内存吗,Marshal.AllocHGlobal?如果你内存都没分配就访问,会抛出异常。
    下面的几个函数你可能需要:
    Marshal.AllocHGlobal
    Marshal.PtrToStructure
    Marshal.StructureToPtr
    Marshal.FreeHGlobal
    参考: C#调用C++的DLL 所有数据类型转换方式
    Marshalling Complicated Structures using PInvoke
      

  9.   


    我参考你给的第二条链接里面第一句话是
    我理解是内层结构体的指针在外层结构体里面,而不是结构体本身。
    我这个DLL定义里被嵌套的结构体用的不是指针吧?所以我不确定应不应该使用你提供的四个方法。
      

  10.   

    肯定要实例化,
    否则返回的数据写的非法地址去了
    代码似乎少了一句
    Card.ObeInfo = new OBE();
      

  11.   

    谢谢提醒,是我写错了。但是问题不在这。找于问题的根源了,DLL接口的其它参数传的有问题,非结构体的问题,
    谢谢各位的热心,一百分平均分给回答的各位。