public static void SetErrorReasonCallback(ErrorReasonCallback callback)
        {
            CurrentErrorReasonCallback = (IntPtr cstr) =>
            {
                int strLen = 0;
                while (Marshal.ReadByte(cstr, strLen) != '\0')
                {
                    strLen++;
                }
                byte[] bytes = new byte[strLen];
                Marshal.Copy(cstr, bytes, 0, strLen);
                string csStr = Encoding.UTF8.GetString(bytes);

                callback?.Invoke(csStr);
            };

            CurrentErrorReasonCallbackPtr = Marshal.GetFunctionPointerForDelegate(CurrentErrorReasonCallback);
            SetErrorReasonCallback(CurrentErrorReasonCallbackPtr);
        }
 public static void SetErrorReasonCallback(ErrorReasonCallback callback)
 {
     //FIXME: not implemented on macOS and Linux
 }