private static extern int INIT_rs(int fd, ref int RSUStatus,StringBuilder RSUInfo, int TimeOut);
int r = INIT_rs(lfd, iStatus, sbInfo, TimeOut); iStatus 前面少了个ref,编译通过了?
前面加ref了,只是我贴过来的时候弄错了
没测试,这样试试看可以不可以。[DllImport("Comm.dll")] private static extern int INIT_rs(long fd, byte[] RSUStatus,StringBuilder RSUInfo, int TimeOut); //函数 public int myINIT_rs(long fd,ref int Status,StringBuilder Info) { int TimeOut = 1000; long lfd = fd; StringBuilder sbInfo = new StringBuilder(); byte[] bStatus = new byte[4]; int r = INIT_rs(lfd, iStatus, bStatus, TimeOut); /////运行到这里出错 Status = BitConvert.ToInt32(bStatus,0); Info = sbInfo; return r; }
我觉得你这里应该不是传入stringbuilder,应该是一个string吧,而已还要初始化并指定的长度 string Info = new string(Convert.ToChar(" "), 512); C++里面是一个指针,Info要初始化了之后才有一段地址 我之前调用都是这样的
Out的参数不是用stringbuilder修饰吗
private static extern int RSU_INIT_rs(int fd, byte[] pRSUStatus, byte[] pRSUInfo, int TimeOut); 问题解决,但还是不清楚为何不能用StringBuilder
数据结构不同啊,CHAR *就是对应C#中的BYTE[]数组啊
字符串没有 MarshalAs,这样就可以了:[DllImport("Target.dll")] public static extern int INIT_rs(int fd, ref int Status, [MarshalAs(UnmanagedType.LPStr)] StringBuilder str,
iStatus 前面少了个ref,编译通过了?
前面加ref了,只是我贴过来的时候弄错了
private static extern int INIT_rs(long fd, byte[] RSUStatus,StringBuilder RSUInfo, int TimeOut);
//函数
public int myINIT_rs(long fd,ref int Status,StringBuilder Info)
{
int TimeOut = 1000;
long lfd = fd;
StringBuilder sbInfo = new StringBuilder();
byte[] bStatus = new byte[4];
int r = INIT_rs(lfd, iStatus, bStatus, TimeOut); /////运行到这里出错
Status = BitConvert.ToInt32(bStatus,0);
Info = sbInfo;
return r;
}
试了,没有取回数据来,不知道是怎么回事. RSUINFO返回的string是空的
返回的RSU 信息(16 字节:厂商,1 字节;R编码,3; 版本号,2 字节;保留字
节, 10 字节)
string Info = new string(Convert.ToChar(" "), 512);
C++里面是一个指针,Info要初始化了之后才有一段地址
我之前调用都是这样的
问题解决,但还是不清楚为何不能用StringBuilder
public static extern int INIT_rs(int fd,
ref int Status, [MarshalAs(UnmanagedType.LPStr)]
StringBuilder str,
int TimeOut);详情参考:p/invoke 使用方法万惊油
试试看
CallingConvention = CallingConvention.Pascal