diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index b07facf4d..fc04d9668 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -1112,9 +1112,11 @@ namespace FlaxEngine.Interop internal static void ToManagedPointer(ref IntPtr managedValue, IntPtr nativePtr, bool byRef) { - if (byRef) - nativePtr = Unsafe.Read(nativePtr.ToPointer()); - managedValue = nativePtr; + Type type = typeof(T); + byRef |= type.IsByRef; // Is this needed? + if (type.IsByRef) + Assert.IsTrue(type.GetElementType().IsValueType); + managedValue = byRef ? nativePtr : Unsafe.Read(nativePtr.ToPointer()); } internal static void ToManagedHandle(ref ManagedHandle managedValue, IntPtr nativePtr, bool byRef) diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index 52d049403..1bbfa2a6d 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -1209,9 +1209,20 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, MType* type, bool& failed) return object; } case MTypes::Ptr: - if (value.Type.Type == VariantType::Null) + switch (value.Type.Type) + { + case VariantType::Pointer: + return &value.AsPointer; + case VariantType::Object: + return &value.AsObject; + case VariantType::Asset: + return &value.AsAsset; + case VariantType::Structure: + case VariantType::Blob: + return &value.AsBlob.Data; + default: return nullptr; - return (void*)value; + } default: break; }