Fixed glib source double removal then using Source.Remove (Timeout.Remove, Idle.Remove).
I don't know if fix is correct or safe, but it solves problem that you can test in TimerDemo section from samples.
Repro:
If on Windows you should enable console in samples: <OutputType>Exe</OutputType>
Go to TimerDemo section and press buttons:
1. Add timer
2. Remove timer by handler
3. GC - no error in console
1. Add timer
2. Remove timer
3. GC - error in console "GLib-CRITICAL **: 20:29:41.579: Source ID 123 was not found when attempting to remove it"
* Disable loading of additional assemblies in AOT context
AOT does not supports `Assembly.Load` and `Assembly.GetReferencedAssemblies()` when running AOT.
I opt-out of code which try to find type. In AOT context this means that you rely on dynamic type loading and you have issues anyway.
* Fix compilation errors
Idle.Add, Idle.AddSeconds, Timeout.Add, Timeout.AddSeconds methods overloads are generalized:
* no priority (for default priority)
* enum priority (for standard priorities)
* int priority (for custom priority)
* overloads call main method with int priority
Fixed leak in Timeout.Add(priority): method was not using userData and DestroyHelper.NotifyHandler.
Some GValue types support null value but code was not checking for .NET "null" and get null ref exception. Fixed nulls for g_value_set_variant, g_value_set_object, g_value_set_boxed as in GLib docs.
This fixes NodeView with null pixbuf column.
Read all GError fields in GException constructor and free GError memory.
Quote from gtksharp2 fix: The original impl did not take into account exceptions marshalling across thread boundaries so it could end up with the error being accessed after being disposed.
The API contract between GObject-Introspection and bindings is that
functions returning transfer-none floating references pass a reference
to the bindings that should be taken ownership of by sinking it. Not
doing so is wrong and will lead to memory leaks or double frees.
Previously we would not distinguish this case and simply increment the
reference count. In addition we would then sink the floating reference
when the Object.Raw field is set later for InitiallyUnowned subclasses.
Remove that last part and instead check directly in Object.Raw.set if we
get a floating reference and if so simply sink it here and take
ownership of it. The general assumption of Object.Raw.set is that it
gets passed a reference that it should take ownership of.
So in summary:
1) GetObject() would only increase the reference count of unowned,
non-floating references so that we own it. For unowned, floating
references it assumes ownership of the reference.
2) Raw.set assumes ownership of the reference passed to it and if it
happens to be a floating reference then it will first sink it.
Also warn if we get a floating, owned reference passed to GetObject() as
that case is not allowed by GObject-Introspection and would cause the
reference to be leaked.
This fixes a memory leak with functions returning unowned, floating
references and with functions returning owned, non-floating references
of InitiallyUnowned subclasses. And at the same time keeps constructors
for InitiallyUnowned subclasses working correctly without leaks.
See https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp/issues/31