C# 传UTF8编码的string 给dll

u013330547 2014-11-18 10:32:04
一个字符串string name = “中文”;怎么传给dll,要UTF8的
...全文
309 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zq1564171310 2014-11-21
  • 打赏
  • 举报
回复
好像遇到过同样的问题,不知道是不是你想要的 http://bbs.csdn.net/topics/390933312
u013330547 2014-11-21
  • 打赏
  • 举报
回复
感谢10楼,貌似有用,具体需要进一步验证,谢谢!
layershow 2014-11-20
  • 打赏
  • 举报
回复

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
piblic byte[ ] name;

// 一般 C 那边的参数都会是 char * 对长度不敏感,只会按 C 格式字符串来处理
// 结构中如果是 char name[512] 这里你就不能定义为 1024,因为影响了你的结构布局
// SizeConst 这个写成 1024,那么 name 必须初始化为 1024 长度
name = new byte[1024];

// 也就不能再让 name 直接得到 GetBytes 的返回值
// 我记得 GetBytes 有重载是写入你自己的 byte[] 而不是获取一个返回的 byte[]
// 尾部清零,写入的长度应该是 UTF8.GetBytesCount() 吧?

// 另一种方式就用 Marshal 直接分配非托管内存,将数据 copy 过去
// C# 中会将参数声明为 IntPtr
// C# 的函数声明与 dll 中的函数声明没有什么必然对应关系,
// 你只要清楚在调用过程中托管内存与非托管内存之间传送了什么,都可以写出一个正确的 C# 声明并给出正确的值

相思梦 2014-11-19
  • 打赏
  • 举报
回复
引用 5 楼 u013330547 的回复:
dll定义了长度512 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string name; 或者 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] piblic byte[ ] name ; 都不行
你理解错了,C#不会因为你在结构体或引用类中定义了SizeConst 而在new时为你初始化,他这个东西有些内涵 只能将(结构整体)ref 传入类C/C++ DLL公开的API Function时 Net才会检查这地方是不是 空的如果是空的 Net会帮你赋值 因该说是Invoke在干这个事情 调试几下就懂了滴
by_封爱 版主 2014-11-18
  • 打赏
  • 举报
回复
看你DLL入库方法的参数啊... 难道 人家参数是string 你还傻傻的给人传byte[] ? 所以 如果对方是string 那么你直接就"中文" 如果是byte[] 就 Encoding.UTF8.GetBytes("中文")
bdmh 2014-11-18
  • 打赏
  • 举报
回复
传递byte数组,对方按utf8解码
layershow 2014-11-18
  • 打赏
  • 举报
回复
参数定义为 byte 数组,用 Encoding.UTF8.GetBytes(name) 得到的数组传给 dll
zq1564171310 2014-11-18
  • 打赏
  • 举报
回复
引用
Encoding.UTF8.GetBytes,然后还要注意,看那个dll的方法的设计,如果要一起传字符串的长度,那应该不需要0结尾,如果它没有要长度,就需要在最后拼一个0,要不然c那边会读到外面去。
读到是没有读到外面,只是根本无法封装到dll
u013330547 2014-11-18
  • 打赏
  • 举报
回复
打错了定义了1024
u013330547 2014-11-18
  • 打赏
  • 举报
回复
dll定义了长度512 [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)] public string name; 或者 [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] piblic byte[ ] name ; 都不行
winnowc 2014-11-18
  • 打赏
  • 举报
回复
Encoding.UTF8.GetBytes,然后还要注意,看那个dll的方法的设计,如果要一起传字符串的长度,那应该不需要0结尾,如果它没有要长度,就需要在最后拼一个0,要不然c那边会读到外面去。

110,572

社区成员

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

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

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