本人刚接触C#,遇到了这个问题,郁闷了好久。
C#要调用一个C/C++编写的dll,要传回很多信息(都是字符串类型),用过很多方法,都得不到dll里的信息(debug时,dll的功能都是正确的)
结构体声明
public struct res
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string sn;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string givenName;        ......        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
        public string memberOf;
    }

解决方案 »

  1.   


    c#里的声明
    [DllImport("my.dll", CharSet = CharSet.Ansi)]
    private extern static void ADSI_search(string address, string user, string pass, out res RESULT);C里的声明
    typedef struct 
        {
            char sn[16];        char givenName[16];
            ......
            char memberOf[64];
     }RES;
    ADSI_search(char * address, char * user, char * pass,RES *res)c#调用
    string addr="LDAP://192.168.0.1";
    string user="AA";
    string pass="123";
    public static res RESULT = new res();
    ADSI_search(addr, user, pass,out RESULT);
    在dll里res的结果都是对的,可是一传出来,就什么值都得不到了。
    不用out改用ref也同样得不到。
    急,请大家帮忙。
      

  2.   

    已经解决了。
    在C# 声明结构体之前需要
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    然后使用ref就可以传出了。
      

  3.   

    结构体在C# 和 C++里都要用到,所以不管在声明结构体的时候,还是声明调用函数的时候,都要声明
    CharSet   =   CharSet.Ansi
    至于在C# 里声明函数的时候,参数前面加上ref 表示传地址,是可以正常传出的。
      

  4.   

    结构体在C# 和 C++里都要用到,所以不管在声明结构体的时候,还是声明调用函数的时候,都要声明
    CharSet   =   CharSet.Ansi
    至于在C# 里声明函数的时候,参数前面加上ref 表示传地址,是可以正常传出的。
      

  5.   

    我也遇到同样问题 按楼主的方法未能解决 请帮忙看下
     
    c++中的结构体 方法
    typedef struct {
    unsigned char CityCode[2];
    unsigned char InstCode[2];
    unsigned char CardSerial[4];
    unsigned char CardMAC[4];
    unsigned char CardBelBef[4];
    unsigned char CardCounter[2];
    }STRU_CardINFO;int __stdcall Read_Purse_INFO(long hPort, unsigned char *CSN,STRU_CardINFO *CardINFO ,char *ErrCode);c#中我定义的结构体 方法
             [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
            public struct STRU_CARDINFO
            {
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
                public string CityCode;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
                public string InstCode;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
                public string CardSerial;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
                public string CardMAC;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 4)]
                public string CardBelBef;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
                public string CardCounter;
            }[DllImport("C:\Dll1.dll")]
    public static extern int Read_Purse_INFO(Int32 hPort, StringBuilder CSN, ref STRU_CARDINFO STRU_CardINFO, StringBuilder ErrCode);
      

  6.   

    我的调用
       StringBuilder csn = new StringBuilder();
       StringBuilder errCode = new StringBuilder();
       int hPort = 1;
       STRU_CARDINFO struParam = new STRU_CARDINFO();
       int x = Read_Module_Params(hPort, ref struParam, errCode);返回的struParam 里都是""