大道至简,知易行难
广阔天地,大有作为

全网首发:.Net中调用Go语言DLL时使用GoString的正确姿势(解决.Net中调用Go语言DLL时中文乱码和Unicode的异常问题)

在Golang生成的DLL桩代码中,我们可以看到各Go语言基础类型的对应定义(以下为64位系统的):

其中,第一个就是GoString的定义:

在《Golang编译成DLL文件》一文中给出了一个GoString在C#中的实现:

GoString在C#中的错误定义

GoString在C#中的错误定义

这种方式对于英文字符串而言没有问题,但对于中文字符串而言则会导致抛出异常:

C#调用Golang的DLL时GoString字符串中文乱码及异常

C#调用Golang的DLL时GoString字符串中文乱码及异常

其中,fmt.Printf的乱码是由于Console不支持UTF8编码,无甚大碍。而该异常:

表示遇到了非法的Unicode CodePoint。然而,搜遍全网均未找到该问题与Golang相关的结果。

实际上,虽然字符串在Go语言内部是使用UTF编码的,但转成DLL后其编码格式变为UTF-8,故而GoString的正确定义应该是:

C#中正确的GoString定义

C#中正确的GoString定义

由于使用了运算符重载,因而我们可以像使用普通字符串一样的方式使用GoString了,而且不会有乱码和异常问题:

参考资料:
1、https://zhuanlan.zhihu.com/p/46979047
2、https://github.com/Baozisoftware/go-dll/wiki/C%23%E8%B0%83%E7%94%A8Go%E7%89%88DLL%E7%9A%84%E5%AE%8C%E6%95%B4%E7%A4%BA%E4%BE%8B

转载时请保留出处,违法转载追究到底:进城务工人员小梅 » 全网首发:.Net中调用Go语言DLL时使用GoString的正确姿势(解决.Net中调用Go语言DLL时中文乱码和Unicode的异常问题)

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址