Implement missing dotnet7 interop for field and stabilize interop

This commit is contained in:
Wojtek Figat
2023-07-04 17:57:59 +02:00
parent d7dc0b76e5
commit c79952a4d6
4 changed files with 26 additions and 7 deletions

View File

@@ -399,7 +399,7 @@ namespace FlaxEngine.Interop
}
numElements = managed.Length;
ManagedArray managedArray = ManagedArray.AllocatePooledArray<TUnmanagedElement>(managed.Length);
return (TUnmanagedElement*)ManagedHandle.ToIntPtr(managedArray, GCHandleType.Weak);
return (TUnmanagedElement*)ManagedHandle.ToIntPtr(managedArray, GCHandleType.Normal);
}
public static ReadOnlySpan<T> GetManagedValuesSource(T[] managed) => managed;

View File

@@ -770,6 +770,13 @@ namespace FlaxEngine.Interop
field.field.SetValue(fieldOwner, value);
}
[UnmanagedCallersOnly]
internal static int FieldGetOffset(ManagedHandle fieldHandle)
{
FieldHolder field = Unsafe.As<FieldHolder>(fieldHandle.Target);
return (int)Marshal.OffsetOf(field.field.DeclaringType, field.field.Name);
}
[UnmanagedCallersOnly]
internal static void FieldGetValue(ManagedHandle fieldOwnerHandle, ManagedHandle fieldHandle, IntPtr valuePtr)
{
@@ -778,6 +785,15 @@ namespace FlaxEngine.Interop
field.toNativeMarshaller(field.field, fieldOwner, valuePtr, out int fieldOffset);
}
[UnmanagedCallersOnly]
internal static IntPtr FieldGetValueBoxed(ManagedHandle fieldOwnerHandle, ManagedHandle fieldHandle)
{
object fieldOwner = fieldOwnerHandle.Target;
FieldHolder field = Unsafe.As<FieldHolder>(fieldHandle.Target);
object fieldValue = field.field.GetValue(fieldOwner);
return Invoker.MarshalReturnValueGeneric(field.field.FieldType, fieldValue);
}
[UnmanagedCallersOnly]
internal static void WriteArrayReference(ManagedHandle arrayHandle, IntPtr valueHandle, int index)
{
@@ -924,7 +940,7 @@ namespace FlaxEngine.Interop
if (nativeType.IsClass)
size = sizeof(IntPtr);
else
size = Marshal.SizeOf(nativeType);
size = GetTypeSize(type);
return size;
}

View File

@@ -1095,7 +1095,10 @@ namespace FlaxEngine.Interop
{
try
{
size = Marshal.SizeOf(type);
var marshalType = type;
if (type.IsEnum)
marshalType = type.GetEnumUnderlyingType();
size = Marshal.SizeOf(marshalType);
}
catch
{

View File

@@ -1163,8 +1163,8 @@ MType* MField::GetType() const
int32 MField::GetOffset() const
{
MISSING_CODE("TODO: MField::GetOffset"); // TODO: MField::GetOffset
return 0;
static void* FieldGetOffsetPtr = GetStaticMethodPointer(TEXT("FieldGetOffset"));
return CallStaticMethod<int32, void*>(FieldGetOffsetPtr, _handle);
}
void MField::GetValue(MObject* instance, void* result) const
@@ -1175,8 +1175,8 @@ void MField::GetValue(MObject* instance, void* result) const
MObject* MField::GetValueBoxed(MObject* instance) const
{
MISSING_CODE("TODO: MField::GetValueBoxed"); // TODO: MField::GetValueBoxed
return nullptr;
static void* FieldGetValueBoxedPtr = GetStaticMethodPointer(TEXT("FieldGetValueBoxed"));
return CallStaticMethod<MObject*, void*, void*>(FieldGetValueBoxedPtr, instance, _handle);
}
void MField::SetValue(MObject* instance, void* value) const