Go打包dll
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}"); } } }
如果上面的 gcc 是64位的 ,那C#打包也必须用x64的CPU

浙公网安备 33010602011771号