alef 0.78.0

Opinionated polyglot binding generator for Rust libraries
Documentation
    /// <summary>
    /// {{ doc }}
    /// </summary>
    public int {{ method_name }}({% if signature_params %}{{ signature_params }}, {% endif %}Delegate handler) {
{{ declarations }}
        ArgumentNullException.ThrowIfNull(handler);
        var handle = GCHandle.Alloc(handler, GCHandleType.Normal);
        IntPtr ctx = GCHandle.ToIntPtr(handle);
        bool handleAdded = false;
        int result;
        try {
{{ setup }}
            _safeHandle.DangerousAddRef(ref handleAdded);
            result = NativeMethods.{{ native_method }}(
                _safeHandle.AlefHandle,
                _handlerCallback,
                _handlerResponseFree,
                ctx{{ arg_lines }}
            );
        } catch {
            handle.Free();
            throw;
        } finally {
            if (handleAdded) _safeHandle.DangerousRelease();
{{ teardown }}
        }

        if (result == 0) {
            lock (_registeredCallbacks) {
                _registeredCallbacks[ctx] = handle;
            }
        } else {
            handle.Free();
        }
        return result;
    }