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

posted @ 2025-03-26 10:31  zslm___  阅读(39)  评论(0)    收藏  举报