_dotnet events
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user