文档章节

Golang 编译成 DLL 文件

八风不动
 八风不动
发布于 2018/02/22 21:38
字数 288
阅读 1714
收藏 1

golang 编译 dll 过程中需要用到 gcc,所以先安装 MinGW。

windows 64 位系统应下载 MinGW 的 64 位版本: https://sourceforge.net/projects/mingw-w64/

下载后运行 mingw-w64-install.exe,完成 MingGW 的安装。

 

撰写 golang 程序 exportgo.go:

package main

import "C"
import "fmt"

//export PrintBye
func PrintBye() {
    fmt.Println("From DLL: Bye!")
}

//export Sum
func Sum(a int, b int) int {
    return a + b;
}

func main() {
    // Need a main function to make CGO compile package as C shared library
}

编译成 DLL 文件:

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

编译后得到 exportgo.dll 和 exportgo.h 两个文件。

 

参考 exportgo.h 文件中的函数定义,撰写 C# 文件 importgo.cs:

using System;
using System.Runtime.InteropServices;

namespace HelloWorld
{
    class Hello 
    {
        [DllImport("exportgo.dll", EntryPoint="PrintBye")]
        static extern void PrintBye();

        [DllImport("exportgo.dll", EntryPoint="Sum")]
        static extern int Sum(int a, int b);

        static void Main() 
        {
            Console.WriteLine("Hello World!");
            PrintBye();

            Console.WriteLine(Sum(33, 22));
        }
    }
}

编译 CS 文件得到 exe

csc importgo.cs

将 exe 和 dll 放在同一目录下,运行。

>importgo.exe

Hello World!
From DLL: Bye!
55

补充:

golang 中的 string 参数在 C# 中可以如下引用:

    public struct GoString
    {
        public string Value { get; set; }
        public int Length { get; set; }

        public static implicit operator GoString(string s)
        {
            return new GoString() { Value = s, Length = s.Length };
        }

        public static implicit operator string(GoString s) => s.Value;
    }

 

© 著作权归作者所有

共有 人打赏支持
八风不动
粉丝 34
博文 37
码字总数 11048
作品 2
天津
架构师
私信 提问
加载中

评论(5)

八风不动
八风不动

引用来自“fghydx”的评论

可以生成32位的DLL不?64位的正常,32位的编译不过,改了GOARCH=386
用 32位的 MingGW 试试。
fghydx
fghydx
可以生成32位的DLL不?64位的正常,32位的编译不过,改了GOARCH=386
lanybass
lanybass
换了v1.10没问题了
lanybass
lanybass
go v1.9提示:
-buildmode=c-shared not supported on windows/amd64
八风不动
八风不动
go build -ldflags "-s -w” [<your/package]

-ldflags 'flag list'
'-s -w': 压缩编译后的体积
-s: 去掉符号表
-w: 去掉调试信息,不能gdb调试了
使用SWIG桥接Golang和Windows DLL

最近看了下Go语言,利用Dynamsoft Barcode SDK做了一个简单的Golang条形码扫描。这里分享下如何使用SWIG来快速封装底层C/C++接口。 参考原文:How to Use SWIG to Link Windows DLL with Go...

yushulx
2015/11/24
273
0
Windows 下 gcc + golang 编译 git2go

最近研究用go语言操作git,除了直接走命令行用包,还可以使用的go绑定操作。但是是c语言库,go使用连接c程序,需要的支持。总之过程复杂,摔了一路。 安装 gcc 和 pkg-config 首先是安装和(...

傅小黑
2014/02/18
0
0
windows平台下使用LiteIDE交叉编译golang

1,在windows环境下使用交叉编译,需要编译工具GCC,必须使用MinGW: http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-2012......

borey
2014/03/19
0
6
cygwin + gcc+makeFile入门(二): 动态链接库编译

编译DLL指令有如下三部曲: 第一步: DLL源文件编译成.o文件 gcc -c dll.cpp -o dll.o 第二步: DLL的.o文件编译成.so或者.dll文件(注意务必以lib开头, 这是gcc的约定) gcc -shared -o libmyD...

晨曦之光
2012/03/09
1K
0
golang学习笔记(1):安装&helloworld

安装: golang编译器安装过程比较简单,也比较快,不同平台下(win/linux/macos)都比较相似; https://dl.gocn.io/golang/1.9.2/go1.9.2.src.tar.gz 下载对应的系统版本的编译器 go的版本号由...

shangluyi
2017/12/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

欧拉公式

欧拉公式表达式 欧拉公式的几何意 cosθ + j sinθ 是个复数,实数部分也就是实部为 cosθ ,虚数部分也就是虚部为 j sinθ ,对应复平面单位圆上的一个点。 根据欧拉公式和这个点可以用 复指...

sharelocked
22分钟前
1
0
burpsuite无法抓取https数据包

1.将浏览器和burpsuite的代理都设置好 2.在浏览器地址栏输入: http://burp 3.下载下面的证书,并将证书导入浏览器 cacert.der

Frost729
46分钟前
0
0
JeeSite4.x 消息管理、消息推送、消息提醒

实现统一的消息推送接口,包含PC消息、短信消息、邮件消息、微信消息等,无需让所有开发者了解消息是怎么发送出去的,只需了解消息发送接口即可。 所有推送消息均通过 MsgPushUtils 工具类发...

ThinkGem
今天
6
0
OpenML

https://www.openml.org/search?type=data

shengjuntu
今天
2
0
java强引用,软引用,弱引用和虚引用

先来简要说一下这四种引用的特性: 强引用:如果一个对象具有强引用,那垃圾回收器绝不会回收它 软引用:如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它 弱引用:在垃圾...

woshixin
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部