1. goland 编写 代码
package main/* #include <stdlib.h> */ import "C"//export Add func Add(a, b int) int {return a + b }//export Greet func Greet(v *C.char) *C.char {name := C.GoString(v)return C.CString("Hello from !" + name) }
//export FreeString
func FreeString(ptr *C.char) { C.free(unsafe.Pointer(ptr)) }
func main() {}
2. 打包成dll
go build -o my_dll.dll -buildmode=c-shared
如果报
cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH% 这个错误 ,说明没有安装 gcc
在 https://jmeubank.github.io/tdm-gcc/articles/2021-05/10.3.0-release 下载 对应的 32 或 64位 安装包
安装完成后重新执行打包命令, 如果没有报错的话在工作目录下生成 一个 my_dll.dll文件
4. 在c#里使用dll
using System; using System.Runtime.InteropServices;class Program {// 导入 DLL 函数[DllImport("my_dll.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int Add(int a, int b);[DllImport("my_dll.dll", CallingConvention = CallingConvention.Cdecl)]public static extern IntPtr Greet(string name);// 释放由 Go 分配的内存[DllImport("my_dll.dll", CallingConvention = CallingConvention.Cdecl)]public static extern void FreeString(IntPtr ptr);static void Main(string[] args){try{// 调用 Add 函数int result = Add(10, 20);Console.WriteLine($"Result of Add(10, 20): {result}");// 调用 Greet 函数string name = "Alice";IntPtr greetPtr = Greet(name);string greetStr = Marshal.PtrToStringAnsi(greetPtr);// 打印结果Console.WriteLine($"Greeting: {greetStr}");// 释放内存 FreeString(greetPtr);}catch (Exception ex){Console.WriteLine($"Error: {ex.Message}");}} }