Implement missing dotnet7 interop for field and stabilize interop
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user