C# 传UTF8编码的string 给dll解决办法

C# 传UTF8编码的string 给dll
一个字符串string name = “中文”;怎么传给dll,要UTF8的
------解决思路----------------------
参数定义为 byte 数组,用 Encoding.UTF8.GetBytes(name) 得到的数组传给 dll
------解决思路----------------------
传递byte数组,对方按utf8解码
------解决思路----------------------
看你DLL入库方法的参数啊...

难道 人家参数是string 你还傻傻的给人传byte[] ?

所以 如果对方是string 那么你直接就"中文" 如果是byte[] 就 Encoding.UTF8.GetBytes("中文")
------解决思路----------------------
Encoding.UTF8.GetBytes,然后还要注意,看那个dll的方法的设计,如果要一起传字符串的长度,那应该不需要0结尾,如果它没有要长度,就需要在最后拼一个0,要不然c那边会读到外面去。
------解决思路----------------------
引用
Encoding.UTF8.GetBytes,然后还要注意,看那个dll的方法的设计,如果要一起传字符串的长度,那应该不需要0结尾,如果它没有要长度,就需要在最后拼一个0,要不然c那边会读到外面去。

读到是没有读到外面,只是根本无法封装到dll

------解决思路----------------------
引用:
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在干这个事情
调试几下就懂了滴
------解决思路----------------------

[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# 声明并给出正确的值


------解决思路----------------------
好像遇到过同样的问题,不知道是不是你想要的
http://bbs.csdn.net/topics/390933312