golang c-shared library callback from another language

0

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
       fn(i)
    }

}

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)
        {
           Connect()  
        }

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

        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;
            LoadDLL();
        }

        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 
             ConnectDelegate;
            function.Invoke(pFunc);
        }

}

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?

c#
pointers
go
callback
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