Fix converting managed array back to native if passed via structure argument

This commit is contained in:
2022-12-30 16:05:33 +01:00
parent 71e2cbe856
commit 6a8483a898
3 changed files with 23 additions and 4 deletions
+13
View File
@@ -1499,6 +1499,19 @@ namespace FlaxEngine
}
else if (type == typeof(Type))
managedPtr = managedValue != null ? GCHandle.ToIntPtr(GetTypeGCHandle((Type)(object)managedValue)) : IntPtr.Zero;
else if (type.IsArray)
{
if (managedValue == null)
managedPtr = IntPtr.Zero;
else
{
var elementType = type.GetElementType();
if (ArrayFactory.GetMarshalledType(elementType) == elementType)
managedPtr = GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(Unsafe.As<Array>(managedValue)), GCHandleType.Weak));
else
managedPtr = GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(Unsafe.As<Array>(managedValue))), GCHandleType.Weak));
}
}
else
managedPtr = managedValue != null ? GCHandle.ToIntPtr(GCHandle.Alloc(managedValue, GCHandleType.Weak)) : IntPtr.Zero;
@@ -59,10 +59,16 @@ namespace FlaxEngine
return (bool)(object)returnValue ? boolTruePtr : boolFalsePtr;
else if (typeof(TRet) == typeof(Type))
return returnValue != null ? GCHandle.ToIntPtr(GetTypeGCHandle(Unsafe.As<Type>(returnValue))) : IntPtr.Zero;
else if (typeof(TRet).IsArray && ArrayFactory.GetMarshalledType(typeof(TRet).GetElementType()) == typeof(TRet).GetElementType())
return returnValue != null ? GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(Unsafe.As<Array>(returnValue)), GCHandleType.Weak)) : IntPtr.Zero;
else if (typeof(TRet).IsArray)
return returnValue != null ? GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(Unsafe.As<Array>(returnValue))), GCHandleType.Weak)) : IntPtr.Zero;
{
if (returnValue == null)
return IntPtr.Zero;
var elementType = typeof(TRet).GetElementType();
if (ArrayFactory.GetMarshalledType(elementType) == elementType)
return GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(Unsafe.As<Array>(returnValue)), GCHandleType.Weak));
else
return GCHandle.ToIntPtr(GCHandle.Alloc(ManagedArray.WrapNewArray(ManagedArrayToGCHandleArray(Unsafe.As<Array>(returnValue))), GCHandleType.Weak));
}
else
return returnValue != null ? GCHandle.ToIntPtr(GCHandle.Alloc(returnValue, GCHandleType.Weak)) : IntPtr.Zero;
}
+1 -1
View File
@@ -27,7 +27,7 @@ API_ENUM(Namespace="FlaxEngine.Networking") enum class NetworkManagerMode
/// <summary>
/// The high-level network client connection data. Can be used to accept/deny new connection.
/// </summary>
API_STRUCT(Namespace="FlaxEngine.Networking") struct NetworkClientConnectionData
API_STRUCT(Namespace="FlaxEngine.Networking", NoDefault) struct NetworkClientConnectionData
{
DECLARE_SCRIPTING_TYPE_MINIMAL(NetworkClientConnectionData);
// The incoming client.