C#调用Go版DLL
2021-03-07 19:28
标签:bst button exp logs void pre rto 中文 hex 注意事项: 很多文章上,使用GoString结构体和Go导出文件.h中对应,经过多次测试,发现程序极易崩溃。 原因可能有以下几个方面: 1. 结构体的内存映射问题,字段顺序需要严格对应,字段内存占用长度 2. 返回go string类型,内部不能使用 + 拼接,外部传入的string参数,否则立即崩溃,无任何提示 结论: 1. 建议使用*C.char作为入参,**C.char作为出参,*C.int提供出参内存占用长度 2. 中文乱码,go内部采用UTF8编码,每个中文字符占用3个字节,string默认采用Unicode每个字符4个字节。 传参之前先做转换(字符串转十六进制字符串字符串,互转) https://www.cnblogs.com/Leo_wl/p/12075987.html C#调用Go版DLL 标签:bst button exp logs void pre rto 中文 hex 原文地址:https://www.cnblogs.com/jiftle/p/12817334.htmlprivate void button6_Click(object sender, EventArgs e)
{
byte[] inParam = null;
IntPtr ptr = IntPtr.Zero;
int outlen = -1;
string outstr = "";
inParam = Encoding.UTF8.GetBytes("执着不可取");
int ret = Inwhtl_DLL.TestApi(inParam,ref ptr, ref outlen);
if(outlen > 0)
{
outstr = Marshal.PtrToStringAnsi(ptr, (int)outlen);
byte[] byt = strToToHexByte(outstr);
outstr = Encoding.UTF8.GetString(byt);
MessageBox.Show(outstr);
}
}
///
[DllImport("dlltest.dll", CharSet = CharSet.Ansi)]
public static extern int TestApi(byte[] inParam,ref IntPtr outstr, ref int outlen);