急!!请问C#怎么调用C++的dll,把字节数组(字节数组byte[]作为形参)传入C++?

weixin_41350689 2017-12-11 01:56:50
C++:
----------------------------------
extern "C" __declspec(dllexport) int index(char* a);
int __declspec(dllexport) index (char* a)
{
for (int i = 0; i < 10; i++)
{
cout << a[i] << endl;
}
return 0;
}

C#:
--------------------------------------
public void Main(string[] args)
{
[DllImport("DllTest1.dll", EntryPoint = "test")]
public static extern int test(byte[] a);

static void Main(string[] args)
{
byte[] a= new byte[10];
for(int i = 0; i < 10; i++)
{
a[i] = 3;
}
test(a);
}
}
这样字节数组传递不过去,请问C#用的是byte[],C++那边应该用什么类型来接收??
...全文
1316 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2017-12-12
  • 打赏
  • 举报
回复
引用 4 楼 xian_wwq 的回复:
c: char* <---> c#: string 或 stringbuilder 如果只是传入数据,那么使用string就可以; 如果需要返回数据,那么就使用stringbuilder,stringbuilder需要预先分配空间。 char* 都是以‘/0’为结尾,所以可以指定长度 ----------------->纠正:可以不指定长度 但凡提供给c#调用的,肯定需要对长度进行约定; p/Invoke调用,对于CharSet也需要特别注意, c#默认使用的是Unicode,c的api大多数都是Ansi的
char* 都是以‘/0’为结尾,所以可以指定长度 ----------------->纠正:可以不指定长度
xian_wwq 2017-12-12
  • 打赏
  • 举报
回复
c: char* <---> c#: string 或 stringbuilder 如果只是传入数据,那么使用string就可以; 如果需要返回数据,那么就使用stringbuilder,stringbuilder需要预先分配空间。 char* 都是以‘/0’为结尾,所以可以指定长度 但凡提供给c#调用的,肯定需要对长度进行约定; p/Invoke调用,对于CharSet也需要特别注意, c#默认使用的是Unicode,c的api大多数都是Ansi的
白衣如花 2017-12-12
  • 打赏
  • 举报
回复
nchar * c# byte取值 0-255,C++nchar取值也是0-255 但是C#数组有长度,C++指针没长度,所以函数应该定义两个参数,一个数据nchar*,一个长度int
weixin_41350689 2017-12-12
  • 打赏
  • 举报
回复
C#用的byte[],对应C++不知道用什么类型。。byte*试过了不行。。。
hhhhha123 2017-12-12
  • 打赏
  • 举报
回复
byte * ?
xian_wwq 2017-12-12
  • 打赏
  • 举报
回复
引用 9 楼 weixin_41350689 的回复:
感谢您的答复,C#那边是byte[]类型的,把byte[]传入到C++,然后C++那边在返回值过来,,,所以C#这边要把byte[]转成stringbuilder类型的吗?请问这要怎么转?
c++的定义是char* ,就用stringbuilder来转 如果是byte[]数组,那肯定还需要定义数组长度信息,否则只有个首地址,是没有办法操作的 传递数组,相当于传的是数组的首地址, C#需要使用Intptr, 使用Marshal.ReadXXX()系列函数读取, 写数据时使用Marshal.WriteXXX()系列函数
gh1223181184 2017-12-12
  • 打赏
  • 举报
回复
https://img-bbs.csdn.net/upload/201309/12/1378970955_506153.png 给我点分
weixin_41350689 2017-12-12
  • 打赏
  • 举报
回复
引用 4 楼 xian_wwq 的回复:
c: char* <---> c#: string 或 stringbuilder 如果只是传入数据,那么使用string就可以; 如果需要返回数据,那么就使用stringbuilder,stringbuilder需要预先分配空间。 char* 都是以‘/0’为结尾,所以可以指定长度 但凡提供给c#调用的,肯定需要对长度进行约定; p/Invoke调用,对于CharSet也需要特别注意, c#默认使用的是Unicode,c的api大多数都是Ansi的
感谢您的答复,C#那边是byte[]类型的,把byte[]传入到C++,然后C++那边在返回值过来,,,所以C#这边要把byte[]转成stringbuilder类型的吗?请问这要怎么转?
weixin_41350689 2017-12-12
  • 打赏
  • 举报
回复
引用 7 楼 u012948520 的回复:
[quote=引用 6 楼 weixin_41350689 的回复:]
typedef unsigned char nchar; nchar* 就是无符号char数组。 C++是两个参数,C#当然也用两个参数[/quote] 所以nchar*实际上就是unsigned char了,之前试过用这个类型接受过,但是不行。。。。
白衣如花 2017-12-12
  • 打赏
  • 举报
回复
引用 6 楼 weixin_41350689 的回复:
typedef unsigned char nchar; nchar* 就是无符号char数组。 C++是两个参数,C#当然也用两个参数
weixin_41350689 2017-12-12
  • 打赏
  • 举报
回复
引用 3 楼 u012948520 的回复:
nchar * c# byte取值 0-255,C++nchar取值也是0-255 但是C#数组有长度,C++指针没长度,所以函数应该定义两个参数,一个数据nchar*,一个长度int
感谢您的回答!请问nchar*是什么类型?在vs里面报错?是不是在上面代码中C#中应该改成public static extern int test(byte[] a);而C++中应该是int __declspec(dllexport) index (nchar* a,int length)来接收呢?

110,539

社区成员

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

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

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