急!!请问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++那边应该用什么类型来接收??
...全文
684 11 1 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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)来接收呢?
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-12-11 01:56
社区公告

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