Fix C# string chars getter in AOT build

This commit is contained in:
Wojtek Figat
2023-04-03 11:23:32 +02:00
parent 5ca6dae8c3
commit 350112a0d7
2 changed files with 8 additions and 14 deletions

View File

@@ -473,13 +473,12 @@ namespace FlaxEngine.Interop
/// Returns pointer to the string's internal structure, containing the buffer and length of the string.
/// </summary>
[UnmanagedCallersOnly]
internal static IntPtr GetStringPointer(ManagedHandle stringHandle)
internal static char* GetStringPointer(ManagedHandle stringHandle, int* len)
{
string str = Unsafe.As<string>(stringHandle.Target);
IntPtr ptr = (Unsafe.Read<IntPtr>(Unsafe.AsPointer(ref str)) + sizeof(int) * 2);
if (ptr < 0x1024)
throw new Exception("null string ptr");
return ptr;
*len = str.Length;
fixed (char* p = str)
return p;
}
[UnmanagedCallersOnly]
@@ -786,7 +785,7 @@ namespace FlaxEngine.Interop
}
string assemblyPath = Marshal.PtrToStringAnsi(assemblyPathPtr);
Assembly assembly;
#if FLAX_EDITOR
// Load assembly from loaded bytes to prevent file locking in Editor

View File

@@ -245,12 +245,6 @@ struct NativePropertyDefinitions
MMethodAttributes setterAttributes;
};
struct NativeString
{
int32 length;
Char chars[1];
};
MDomain* MCore::CreateDomain(const StringAnsi& domainName)
{
return nullptr;
@@ -369,9 +363,10 @@ MString* MCore::String::New(const Char* str, int32 length, MDomain* domain)
StringView MCore::String::GetChars(MString* obj)
{
int32 length = 0;
static void* GetStringPointerPtr = GetStaticMethodPointer(TEXT("GetStringPointer"));
NativeString* str = (NativeString*)CallStaticMethod<void*, void*>(GetStringPointerPtr, obj);
return StringView(str->chars, str->length);
const Char* chars = CallStaticMethod<const Char*, void*, int*>(GetStringPointerPtr, obj, &length);
return StringView(chars, length);
}
MArray* MCore::Array::New(const MClass* elementKlass, int32 length)