/// <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;
}