【C# 调用 Go 语言】0x1 Hello Golang

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 程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android仿支付宝弹窗,【转】MUI自定义底部弹窗自带遮罩层仿支付宝支付弹窗

[Asm] 纯文本查看 复制代码html,body{height: 100%;}.fr-tc{/* 控制弹窗高度 */height: 40%;}.fr-div-w{border-radius: 10px 10px 0px 0px;background-color: #FFFFFF;height: 100%;padding: 15px;}.fr-btn{display: block;height: 40px;width: 60%;background-color: #14b5ff…

整数二分

整数二分步骤: 1.找一个区间[L,R],使答案一定在这个区间 2.找一个判断条件,使得该判断条件具有二段性(一般具有单调性),并且答案一定是该二段性的分界点 3.分析终点M在该判断条件下是否成立,如果成立,考虑答案在哪个区…

解惑小微企业信息化系统上云的顾虑

小微企业到目前阶段,一点信息化系统没上的企业很少了,几乎找不到了。为了满足信息化系统异地办公的外网访问需要,在综合考虑硬件成本和运维成本,初期上云☁应该是最经济实惠的方案。信息化和数字化经济发展不仅给商业模式带来变革…

android 运行在ui县城,Android基础:在UI线程中运行代码

Android基础:在UI线程中运行代码从在UI线程中运行代码的角度来看,在以下方面有什么区别:MainActivity.this.runOnUiThread(new Runnable() {public void run() {Log.d("UI thread", "I am the UI thread");}});或MainAct…

区间合并

区间合并算法: 1.将所有区间按左端点从小到大排序 2.从左到右遍历每个区间 例题: 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端…

云原生时代, 选择.NET Core

在容器、Kubernetes、DevOps,以及微服务等技术的推动下,2020年云原生势不可挡。 .NET Core 也非常契合 云原生对应用运行时的不同需求,.NET Core和kubernetes 同年诞生发展, 2018年kubernetes 已经奠定了在容器编排领域的王者地位…

pm1 android,Android Sensor SDK

Android Sensor SDKStep By Step1.新建工程Android Studio配置将sensoro-sensor-kit.jar包放入道libs文件夹下,然后在当前工程下的build.gradle文件配置项中的dependencies新增内容,,如下compile files(libs/sensoro-sensor-kit.jar)Eclipse配置将sensoro-sensor-ki…

哈希表应用举例

例题: 伊娃喜欢从整个宇宙中收集硬币。 有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。 但是,有一个特殊的付款要求:每张帐单,她只能使用恰好两个硬币来准确的支付消费金额。 给定她拥有…

WebApi管理和性能测试工具WebApiBenchmarks

说到WebApi管理和测试工具其实已经非常多的了,Postman、Swagger等在管理和维护上都非常出色;在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等。不过这些工具都具有单一性,管理和维护好的在性能测试上比较低效,对…

android中的shape资源,Android Drawable资源讲解之shape篇

运用好Android的drawable资源,在开发中就可以减少图片的使用量,这样既缩小了app的体积,也省去了设计图片的时间,而且也容易适配不同的屏幕尺寸。今天首先来讲讲shape资源的使用。1. Shape的属性介绍shape共支持四种形状&#xff0…

C++unique函数应用举例

明明想在学校中请一些同学一起做一项问卷调查。 为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数,对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。 然后再把这些数…

C# WPF 一个设计界面

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏。C# WPF 一个设计界面今天正月初三,大家在家呆着挺好,不要忘了自我充电。武汉人民…

android中shape的属性,android中shape的属性

solid:实心,就是填充的意思android:color指定填充的颜色gradient:渐变android:startColor和android:endColor分别为起始和结束颜色,ndroid:angle是渐变角度,必须为45的整数倍。另外渐变默认的模式为android:type”line…

C++to_string应用举例

给定一个非负整数 N,你的任务是计算 N 的所有数字的总和,并以英语输出总和的每个数字。 输入格式 共一行,包含一个整数 N。 输出格式 共一行,用英语输出总和的每个数字,单词之间用空格隔开。 代码如下: …

合集| 21 篇技术文章,带你从零入门 K8s

由阿里云与 CNCF 共同开发的《CNCF x Alibaba 云原生技术公开课》(视频课程)第一期已更新完毕。为了让大家有更好的学习体验,我们把视频课程转为图文,并请讲师重新编辑成文章,在公众号以“从零入门 K8s” 为系列进行每…

C++string容器应用举例

给定一个整数,请将该数各个位上数字反转得到一个新数。 新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。 输入格式 输入共1行,1个整数N。 输出格式 输出共1行,1个整数…

家居灯光控制系统设计 android,基于Android的室内照明控制系统设计与实现

摘要:传统的室内照明系统存在控制不方便、布线困难、智能化程度不高等问题,而随着Android智能手机不断发展,已经可以实现多种控制功能。结合WiFi无线通信技术低功耗、高传输速率、组网方便等特点,适合智能化的室内照明控制系统。基于此提出一种以Android手机为平台,…

比尔盖茨早有预警:对大疫情爆发我们还没准备好

比尔盖茨早已预警,如今全球最大的危险不是核战争,而是高度传染的病毒,不是导弹,而是微生物。新型冠状病毒感染肺炎新增病例数仍在增长,钛媒体根据百度数据统计官方发布显示,截止发稿前1月30日9:30&#xff…

AcWing 3208. Z字形扫描

在图像编码的算法中,需要将一个给定的方形矩阵进行 Z 字形扫描(Zigzag Scan)。 给定一个 nn 的矩阵,Z 字形扫描的过程如下图所示: 对于下面的 44 的矩阵, 1 5 3 9 3 7 5 6 9 4 6 4 7 3 1 3 对其进行 Z 字形扫描后得到长度为 16 的…

写公众号的这一年多

2018年五月,在微信发布公众号助手之时我开通了个人公众号「不止dotNET」,到现在已经一年半多的时间了,非常时期,在家自我隔离,没事写写总结。数据总共发布了 53 篇原创文章,离之前的目标(每周一…