Tweaks
This commit is contained in:
@@ -319,9 +319,7 @@ namespace FlaxEngine
|
|||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
else if (str == string.Empty)
|
else if (str == string.Empty)
|
||||||
return GCHandle.ToIntPtr(EmptyStringHandle);
|
return GCHandle.ToIntPtr(EmptyStringHandle);
|
||||||
|
|
||||||
Assert.IsTrue(str.Length > 0);
|
Assert.IsTrue(str.Length > 0);
|
||||||
|
|
||||||
return GCHandle.ToIntPtr(GCHandle.Alloc(str, GCHandleType.Weak));
|
return GCHandle.ToIntPtr(GCHandle.Alloc(str, GCHandleType.Weak));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,7 +328,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (ptr == IntPtr.Zero)
|
if (ptr == IntPtr.Zero)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return Unsafe.As<string>(GCHandle.FromIntPtr(ptr).Target);
|
return Unsafe.As<string>(GCHandle.FromIntPtr(ptr).Target);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -339,16 +336,14 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (ptr == IntPtr.Zero)
|
if (ptr == IntPtr.Zero)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GCHandle handle = GCHandle.FromIntPtr(ptr);
|
GCHandle handle = GCHandle.FromIntPtr(ptr);
|
||||||
if (handle == EmptyStringHandle)
|
if (handle == EmptyStringHandle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
handle.Free();
|
handle.Free();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Marshallers
|
#region Marshallers
|
||||||
|
|
||||||
@@ -483,7 +478,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (managedArray == null)
|
if (managedArray == null)
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
|
|
||||||
handle = GCHandle.Alloc(managedArray);
|
handle = GCHandle.Alloc(managedArray);
|
||||||
return GCHandle.ToIntPtr(handle);
|
return GCHandle.ToIntPtr(handle);
|
||||||
}
|
}
|
||||||
@@ -576,7 +570,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged is null)
|
if (unmanaged is null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return new T[numElements];
|
return new T[numElements];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,7 +579,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
||||||
return managedArray.GetSpan<TUnmanagedElement>();
|
return managedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
@@ -595,7 +587,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
||||||
(Unsafe.As<ManagedArray>(handle.Target)).Free();
|
(Unsafe.As<ManagedArray>(handle.Target)).Free();
|
||||||
handle.Free();
|
handle.Free();
|
||||||
@@ -605,7 +596,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return Span<TUnmanagedElement>.Empty;
|
return Span<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
||||||
return managedArray.GetSpan<TUnmanagedElement>();
|
return managedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
@@ -620,12 +610,9 @@ namespace FlaxEngine
|
|||||||
numElements = 0;
|
numElements = 0;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
numElements = managed.Length;
|
numElements = managed.Length;
|
||||||
|
|
||||||
ManagedArray managedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
ManagedArray managedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
||||||
var ptr = GCHandle.ToIntPtr(GCHandle.Alloc(managedArray));
|
var ptr = GCHandle.ToIntPtr(GCHandle.Alloc(managedArray));
|
||||||
|
|
||||||
return (TUnmanagedElement*)ptr;
|
return (TUnmanagedElement*)ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -635,7 +622,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return Span<TUnmanagedElement>.Empty;
|
return Span<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
||||||
return managedArray.GetSpan<TUnmanagedElement>();
|
return managedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
@@ -644,7 +630,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
||||||
(Unsafe.As<ManagedArray>(handle.Target)).FreePooled();
|
(Unsafe.As<ManagedArray>(handle.Target)).FreePooled();
|
||||||
handle.Free();
|
handle.Free();
|
||||||
@@ -661,9 +646,7 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (managed == null)
|
if (managed == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
managedArray = managed;
|
managedArray = managed;
|
||||||
|
|
||||||
unmanagedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
unmanagedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
||||||
handle = GCHandle.Alloc(unmanagedArray);
|
handle = GCHandle.Alloc(unmanagedArray);
|
||||||
}
|
}
|
||||||
@@ -674,7 +657,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanagedArray == null)
|
if (unmanagedArray == null)
|
||||||
return Span<TUnmanagedElement>.Empty;
|
return Span<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -691,7 +673,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanagedArray == null)
|
if (unmanagedArray == null)
|
||||||
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -713,12 +694,9 @@ namespace FlaxEngine
|
|||||||
numElements = 0;
|
numElements = 0;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
numElements = managed.Length;
|
numElements = managed.Length;
|
||||||
|
|
||||||
ManagedArray managedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
ManagedArray managedArray = ManagedArray.AllocatePooledArray((TUnmanagedElement*)Marshal.AllocHGlobal(sizeof(TUnmanagedElement) * managed.Length), managed.Length);
|
||||||
IntPtr handle = GCHandle.ToIntPtr(GCHandle.Alloc(managedArray));
|
IntPtr handle = GCHandle.ToIntPtr(GCHandle.Alloc(managedArray));
|
||||||
|
|
||||||
return (TUnmanagedElement*)handle;
|
return (TUnmanagedElement*)handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -728,7 +706,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return Span<TUnmanagedElement>.Empty;
|
return Span<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
ManagedArray unmanagedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
ManagedArray unmanagedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
||||||
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
return unmanagedArray.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
@@ -741,7 +718,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
return ReadOnlySpan<TUnmanagedElement>.Empty;
|
||||||
|
|
||||||
ManagedArray array = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
ManagedArray array = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(new IntPtr(unmanaged)).Target);
|
||||||
return array.GetSpan<TUnmanagedElement>();
|
return array.GetSpan<TUnmanagedElement>();
|
||||||
}
|
}
|
||||||
@@ -750,7 +726,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (unmanaged == null)
|
if (unmanaged == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
GCHandle handle = GCHandle.FromIntPtr(new IntPtr(unmanaged));
|
||||||
Unsafe.As<ManagedArray>(handle.Target).FreePooled();
|
Unsafe.As<ManagedArray>(handle.Target).FreePooled();
|
||||||
handle.Free();
|
handle.Free();
|
||||||
@@ -780,7 +755,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (managed == null)
|
if (managed == null)
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
|
|
||||||
return GCHandle.ToIntPtr(GCHandle.Alloc(managed, GCHandleType.Weak));
|
return GCHandle.ToIntPtr(GCHandle.Alloc(managed, GCHandleType.Weak));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -875,8 +849,12 @@ namespace FlaxEngine
|
|||||||
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
|
||||||
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
|
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
|
||||||
|
|
||||||
// TODO: benchmark collectible setting performance, maybe enable it only in editor builds?
|
#if FLAX_EDITOR
|
||||||
scriptingAssemblyLoadContext = new AssemblyLoadContext(null, true);
|
var isCollectible = true;
|
||||||
|
#else
|
||||||
|
var isCollectible = false;
|
||||||
|
#endif
|
||||||
|
scriptingAssemblyLoadContext = new AssemblyLoadContext("Flax", isCollectible);
|
||||||
|
|
||||||
DelegateHelpers.Init();
|
DelegateHelpers.Init();
|
||||||
}
|
}
|
||||||
@@ -891,7 +869,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
string moduleName = Marshal.PtrToStringAnsi(moduleName_);
|
string moduleName = Marshal.PtrToStringAnsi(moduleName_);
|
||||||
string modulePath = Marshal.PtrToStringAnsi(modulePath_);
|
string modulePath = Marshal.PtrToStringAnsi(modulePath_);
|
||||||
|
|
||||||
nativeLibraryPaths[moduleName] = modulePath;
|
nativeLibraryPaths[moduleName] = modulePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -921,7 +898,6 @@ namespace FlaxEngine
|
|||||||
T[] managedArray = new T[nativeSpan.Length];
|
T[] managedArray = new T[nativeSpan.Length];
|
||||||
for (int i = 0; i < nativeSpan.Length; i++)
|
for (int i = 0; i < nativeSpan.Length; i++)
|
||||||
managedArray[i] = toManagedFunc(nativeSpan[i]);
|
managedArray[i] = toManagedFunc(nativeSpan[i]);
|
||||||
|
|
||||||
return managedArray;
|
return managedArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -979,10 +955,8 @@ namespace FlaxEngine
|
|||||||
return true;
|
return true;
|
||||||
if (type.IsPointer && type.HasElementType && type.GetElementType().IsPrimitive)
|
if (type.IsPointer && type.HasElementType && type.GetElementType().IsPrimitive)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (type.IsClass)
|
if (type.IsClass)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (type.IsValueType)
|
if (type.IsValueType)
|
||||||
{
|
{
|
||||||
var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||||
@@ -1073,6 +1047,7 @@ namespace FlaxEngine
|
|||||||
method = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType<ReferenceTypePlaceholder>.ToNativeFieldWrapper), BindingFlags.Static | BindingFlags.NonPublic);
|
method = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType<ReferenceTypePlaceholder>.ToNativeFieldWrapper), BindingFlags.Static | BindingFlags.NonPublic);
|
||||||
return method.CreateDelegate<MarshalToNativeFieldDelegate>();
|
return method.CreateDelegate<MarshalToNativeFieldDelegate>();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toNativeFieldMarshallers.TryGetValue(type, out var deleg))
|
if (toNativeFieldMarshallers.TryGetValue(type, out var deleg))
|
||||||
return deleg;
|
return deleg;
|
||||||
return toNativeFieldMarshallers.GetOrAdd(type, Factory);
|
return toNativeFieldMarshallers.GetOrAdd(type, Factory);
|
||||||
@@ -1371,7 +1346,6 @@ namespace FlaxEngine
|
|||||||
MarshalHelper<T>.toManagedFieldMarshallers[i](MarshalHelper<T>.marshallableFields[i], ref managedValue, fieldPtr, out int fieldOffset);
|
MarshalHelper<T>.toManagedFieldMarshallers[i](MarshalHelper<T>.marshallableFields[i], ref managedValue, fieldPtr, out int fieldOffset);
|
||||||
fieldPtr += fieldOffset;
|
fieldPtr += fieldOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert.IsTrue((fieldPtr - nativePtr) == Unsafe.SizeOf<T>());
|
Assert.IsTrue((fieldPtr - nativePtr) == Unsafe.SizeOf<T>());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1408,7 +1382,6 @@ namespace FlaxEngine
|
|||||||
MarshalHelper<T>.toNativeFieldMarshallers[i](MarshalHelper<T>.marshallableFields[i], ref managedValue, nativePtr, out int fieldOffset);
|
MarshalHelper<T>.toNativeFieldMarshallers[i](MarshalHelper<T>.marshallableFields[i], ref managedValue, nativePtr, out int fieldOffset);
|
||||||
nativePtr += fieldOffset;
|
nativePtr += fieldOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert.IsTrue((nativePtr - fieldPtr) == Unsafe.SizeOf<T>());
|
Assert.IsTrue((nativePtr - fieldPtr) == Unsafe.SizeOf<T>());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1536,7 +1509,6 @@ namespace FlaxEngine
|
|||||||
internal static GCHandle GetMethodGCHandle(MethodInfo method)
|
internal static GCHandle GetMethodGCHandle(MethodInfo method)
|
||||||
{
|
{
|
||||||
MethodHolder methodHolder = new MethodHolder(method);
|
MethodHolder methodHolder = new MethodHolder(method);
|
||||||
|
|
||||||
GCHandle handle = GCHandle.Alloc(methodHolder);
|
GCHandle handle = GCHandle.Alloc(methodHolder);
|
||||||
if (methodHolder.parameterTypes.Any(x => x.IsCollectible) || method.IsCollectible)
|
if (methodHolder.parameterTypes.Any(x => x.IsCollectible) || method.IsCollectible)
|
||||||
methodHandlesCollectible.Add(handle);
|
methodHandlesCollectible.Add(handle);
|
||||||
@@ -1593,7 +1565,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
||||||
GCHandle classTypeHandle = GetTypeGCHandle(type);
|
GCHandle classTypeHandle = GetTypeGCHandle(type);
|
||||||
|
|
||||||
*managedClass = new NativeClassDefinitions()
|
*managedClass = new NativeClassDefinitions()
|
||||||
{
|
{
|
||||||
typeHandle = GCHandle.ToIntPtr(classTypeHandle),
|
typeHandle = GCHandle.ToIntPtr(classTypeHandle),
|
||||||
@@ -1750,7 +1721,6 @@ namespace FlaxEngine
|
|||||||
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
||||||
Type attribType = Unsafe.As<Type>(GCHandle.FromIntPtr(attribHandle).Target);
|
Type attribType = Unsafe.As<Type>(GCHandle.FromIntPtr(attribHandle).Target);
|
||||||
object attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x.GetType() == attribType);
|
object attrib = type.GetCustomAttributes(false).FirstOrDefault(x => x.GetType() == attribType);
|
||||||
|
|
||||||
if (attrib != null)
|
if (attrib != null)
|
||||||
return GCHandle.ToIntPtr(GCHandle.Alloc(attrib, GCHandleType.Weak));
|
return GCHandle.ToIntPtr(GCHandle.Alloc(attrib, GCHandleType.Weak));
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
@@ -1792,7 +1762,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
MethodHolder methodHolder = Unsafe.As<MethodHolder>(GCHandle.FromIntPtr(methodHandle).Target);
|
MethodHolder methodHolder = Unsafe.As<MethodHolder>(GCHandle.FromIntPtr(methodHandle).Target);
|
||||||
Type returnType = methodHolder.method.ReturnType;
|
Type returnType = methodHolder.method.ReturnType;
|
||||||
|
|
||||||
IntPtr arr = Marshal.AllocCoTaskMem(IntPtr.Size * methodHolder.parameterTypes.Length);
|
IntPtr arr = Marshal.AllocCoTaskMem(IntPtr.Size * methodHolder.parameterTypes.Length);
|
||||||
for (int i = 0; i < methodHolder.parameterTypes.Length; i++)
|
for (int i = 0; i < methodHolder.parameterTypes.Length; i++)
|
||||||
{
|
{
|
||||||
@@ -1824,7 +1793,6 @@ namespace FlaxEngine
|
|||||||
// FIXME: Script is an abstract type which can not be instantiated
|
// FIXME: Script is an abstract type which can not be instantiated
|
||||||
type = typeof(VisjectScript);
|
type = typeof(VisjectScript);
|
||||||
}
|
}
|
||||||
|
|
||||||
object value = RuntimeHelpers.GetUninitializedObject(type);
|
object value = RuntimeHelpers.GetUninitializedObject(type);
|
||||||
return GCHandle.ToIntPtr(GCHandle.Alloc(value));
|
return GCHandle.ToIntPtr(GCHandle.Alloc(value));
|
||||||
}
|
}
|
||||||
@@ -1879,7 +1847,6 @@ namespace FlaxEngine
|
|||||||
internal static IntPtr NewArray(IntPtr typeHandle, long size)
|
internal static IntPtr NewArray(IntPtr typeHandle, long size)
|
||||||
{
|
{
|
||||||
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
||||||
|
|
||||||
Type marshalledType = ArrayFactory.GetMarshalledType(type);
|
Type marshalledType = ArrayFactory.GetMarshalledType(type);
|
||||||
if (marshalledType.IsValueType)
|
if (marshalledType.IsValueType)
|
||||||
{
|
{
|
||||||
@@ -1900,7 +1867,6 @@ namespace FlaxEngine
|
|||||||
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(arrayHandle).Target);
|
ManagedArray managedArray = Unsafe.As<ManagedArray>(GCHandle.FromIntPtr(arrayHandle).Target);
|
||||||
if (managedArray.Length == 0)
|
if (managedArray.Length == 0)
|
||||||
return IntPtr.Zero;
|
return IntPtr.Zero;
|
||||||
|
|
||||||
Assert.IsTrue(index >= 0 && index < managedArray.Length);
|
Assert.IsTrue(index >= 0 && index < managedArray.Length);
|
||||||
return IntPtr.Add(managedArray.GetPointer, size * index);
|
return IntPtr.Add(managedArray.GetPointer, size * index);
|
||||||
}
|
}
|
||||||
@@ -1989,7 +1955,6 @@ namespace FlaxEngine
|
|||||||
GCHandle handle = GCHandle.FromIntPtr(handlePtr);
|
GCHandle handle = GCHandle.FromIntPtr(handlePtr);
|
||||||
object value = handle.Target;
|
object value = handle.Target;
|
||||||
Type type = value.GetType();
|
Type type = value.GetType();
|
||||||
|
|
||||||
if (!type.IsValueType)
|
if (!type.IsValueType)
|
||||||
return handlePtr;
|
return handlePtr;
|
||||||
|
|
||||||
@@ -2196,7 +2161,6 @@ namespace FlaxEngine
|
|||||||
internal static IntPtr GetAssemblyByName(IntPtr name_, IntPtr* assemblyName, IntPtr* assemblyFullName)
|
internal static IntPtr GetAssemblyByName(IntPtr name_, IntPtr* assemblyName, IntPtr* assemblyFullName)
|
||||||
{
|
{
|
||||||
string name = Marshal.PtrToStringAnsi(name_);
|
string name = Marshal.PtrToStringAnsi(name_);
|
||||||
|
|
||||||
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name == name);
|
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.GetName().Name == name);
|
||||||
if (assembly == null)
|
if (assembly == null)
|
||||||
assembly = scriptingAssemblyLoadContext.Assemblies.FirstOrDefault(x => x.GetName().Name == name);
|
assembly = scriptingAssemblyLoadContext.Assemblies.FirstOrDefault(x => x.GetName().Name == name);
|
||||||
@@ -2281,7 +2245,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
Type type = Unsafe.As<Type>(GCHandle.FromIntPtr(typeHandle).Target);
|
||||||
Type nativeType = GetInternalType(type) ?? type;
|
Type nativeType = GetInternalType(type) ?? type;
|
||||||
|
|
||||||
if (nativeType == typeof(Version))
|
if (nativeType == typeof(Version))
|
||||||
nativeType = typeof(VersionNative);
|
nativeType = typeof(VersionNative);
|
||||||
|
|
||||||
@@ -2523,8 +2486,7 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
var referencedAssemblies = assembly.GetReferencedAssemblies();
|
var referencedAssemblies = assembly.GetReferencedAssemblies();
|
||||||
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
|
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||||
|
var referencedTypes = new List<string>();
|
||||||
List<string> referencedTypes = new List<string>();
|
|
||||||
foreach (var assemblyName in referencedAssemblies)
|
foreach (var assemblyName in referencedAssemblies)
|
||||||
{
|
{
|
||||||
var asm = allAssemblies.FirstOrDefault(x => x.GetName().Name == assemblyName.Name);
|
var asm = allAssemblies.FirstOrDefault(x => x.GetName().Name == assemblyName.Name);
|
||||||
@@ -2540,7 +2502,6 @@ namespace FlaxEngine
|
|||||||
var types = referencedTypes.Any() ? assembly.DefinedTypes.Where(x => !referencedTypes.Contains(x.FullName)).ToArray() : assembly.DefinedTypes.ToArray();
|
var types = referencedTypes.Any() ? assembly.DefinedTypes.Where(x => !referencedTypes.Contains(x.FullName)).ToArray() : assembly.DefinedTypes.ToArray();
|
||||||
|
|
||||||
Assert.IsTrue(AppDomain.CurrentDomain.GetAssemblies().Where(x => x.GetName().Name == "FlaxEngine.CSharp").Count() == 1);
|
Assert.IsTrue(AppDomain.CurrentDomain.GetAssemblies().Where(x => x.GetName().Name == "FlaxEngine.CSharp").Count() == 1);
|
||||||
|
|
||||||
return types;
|
return types;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2551,7 +2512,6 @@ namespace FlaxEngine
|
|||||||
{
|
{
|
||||||
if (typeHandleCache.TryGetValue(type, out GCHandle handle))
|
if (typeHandleCache.TryGetValue(type, out GCHandle handle))
|
||||||
return handle;
|
return handle;
|
||||||
|
|
||||||
if (typeHandleCacheCollectible.TryGetValue(type, out handle))
|
if (typeHandleCacheCollectible.TryGetValue(type, out handle))
|
||||||
return handle;
|
return handle;
|
||||||
|
|
||||||
|
|||||||
@@ -1576,6 +1576,11 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoImage* mono_image_open_from_data_with_name(ch
|
|||||||
const char* fullname;
|
const char* fullname;
|
||||||
static void* LoadAssemblyImagePtr = CoreCLR::GetStaticMethodPointer(TEXT("LoadAssemblyImage"));
|
static void* LoadAssemblyImagePtr = CoreCLR::GetStaticMethodPointer(TEXT("LoadAssemblyImage"));
|
||||||
void* assemblyHandle = CoreCLR::CallStaticMethod<void*, char*, int, const char*, const char**, const char**>(LoadAssemblyImagePtr, data, data_len, path, &name, &fullname);
|
void* assemblyHandle = CoreCLR::CallStaticMethod<void*, char*, int, const char*, const char**, const char**>(LoadAssemblyImagePtr, data, data_len, path, &name, &fullname);
|
||||||
|
if (!assemblyHandle)
|
||||||
|
{
|
||||||
|
*status = MONO_IMAGE_IMAGE_INVALID;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
CoreCLRAssembly* assembly = New<CoreCLRAssembly>(assemblyHandle, name, fullname);
|
CoreCLRAssembly* assembly = New<CoreCLRAssembly>(assemblyHandle, name, fullname);
|
||||||
|
|
||||||
CoreCLR::Free((void*)name);
|
CoreCLR::Free((void*)name);
|
||||||
|
|||||||
Reference in New Issue
Block a user