golang c-shared library callback from another language


I building a dll with golang, and need the dll receive a callback to trigger function directly from the dll

I tried execute callback on golang library but dont work

This is my code on golang

package main

import "C"
import "fmt"

type externFunc func(int)

//export Connect
func Connect(fn externFunc) {
    fmt.Println("fn ",fn)

    for i:= 0; i<3;i++{

       // this is the func/method received from c#, and tried execute from golang


and so i build the library

go build -buildmode=c-shared -o library.dll main.go

this is my code on c#

  class Program
        static void Main(string[] args)

        private static unsafe void Connect()
            Dll.CallbackDelegate cb = Callback;
            // here sent the method to dll, to wait the multiple calls

        private static unsafe void Callback(int num)
            Console.WriteLine("call #: "+num);


class Dll {
 private const string DllPath = "library.dll";

        private IntPtr _dllHandle = IntPtr.Zero; 

        private static DllHelper _instance;
        public static DllHelper Instance
            get { return _instance ?? (_instance = new DllHelper()); }

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr LoadLibrary(string libname);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool FreeLibrary(IntPtr hModule);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern void FreeLibraryAndExitThread(IntPtr hModule, UInt32 dwExitCode);

        [DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
        private static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

        internal Dll()
            _dllHandle = IntPtr.Zero;

        internal void LoadDLL()
            bool? freeResult = null;
            if (_dllHandle != IntPtr.Zero)
                freeResult = FreeLibrary(_dllHandle);

            // Load dll .. 
            _dllHandle = LoadLibrary(DllPath);
            if (_dllHandle == IntPtr.Zero)
                int errorCode = Marshal.GetLastWin32Error();
                // Marshal.
                throw new Exception(string.Format("Failed to load library (ErrorCode: {0})", errorCode));

and this part load the function from library

        public unsafe delegate void CallbackDelegate(int num);

        private unsafe delegate void ConnectDelegate(CallbackDelegate pFunc);
        internal unsafe void Connect(CallbackDelegate pFunc)
            var funcaddr = GetProcAddress(_dllHandle, "Connect");
            var function = Marshal.GetDelegateForFunctionPointer(funcaddr, typeof(ConnectDelegate)) as 


this is the result when tried execute my console program created on C# with the go library

unexpected fault address 0xffffffffffffffff
fatal error: fault
[signal 0xc0000005 code=0x0 addr=0xffffffffffffffff pc=0x627ca9ab]

I think need receive an uinptr or something like that in the Connect and convert the pointer on a type func but reading on other post says the type externFunc func is an func signature, and this is already a pointer.

Any idea what I need to make callbacks?

asked on Stack Overflow Dec 4, 2019 by Victor Sanchez • edited Dec 5, 2019 by Victor Sanchez

0 Answers

Nobody has answered this question yet.

User contributions licensed under CC BY-SA 3.0