From 71e2cbe8564ee19a702f3b279d474390dd6fb461 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Fri, 30 Dec 2022 15:36:35 +0100 Subject: [PATCH] Minor tweaks to dotnet interop --- Source/Engine/Engine/NativeInterop.cs | 15 +++++++++++---- Source/Engine/Scripting/DotNet/MonoApi.cpp | 3 --- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index c56c85216..f299c9cc5 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -1908,6 +1908,8 @@ namespace FlaxEngine [UnmanagedCallersOnly] internal static unsafe IntPtr GetArrayPointerToElement(IntPtr arrayHandle, int size, int index) { + if (arrayHandle == IntPtr.Zero) + return IntPtr.Zero; ManagedArray managedArray = Unsafe.As(GCHandle.FromIntPtr(arrayHandle).Target); if (managedArray.Length == 0) return IntPtr.Zero; @@ -1918,6 +1920,8 @@ namespace FlaxEngine [UnmanagedCallersOnly] internal static int GetArrayLength(IntPtr arrayHandle) { + if (arrayHandle == IntPtr.Zero) + return 0; ManagedArray managedArray = Unsafe.As(GCHandle.FromIntPtr(arrayHandle).Target); return managedArray.Length; } @@ -1925,7 +1929,7 @@ namespace FlaxEngine [UnmanagedCallersOnly] internal static IntPtr GetStringEmpty() { - return ManagedString.ToNative(string.Empty); + return GCHandle.ToIntPtr(ManagedString.EmptyStringHandle); } [UnmanagedCallersOnly] @@ -2037,7 +2041,8 @@ namespace FlaxEngine } catch (Exception exception) { - Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); return IntPtr.Zero; } return returnValue; @@ -2655,7 +2660,8 @@ namespace FlaxEngine { // Returned exception is the last parameter IntPtr exceptionPtr = nativePtrs[parameterTypes.Length]; - Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); return IntPtr.Zero; } return returnValue; @@ -2677,7 +2683,8 @@ namespace FlaxEngine { // Returned exception is the last parameter IntPtr exceptionPtr = nativePtrs[numParams]; - Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, GCHandle.ToIntPtr(GCHandle.Alloc(exception, GCHandleType.Weak))); return IntPtr.Zero; } diff --git a/Source/Engine/Scripting/DotNet/MonoApi.cpp b/Source/Engine/Scripting/DotNet/MonoApi.cpp index c6a365a2e..8facba15e 100644 --- a/Source/Engine/Scripting/DotNet/MonoApi.cpp +++ b/Source/Engine/Scripting/DotNet/MonoApi.cpp @@ -800,9 +800,6 @@ MONO_API MonoMethod* mono_object_get_virtual_method(MonoObject* obj, MonoMethod* MONO_API MONO_RT_EXTERNAL_ONLY MonoObject* mono_runtime_invoke(MonoMethod* method, void* obj, void** params, MonoObject** exc) { static void* InvokeMethodPtr = CoreCLR::GetStaticMethodPointer(TEXT("InvokeMethod")); - MonoObject* execTmp = nullptr; - if (!exc) - exc = &execTmp; return (MonoObject*)CoreCLR::CallStaticMethod(InvokeMethodPtr, obj, ((CoreCLRMethod*)method)->GetMethodHandle(), params, exc); }