十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
最近需要用到golang编译dll给C#调用,记录一下,希望可以给遇到的朋友一些帮助。
10年积累的成都网站设计、网站制作经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站策划后付款的网站建设流程,更有迎泽免费网站建设让你可以放心的选择与我们合作。
开发环境:
1.windows7,VS2019,VScode
2.macOS,VScode
习惯在macos开发golang应用,先写好了dll,可以参考:
然后在windows7上面使用C#调用的时候出现不能识别dll,于是只好在windows7安装golang开发环境。
简单安装了VScode和mingw64.
测试时发现了一个问题,如下:
最后找到的原因是我的windows7是64位的,mingw也是64位的,需要在VS2019里面将目标平台设置如下:
当然,也可以将目标平台设置为x64的即可,我这样设置,系统就自己去适配了。
网上的大部分是说设置目标平台为x86,这个要根据具体情况而来,不能一概而论。好了,希望能帮到您。
和golang代码一样,照抄,但得换成byte类型即可。
func INT8FromString(s string) ([]byte, error) {for i := 0; i len(s); i++ { if s[i] == 0 { return nil, nil }}return []byte(s), nil}func StringToINT8(s string) []byte {a, err := INT8FromString(s)if err != nil { panic("syscall: string with NUL passed to StringToINT8")}return a}func StringToINT8Ptr(s string) *byte { return StringToINT8(s)[0] }
然后就可以调用了。
retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));
请不要传空值,可以用空格代替之。
最后实例代码,补充完成
items := "string...."; // 字符 类似 *charbuffer := make([]byte, 1024) // 指针位置retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));
关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。 楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。 正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。 由于楼...