如何使用GO导入用C编写的DLL函数?

The*_*ask 5 c import dll go

我在寻找一个例子代码是如何与等同于C语言编写的一个DLL导入函数DllImportC#.NET.这是可能的?我正在使用Windows.任何帮助表示赞赏.提前致谢.

nmi*_*els 5

您想使用cgo这里有一个介绍。


pet*_*rSO 5

使用与Go的Windows端口相同的方法.请参阅Go syscall包的Windows实现的源代码.另外,请查看实验性Go exp/wingui包的源代码


Ano*_*rog 5

有几种方法可以做到这一点。

cgo方式允许您以这种方式调用函数:

import ("C")
...
C.SomeDllFunc(...)
Run Code Online (Sandbox Code Playgroud)

它将基本上通过“链接”到库来调用库。您可以将C代码放入Go中并导入常规C方式。

还有更多方法,例如syscall

import (
    "fmt"
    "syscall"
    "unsafe"
)

// ..

kernel32, _        = syscall.LoadLibrary("kernel32.dll")
getModuleHandle, _ = syscall.GetProcAddress(kernel32, "GetModuleHandleW")
Run Code Online (Sandbox Code Playgroud)

...

func GetModuleHandle() (handle uintptr) {
    var nargs uintptr = 0
    if ret, _, callErr := syscall.Syscall(uintptr(getModuleHandle), nargs, 0, 0, 0); callErr != 0 {
    abort("Call GetModuleHandle", callErr)
    } else {
        handle = ret
    }
    return
}
Run Code Online (Sandbox Code Playgroud)

有一个有用的github页面,它描述了使用DLL的过程:https : //github.com/golang/go/wiki/WindowsDLLs

有三种基本方法可以做到这一点。