资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

go语言调用生成的dll go函数调用

golang编译dll给C#调用

最近需要用到golang编译dll给C#调用,记录一下,希望可以给遇到的朋友一些帮助。

创新互联主营珙县网站建设的网络公司,主营网站建设方案,成都app软件开发公司,珙县h5小程序开发搭建,珙县网站营销推广欢迎珙县等地区企业咨询

开发环境:

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可以调用C++的动态链接库么

GO语言包估计能直接调用我没试

编译DLL库绝调用或者直接直接用系统命令调用编译完执行程序

go语言如何调用底层api???

Google Go语言通过syscall,unsafe模块访问windows api,ShellExecute

package main    

import "syscall"    

import "unsafe"    

func main() {    

var hand uintptr = uintptr(0);    

var operator uintptr = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("open")));    

var fpath uintptr = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("D:\Program Files\TTPlayer\TTPlayer.exe")));    

var param uintptr = uintptr(0);    

var dirpath uintptr = uintptr(0);    

var ncmd uintptr = uintptr(1);    

shell32 := syscall.NewLazyDLL("shell32.dll");    

ShellExecuteW := shell32.NewProc("ShellExecuteW");    

_,_,_ = ShellExecuteW.Call(hand,operator,fpath,param,dirpath,ncmd);

如何在Go语言中调用DLL

关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。 楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。 正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。 由于楼...

golang调用DLL中的函数

在golang中加载dll并调用函数流程如下:

1.加载dll动态库到内存 syscall.LoadLibrary

2.获取函数地址 syscall.GetProcAddress

3.执行系统调用,传入参数 syscall.Syscall6

一个系统消息框函数的调用示例:

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.

package rand

/*

#include stdlib.h

*/ import "C" func Random() int { return int(C.random()) } func Seed(i int) { C.srandom(C.uint(i)) }

我们来看一下这里都有什么内容. 开始是一个包的导入语句.

rand包导入了"C"包, 但你会发现在Go的标准库里没有这个包. 那是因为C是一个"伪包", 一个为cgo引入的特殊的包名, 它是C命名空间的一个引用.

rand 包包含4个到C包的引用: 调用 C.random和C.srandom, 类型转换 C.uint(i)还有引用语句.

Random函数调用libc中的random函数, 然后回返结果. 在C中, random返回一个C类型的长整形值, cgo把它轮换为C.long. 这个值必需转换成Go的类型, 才能在Go程序中使用. 使用一个常见的Go类型转换:

func Random() int { return int(C.random()) }

这是一个等价的函数, 使用了一个临时变量来进行类型转换:

func Random() int { var r C.long = C.random() return int(r) }

Seed函数则相反. 它接受一个Go语言的int类型, 转换成C语言的unsigned int类型, 然后传递给C的srandom函数.

func Seed(i int) { C.srandom(C.uint(i)) }

需要注意的是, cgo中的unsigned int类型写为C.uint; cgo的文档中有完整的类型列表.

这个例子中还有一个细节我们没有说到, 那就是导入语句上面的注释.

/*

#include stdlib.h

*/ import "C"

Cgo可以识别这个注释, 并在编译C语言程序的时候将它当作一个头文件来处理. 在这个例子中, 它只是一个include语句, 然而其实它可以是使用有效的C语言代码. 这个注释必需紧靠在import "C"这个语句的上面, 不能有空行, 就像是文档注释一样.

Strings and things

与Go语言不同, C语言中没有显式的字符串类型. 字符串在C语言中是一个以0结尾的字符数组.

Go和C语言中的字符串转换是通过C.CString, C.GoString,和C.GoStringN这些函数进行的. 这些转换将得到字符串类型的一个副本.

下一个例子是实现一个Print函数, 它使用C标准库中的fputs函数把一个字符串写到标准输出上:

package print // #include stdio.h // #include stdlib.h import "C" import "unsafe" func Print(s string) { cs := C.CString(s) C.fputs(cs, (*C.FILE)(C.stdout)) C.free(unsafe.Pointer(cs)) }

在C程序中进行的内存分配是不能被Go语言的内存管理器感知的. 当你使用C.CString创建一个C字符串时(或者其它类型的C语言内存分配), 你必需记得在使用完后用C.free来释放它.

调用C.CString将返回一个指向字符数组开始处的指错, 所以在函数退出前我们把它转换成一个unsafe.Pointer(Go中与C的void 等价的东西), 使用C.free来释放分配的内存. 一个惯用法是在分配内存后紧跟一个defer(特别是当这段代码比较复杂的时候), 这样我们就有了下面这个Print函数:

func Print(s string) { cs := C.CString(s) defer C.free(unsafe.Pointer(cs)) C.fputs(cs, (*C.FILE)(C.stdout)) }

构建 cgo 包

如果你使用goinstall, 构建cgo包就比较容易了, 只要调用像平常一样使用goinstall命令, 它就能自动识别这个特殊的import "C", 然后自动使用cgo来编译这些文件.

如果你想使用Go的Makefiles来构建, 那在CGOFILES变量中列出那些要用cgo处理的文件, 就像GOFILES变量包含一般的Go源文件一样.

rand包的Makefile可以写成下面这样:

include $(GOROOT)/src/Make.inc

TARG=goblog/rand

CGOFILES=\ rand.go\ include $(GOROOT)/src/Make.pkg

然后输入gomake开始构建.

更多 cgo 的资源

cgo的文档中包含了关于C伪包的更多详细的说明, 以及构建过程. Go代码树中的cgo的例子给出了更多更高级的用法.

一个简单而又符合Go惯用法的基于cgo的包是Russ Cox写的gosqlite. 而Go语言的网站上也列出了更多的的cgo包.

最后, 如果你对于cgo的内部是怎么运作这个事情感到好奇的话, 去看看运行时包的cgocall.c文件的注释吧.


标题名称:go语言调用生成的dll go函数调用
URL网址:http://cdkjz.cn/article/hiepce.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220