_dotnet events

This commit is contained in:
2024-04-03 20:42:37 +03:00
parent 91a6450c94
commit 75d83a2ef3
4 changed files with 98 additions and 9 deletions

View File

@@ -45,6 +45,16 @@ namespace FlaxEngine.Interop
internal uint fieldAttributes;
}
[StructLayout(LayoutKind.Sequential)]
internal struct NativeEventDefinitions
{
internal IntPtr name;
internal ManagedHandle eventHandle;
internal ManagedHandle addMethodHandle;
internal ManagedHandle removeMethodHandle;
internal uint attributes;
}
[StructLayout(LayoutKind.Sequential)]
internal struct NativePropertyDefinitions
{
@@ -368,6 +378,46 @@ namespace FlaxEngine.Interop
*classFieldsCount = fields.Length;
}
[UnmanagedCallersOnly]
internal static void GetClassEvents(ManagedHandle typeHandle, NativeEventDefinitions** classEvents, int* classEventCount)
{
Type type = Unsafe.As<TypeHolder>(typeHandle.Target);
var events = type.GetEvents(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var arr = (NativeEventDefinitions*)NativeAlloc(events.Length, Unsafe.SizeOf<NativeEventDefinitions>());
for (int i = 0; i < events.Length; i++)
{
IntPtr ptr = IntPtr.Add(new IntPtr(arr), Unsafe.SizeOf<NativeEventDefinitions>() * i);
ManagedHandle eventHandle = ManagedHandle.Alloc(events[i]);
var raiseMethod = events[i].GetRaiseMethod(true);
var addMethod = events[i].GetAddMethod(true);
var removeMethod = events[i].GetRemoveMethod(true);
var classEvent = new NativeEventDefinitions
{
name = NativeAllocStringAnsi(events[i].Name),
eventHandle = eventHandle,
attributes = (uint)(addMethod?.Attributes ?? removeMethod?.Attributes ?? MethodAttributes.PrivateScope),
};
/*if (raiseMethod != null)
{
classEvent.raiseMethodHandle = GetMethodGCHandle(raiseMethod);
}*/
if (addMethod != null)
{
classEvent.addMethodHandle = GetMethodGCHandle(addMethod);
}
if (removeMethod != null)
{
classEvent.removeMethodHandle = GetMethodGCHandle(removeMethod);
}
Unsafe.Write(ptr.ToPointer(), classEvent);
}
*classEvents = arr;
*classEventCount = events.Length;
}
[UnmanagedCallersOnly]
internal static void GetClassProperties(ManagedHandle typeHandle, NativePropertyDefinitions** classProperties, int* classPropertiesCount)
{