一、编写动态库程序

让动态库输出一个Hello World
编写动态库程序lib.go

package main

import "C"

//export HelloWorld
func HelloWorld() {
	println("Hello, World!")
}

func main() {}

必须以注释的方式声明要导出的方法:export HelloWorld
动态库中必须要有一个main函数
执行编译动态库命令: windows是dll,Linux是so命令一样,改后缀就行了

go build -buildmode=c-shared -o lib.dll lib.go

该命令会在目录下生成一个lib.dll和lib.h文件
如图:

二、编写调用动态库程序

package main

import (
	"fmt"
	"syscall"
)

func main() {
	mylib, err := syscall.LoadLibrary("dll/lib/lib.dll")
	if err != nil {
		fmt.Println("LoadLibrary error:", err)
		return
	}
	defer syscall.FreeLibrary(mylib)

	helloWorld, err := syscall.GetProcAddress(mylib, "HelloWorld")
	if err != nil {
		fmt.Println("GetProcAddress error:", err)
		return
	}

	// 将 helloWorld 转换成一个函数类型
	var hello func()
	hello = func() {
		syscall.SyscallN(helloWorld, 0, 0, 0, 0)
	}

	// 调用 hello 函数
	hello()
}

程序输出:

Hello, World!