/// <summary> /// /// </summary> /// <param name="typeName"></param> /// <param name="cb"></param> public void GetType(string typeName, NativeCallback cb) { object obj; if (types.ContainsKey(typeName)) { obj = types[typeName]; } else { Type type = Type.GetType(typeName); if (type == null) { throw new ArgumentNullException("Can't find type " + typeName); } obj = BuildStructType(type); types[typeName] = obj; } int size = Marshal.SizeOf(obj); IntPtr unmanagedAddr = Marshal.AllocHGlobal(size); Marshal.StructureToPtr(obj, unmanagedAddr, false); cb(unmanagedAddr); Marshal.FreeHGlobal(unmanagedAddr); }
static void Main(string[] args) { var callback = new NativeCallback(v => { // setting a breakpoint here make go panic Console.WriteLine($"Value comming from go: {v}"); }); var funcPtr = Marshal.GetFunctionPointerForDelegate(callback); CallMeBack(funcPtr, 42); }
internal static void Setup() { isStarted = false; RegisterMonoNativeCallbacks(nativeCallback = OnNativeCallback); }
static extern void RegisterMonoNativeCallbacks(NativeCallback callback);
public static extern void RegisterNativeCallback(NativeCallback cb);
public unsafe void RegisterOnConnectionStateChangeCallback(Int32 callbackPointer) { onConnectionStateChange = GetNativeCallback(callbackPointer); }
public unsafe void RegisterLogCallback(Int32 callbackPointer) { onLog = GetNativeCallback(callbackPointer); }
public unsafe void RegisterOnErrorCallback(Int32 callbackPointer) { onError = GetNativeCallback(callbackPointer); }
internal static void Start() { IsClosing = false; RegisterMonoNativeCallbacks(nativeCallback = OnNativeCallback); }
public static void Register(int index, NativeCallback cb) { _CallbackList[index] = cb; }