c++中char*如何转换成c#

jsnjlhb 2011-03-15 11:07:50
上次发帖,问题还没有解决,只要重新发帖了。
现在需要调用c++中一个dll中函数

void Request (char* EntPara[in],char* RetPara[out],
Short *iRetValue[in,out]
)


我是这样转换的
 
[DllImport("XXX.dll")]
public static extern void Request(string EntPara, out StringBuilder RetPara, out int iRetValue);

但是运行的时候老是提示"未处理 System.AccessViolationException
Message="尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
后来我换成byte[],string 等还是不行
我想可能还是参数的传递有问题
请大家帮忙解决一下
...全文
963 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankbiao 2011-08-02
  • 打赏
  • 举报
回复
我也遇到同样问题,xxx。dll内的一个函数如下
1)、int USB_RequestEx(char * Result)
2)、用途及说明:将寻卡、防冲撞、选定卡封装在一起。用于返回选定卡的序列号
3)、参数:Result: 返回一个8位的卡id号
返回值(卡类型):-1通讯错误,
0无卡或数据错误,
1成功
2防冲撞失败,
3选定卡失败,
在c#中怎么获得Result值并转成string
jsnjlhb 2011-03-21
  • 打赏
  • 举报
回复
问题已经解决,原来对方不支持out
这样转换就可以了

DllImport("XXX.dll")]
public static extern void Request(string EntPara, StringBuilder RetPara, int[] iRetValue);

非常感谢大家的帮忙
脾气不坏 2011-03-15
  • 打赏
  • 举报
回复
记得是StringBuilder吧
不过好像string 一般也没问题的
参考

感觉你的可能不是参数的问题

jsnjlhb 2011-03-15
  • 打赏
  • 举报
回复
对方工程师说“StringBuilder是一个.net类,你传入dll不能识别的”
而且“.net 的string 和 c++的char *不是同一类型,string在.net还是一个类”
jsnjlhb 2011-03-15
  • 打赏
  • 举报
回复
我问了一下对方工程师,说RetPara传一个预先分配好空间的变量
坚守_永远 2011-03-15
  • 打赏
  • 举报
回复
string builder 也可以
lfqsy 2011-03-15
  • 打赏
  • 举报
回复
好像byte[]就可以啊
验证码识别 2011-03-15
  • 打赏
  • 举报
回复
RetPara = "000000000000000000000足够多的字符"
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复
根据你和那个工程师的描述,第一个参数有可能就是一个字符串,第二个参数可能也是一个字符串,第三个参数可能只是一个数字.修改为以下的可能也行

[DllImport("XXX.dll")]
public static extern void Request(string EntPara, StringBuilder RetPara, out short iRetValue);

static void Main(string[] args)
{
string entpara = "XXXXXXX";
StringBuilder retpara = new StringBuilder(1024);
short iretvalue = 1;
Request(entpara, retpara, out iretvalue);
Console.ReadLine();
}
lizhibin11 2011-03-15
  • 打赏
  • 举报
回复 1

[DllImport("XXX.dll")]
public static extern void Request(byte[] EntPara, byte[] RetPara, short[] iRetValue);

static void Main(string[] args)
{
//以下数组长度根据实际修改。
byte[] entpara = new byte[1024];//注意,这个要根据需要写入值
byte[] retpara = new byte[1024];//这里会被dll写入,调用后encoding类解码为字符串
short[] iretvalue = new short[1024];//这个也会被dll写入,调用后察看
Request(entpara, retpara, iretvalue);
Console.ReadLine();
}
  • 打赏
  • 举报
回复
不管.Net或C++,最终都是调用操作系统的API,.Net中是由CLR完成的,所以StringBuilder或string都可以char*通讯,建议你让对方减少参数数量,逐一测试,看是哪个参数出问题,注意那个int和short

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧