C# 和 Golang 都不是世界上最好的语言。在不同的业务场景下,C# 和 Golang 各有所长。如果要编写一个网络程序,显然 Golang 更擅长,而如果要编写一个桌面 GUI 程序,那么 C# 简直不要太爽。我们完全可以将两者用在同一个项目中,各取所长。Golang 支持将源代码编译为动态链接库(dll),这让我们在 C# 调用 Golang 成为可能。

本篇代码可以在:https://gitee.com/coderbusy/golang-with-csharp 找到。

如何在 C# 中调用 Golang 函数?

Go 语言提供了 CGO 机制,使得能够在 Go 代码中直接调用 C 的库函数,此外还支持在 C 语言中调用 Go 函数,非常强大。Golang 支持将 Go 函数导出给 C 语言使用,那么也同样可以给 C# 使用。

CGO 环境搭建

要使用 CGO 特性,需要安装 C/C 构建工具链,在 macOS 和 Linux 下是要安装好 GCC,在 Windows 下是需要安装 MinGW 工具。如果你的电脑上已经安装好 GCC ,则可以跳过本小节。

关于 MinGW 的安装网上已经有很多教程,本篇将介绍一种更简单的方法来安装 MinGW :通过安装 QT 来部署 MinGW 到本机(该方法来自:ha666)。QT 的安装包中自带了 MinGW 环境,我们只要安装 QT 开发包,那么附带的 MinGW 环境就安装好了。

QT 的下载地址可以在:http://download.qt.io/archive/qt/ 中找到,目前(2020年1月28日)最新的版本是 5.14.1 ,Windows 版的下载地址是:qt-opensource-windows-x86-5.14.1.exe 。

如果你没有且不想创建 QT 的网络账户,那么在运行 QT 的安装文件之前,可以先断开网络,这样就不会出现 QT 账户的注册和登录界面:

断网状态下,不会出现账号注册和登录界面,直接“Next”即可。

安装过程中无需更改默认的安装目录,在“选择组件”页面时,勾选 MinGW 组件:

在“选择组件”页面中,勾选 MinGW 组件。

在安装完成之后,需要设置好环境变量 Go 编译器才能找到 GCC 的安装位置。如果你使用的软件版本和我相同并且没有更改默认安装位置,那么这个要添加到 PATH 变量中的目录地址应该是:C:\Qt\Qt5.14.0\Tools\mingw730_32\bin\

如果安装正确并配置好了环境变量,那么在命令行中键入 gcc ,将会看到以下输出:


Hello Golang

编写 Golang 代码,文件名为 main.go 。注意:虽然我们最终要生成动态链接库,但是 main 函数仍是不可或缺的。

main.go

接下来对 Go 源文件进行编译,新建一个 make.bat 文件,填入一下指令并运行:

make.bat

命令成功后,我们会得到两个文件:HelloGolang.Interop.h 和 HelloGolang.Interop.dll 。

使用 Visual Studio 新建 HelloGolang 控制台应用程序,并将生成的目标平台设置为 x86 。将 HelloGolang.Interop.dll 添加到项目中,并设置为“始终复制”:

HelloGolang.csproj

在 Program.cs 文件中,使用 DllImport 导入外部方法并调用:

Program.cs

运行程序,那么将会在控制台中看到以下输出:

Hello Golang 输出

其中,第一行的 Hello World! 来自 C# 程序,第二行 Hello C#,I'm golang! 则来自 Go 程序。

go 调用其他文件函数_【C# 调用 Go 语言】0x1 Hello Golang相关推荐

  1. go 调用其他文件函数_一篇文章让你了解Go语言中方法Methods的使用内幕

    概述 Go语言中的方法只不过是一个带有接收器的函数.接收器是某个特定类型(如struct)的实例,或是任何其他自定义类型的实例.所以基本上,当你把函数附加到类型上时,该函数就成为这个类型的一个方法.方 ...

  2. qt 子类调用父类的函数_子类调用父类方法

    当有相同的属性或者方法是this子类表示调用自己的属性或者方法, super调用父类的属性或者方法. 当子类调用的属性方法在子类中不存在时,那么this和super都是调用父类的属性或者方法 1.方式 ...

  3. go 调用其他文件函数_一文读懂Go中软件包概念

    Go编程语言的软件包管理和部署的完整概述 如果您熟悉Java或NodeJS之类的语言,那么您可能非常熟悉软件包. 包不过是带有一些代码文件的目录,该目录从单个引用点公开了不同的变量(功能). 让我解释 ...

  4. python 不执行函数_解决python调用自己文件函数/执行函数找不到包问题

    写python程序的时候很多人习惯创建一个utils.py文件,存放一些经常使用的函数,方便其他文件调用,同时也更好的管理一些通用函数,方便今后使用.或是两个文件之间的class或是函数调用情况. 就 ...

  5. html调用父页面的函数,js调用父框架函数与弹窗调用父页面函数的方法

    调用父级中的 aaa的函数 子页面中: οnclick="window.parent.frames.aaa()" 父页面中: function aaa() { alert('bbb ...

  6. const对象只能调用const成员函数、不能调用非const成员函数;非const对象可以调用const成员函数

    引发原因: 由调用成员函数时隐式传入的当前对象的this指针引起. 1. 非const成员函数中的隐式参数:classA* this 2. const成员函数中的隐式参数:const classA* ...

  7. fastreport调用frf文件直接打印_来吧~~ 这里提供自助打印~

    照片打印:支持5寸.6寸.7寸.A4多尺寸介质打印 文档打印:支持word.pdf.ppt.wps等文档格式A4幅面打印 证件照:已有证件照拼版打印功能:无电子照可在线制作打印,支持蓝底.红底.白底证 ...

  8. fastreport调用frf文件直接打印_打印日志时 Logback 内部都做了些什么

    文 | 百川 on 资产管理 一.引言 Logback 是一个优秀的开源日志框架,我们很多项目都使用它来记录日志.实际使用时,通常仅需要一行语句即可记录相应的日志信息,如 logger.info(&q ...

  9. qt 子类调用父类的函数_子类中调用父类的方法

    父类名 . __init__(self, ...) 可以将父类中的init中的属性重复调用,减少代码的重复 class Vehicle: def __init__(self, name, speed, ...

最新文章

  1. 互联网对erp行业到底有什么影响
  2. Boost:由内部绑定的值返回的智能指针的测试程序
  3. eclipse和jdk的版本问题,比如printf()出错
  4. C# JScript.Eval使用
  5. jmeter和oracle,jmeter测试Oracle数据库
  6. java生产消费线程小例子
  7. WEB应用中的信息泄漏以及攻击方法
  8. mustache模板引擎
  9. AMD Intel 机器 Spark 性能测试
  10. SDRAM 控制器(一)
  11. 常用视频接口线头介绍
  12. php如何采集,php采集入门教程,教你如何写采集
  13. 必备技能06:UML类图要素及解析
  14. Spark 应用监控告警-Graphite_exporter
  15. scrapy抓取dmoz内容
  16. 系统移植丨使用傲梅分区助手和EasyBCD迁移系统盘
  17. npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
  18. Redisson实现分布式锁原理
  19. Lua性能优化—Lua内存优化
  20. ADC中的LSB误差是什么意思

热门文章

  1. ThreadLocal原理及用法详解
  2. reactjs中的事件处理
  3. vue npm run serve/dev命令后台运行:nohup npm run serve >web.log 2>1 exit
  4. Dockerfile 之 ARG指令详解及示例
  5. Go语言Beego框架1.6.2(稍显老)及bee工具的使用
  6. Java客户端操作elasticsearch--向索引库添加mappings映射数据
  7. nginx tomcat集群实现session共享
  8. Hadoop大数据分布式文件系统hdfs的工作机制
  9. MySQL日期及时间加减函数
  10. “docker exec“ requires at least 2 arguments. See ‘docker exec --help‘.