本人刚接触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;
}
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;
}
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也同样得不到。
急,请大家帮忙。
在C# 声明结构体之前需要
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
然后使用ref就可以传出了。
CharSet = CharSet.Ansi
至于在C# 里声明函数的时候,参数前面加上ref 表示传地址,是可以正常传出的。
CharSet = CharSet.Ansi
至于在C# 里声明函数的时候,参数前面加上ref 表示传地址,是可以正常传出的。
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);
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 里都是""