diff --git a/Source/Engine/Scripting/DotNet/CoreCLR.cpp b/Source/Engine/Scripting/DotNet/CoreCLR.cpp index 4d7d53052..fe3983b0f 100644 --- a/Source/Engine/Scripting/DotNet/CoreCLR.cpp +++ b/Source/Engine/Scripting/DotNet/CoreCLR.cpp @@ -42,9 +42,6 @@ bool CoreCLR::LoadHostfxr(const String& library_path_) { const FLAX_CORECLR_STRING& library_path = FLAX_CORECLR_STRING(library_path_); - Platform::SetEnvironmentVariable(TEXT("DOTNET_TieredPGO"), TEXT("1")); - Platform::SetEnvironmentVariable(TEXT("DOTNET_TC_QuickJitForLoops"), TEXT("1")); - Platform::SetEnvironmentVariable(TEXT("DOTNET_ReadyToRun"), TEXT("0")); char_t hostfxrPath[1024]; size_t hostfxrPathSize = sizeof(hostfxrPath) / sizeof(char_t); diff --git a/Source/Engine/Scripting/DotNet/CoreCLR.h b/Source/Engine/Scripting/DotNet/CoreCLR.h index b2dc29cbf..031279488 100644 --- a/Source/Engine/Scripting/DotNet/CoreCLR.h +++ b/Source/Engine/Scripting/DotNet/CoreCLR.h @@ -22,22 +22,29 @@ public: static bool LoadHostfxr(const String& library_path); static bool InitHostfxr(const String& config_path, const String& library_path); + /// + /// Returns the function pointer to the managed static method in NativeInterop class. + /// static void* GetStaticMethodPointer(const String& methodName); + /// + /// Calls the managed static method in NativeInterop class with given parameters. + /// template - static RetType CallStaticMethodInternal(const String& methodName, Args... args) + static inline RetType CallStaticMethodByName(const String& methodName, Args... args) { typedef RetType(CORECLR_DELEGATE_CALLTYPE* fun)(Args...); - fun function = (fun)GetStaticMethodPointer(methodName); - return function(args...); + return ((fun)GetStaticMethodPointer(methodName))(args...); } + /// + /// Calls the managed static method with given parameters. + /// template - static RetType CallStaticMethodInternalPointer(void* funPtr, Args... args) + static inline RetType CallStaticMethod(void* methodPtr, Args... args) { typedef RetType(CORECLR_DELEGATE_CALLTYPE* fun)(Args...); - fun function = (fun)funPtr; - return function(args...); + return ((fun)methodPtr)(args...); } static const char* GetClassFullname(void* klass); diff --git a/Source/Engine/Scripting/DotNet/MonoApi.cpp b/Source/Engine/Scripting/DotNet/MonoApi.cpp index 8409bd72a..05c03f17c 100644 --- a/Source/Engine/Scripting/DotNet/MonoApi.cpp +++ b/Source/Engine/Scripting/DotNet/MonoApi.cpp @@ -82,14 +82,15 @@ private: public: CoreCLRAssembly(void* assemblyHandle, const char* name, const char* fullname) { + static void* GetManagedClassesPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetManagedClasses")); + _assemblyHandle = assemblyHandle; _name = name; _fullname = fullname; ManagedClass* managedClasses; int classCount; - - CoreCLR::CallStaticMethodInternal(TEXT("GetManagedClasses"), _assemblyHandle, &managedClasses, &classCount); + CoreCLR::CallStaticMethod(GetManagedClassesPtr, _assemblyHandle, &managedClasses, &classCount); for (int i = 0; i < classCount; i++) { CoreCLRClass* mci = New(managedClasses[i].typeHandle, StringAnsi(managedClasses[i].name), StringAnsi(managedClasses[i].fullname), StringAnsi(managedClasses[i].namespace_), managedClasses[i].typeAttributes, this); @@ -113,22 +114,22 @@ public: assemblyHandles.Remove(_assemblyHandle); } - void* GetHandle() + void* GetHandle() const { return _assemblyHandle; } - const StringAnsi& GetName() + const StringAnsi& GetName() const { return _name; } - const StringAnsi& GetFullname() + const StringAnsi& GetFullname() const { return _fullname; } - Array GetClasses() + const Array& GetClasses() const { return _classes; } @@ -170,11 +171,6 @@ public: ~CoreCLRClass() { - for (auto method : _methods) - { - //int rem = monoMethods.RemoveValue(method); - //ASSERT(rem > 0) - } _methods.ClearDelete(); _fields.ClearDelete(); _attributes.ClearDelete(); @@ -184,12 +180,12 @@ public: classHandles.Remove(_typeHandle); } - uint32 GetAttributes() + uint32 GetAttributes() const { return _typeAttributes; } - uint32 GetTypeToken() + uint32 GetTypeToken() const { return _typeToken; } @@ -199,46 +195,47 @@ public: if (_size != 0) return _size; - uint32 dummy; - _size = mono_class_value_size((MonoClass*)this, &dummy); + uint32 align; + _size = mono_class_value_size((MonoClass*)this, &align); return _size; } - const StringAnsi& GetName() + const StringAnsi& GetName() const { return _name; } - const StringAnsi& GetFullname() + const StringAnsi& GetFullname() const { - return _fullname; // FIXME: this should probably return the decorated C# name for generic types (foo) and not the IL-name (foo`1[[T) + return _fullname; } - const StringAnsi& GetNamespace() + const StringAnsi& GetNamespace() const { return _namespace; } - void* GetTypeHandle() + void* GetTypeHandle() const { return _typeHandle; } - CoreCLRAssembly* GetAssembly() + const CoreCLRAssembly* GetAssembly() const { return _image; } - Array GetMethods() + const Array& GetMethods() { if (_cachedMethods) return _methods; + + static void* GetClassMethodsPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassMethods")); ClassMethod* foundMethods; int numMethods; - - CoreCLR::CallStaticMethodInternal(TEXT("GetClassMethods"), _typeHandle, &foundMethods, &numMethods); + CoreCLR::CallStaticMethod(GetClassMethodsPtr, _typeHandle, &foundMethods, &numMethods); for (int i = 0; i < numMethods; i++) { CoreCLRMethod* method = New(StringAnsi(foundMethods[i].name), foundMethods[i].numParameters, foundMethods[i].handle, foundMethods[i].methodAttributes, this); @@ -252,15 +249,16 @@ public: return _methods; } - Array GetFields() + const Array& GetFields() { if (_cachedFields) return _fields; + static void* GetClassFieldsPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassFields")); + ClassField* foundFields; int numFields; - - CoreCLR::CallStaticMethodInternal(TEXT("GetClassFields"), _typeHandle, &foundFields, &numFields); + CoreCLR::CallStaticMethod(GetClassFieldsPtr, _typeHandle, &foundFields, &numFields); for (int i = 0; i < numFields; i++) { CoreCLRField* field = New(StringAnsi(foundFields[i].name), foundFields[i].fieldHandle, foundFields[i].fieldType, foundFields[i].fieldAttributes, this); @@ -274,15 +272,16 @@ public: return _fields; } - Array GetProperties() + const Array& GetProperties() { if (_cachedProperties) return _properties; + static void* GetClassPropertiesPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassProperties")); + ClassProperty* foundProperties; int numProperties; - - CoreCLR::CallStaticMethodInternal(TEXT("GetClassProperties"), _typeHandle, &foundProperties, &numProperties); + CoreCLR::CallStaticMethod(GetClassPropertiesPtr, _typeHandle, &foundProperties, &numProperties); for (int i = 0; i < numProperties; i++) { CoreCLRProperty* prop = New(StringAnsi(foundProperties[i].name), foundProperties[i].getterHandle, foundProperties[i].setterHandle, foundProperties[i].getterFlags, foundProperties[i].setterFlags, this); @@ -296,15 +295,16 @@ public: return _properties; } - Array GetCustomAttributes() + const Array& GetCustomAttributes() { if (_cachedAttributes) return _attributes; + static void* GetClassAttributesPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassAttributes")); + ClassAttribute* foundAttributes; int numAttributes; - - CoreCLR::CallStaticMethodInternal(TEXT("GetClassAttributes"), _typeHandle, &foundAttributes, &numAttributes); + CoreCLR::CallStaticMethod(GetClassAttributesPtr, _typeHandle, &foundAttributes, &numAttributes); for (int i = 0; i < numAttributes; i++) { CoreCLRClass* attributeClass = GetClass(foundAttributes[i].attributeTypeHandle); @@ -319,15 +319,16 @@ public: return _attributes; } - Array GetInterfaces() + const Array& GetInterfaces() { if (_cachedInterfaces) return _interfaces; + static void* GetClassInterfacesPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassInterfaces")); + void** foundInterfaces; int numInterfaces; - - CoreCLR::CallStaticMethodInternal(TEXT("GetClassInterfaces"), _typeHandle, &foundInterfaces, &numInterfaces); + CoreCLR::CallStaticMethod(GetClassInterfacesPtr, _typeHandle, &foundInterfaces, &numInterfaces); for (int i = 0; i < numInterfaces; i++) { CoreCLRClass* interfaceClass = classHandles[foundInterfaces[i]]; @@ -358,32 +359,32 @@ public: { } - const StringAnsi& GetName() + const StringAnsi& GetName() const { return _name; } - CoreCLRClass* GetClass() + const CoreCLRClass* GetClass() const { return _class; } - uint32 GetAttributes() + uint32 GetAttributes() const { return _methodAttributes; } - int GetNumParameters() + int GetNumParameters() const { return _numParams; } - void* GetMethodHandle() + void* GetMethodHandle() const { return _methodHandle; } - Array GetParameterTypes() + const Array& GetParameterTypes() { if (!_cachedParameters) CacheParameters(); @@ -397,19 +398,17 @@ public: return _returnType; } +private: void CacheParameters() { - _returnType = CoreCLR::CallStaticMethodInternal(TEXT("GetMethodReturnType"), _methodHandle); + static void* GetMethodReturnTypePtr = CoreCLR::GetStaticMethodPointer(TEXT("GetMethodReturnType")); + static void* GetMethodParameterTypesPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetMethodParameterTypes")); + + _returnType = CoreCLR::CallStaticMethod(GetMethodReturnTypePtr, _methodHandle); void** parameterTypeHandles; - CoreCLR::CallStaticMethodInternal(TEXT("GetMethodParameterTypes"), _methodHandle, ¶meterTypeHandles); - - _parameterTypes.SetCapacity(_numParams, false); - - for (int i = 0; i < _numParams; i++) - { - _parameterTypes.Add(parameterTypeHandles[i]); - } + CoreCLR::CallStaticMethod(GetMethodParameterTypesPtr, _methodHandle, ¶meterTypeHandles); + _parameterTypes.Set(parameterTypeHandles, _numParams); CoreCLR::Free(parameterTypeHandles); _cachedParameters = true; @@ -431,27 +430,27 @@ public: { } - const StringAnsi& GetName() + const StringAnsi& GetName() const { return _name; } - void* GetType() + void* GetType() const { return _fieldType; } - CoreCLRClass* GetClass() + const CoreCLRClass* GetClass() const { return _class; } - uint32 GetAttributes() + uint32 GetAttributes() const { return _fieldAttributes; } - void* GetHandle() + void* GetHandle() const { return _fieldHandle; } @@ -475,22 +474,22 @@ public: _setMethod = New(StringAnsi(_name + "Set"), 1, setter, setterFlags, klass); } - const StringAnsi& GetName() + const StringAnsi& GetName() const { return _name; } - CoreCLRClass* GetClass() + const CoreCLRClass* GetClass() const { return _class; } - CoreCLRMethod* GetGetMethod() + const CoreCLRMethod* GetGetMethod() const { return _getMethod; } - CoreCLRMethod* GetSetMethod() + const CoreCLRMethod* GetSetMethod() const { return _setMethod; } @@ -510,12 +509,12 @@ public: { } - void* GetHandle() + void* GetHandle() const { return _handle; } - CoreCLRClass* GetClass() + const CoreCLRClass* GetClass() const { return _attributeClass; } @@ -542,16 +541,18 @@ CoreCLRClass* GetOrCreateClass(void* type) CoreCLRClass* klass; if (!classHandles.TryGet(type, klass)) { + static void* GetManagedClassFromTypePtr = CoreCLR::GetStaticMethodPointer(TEXT("GetManagedClassFromType")); + ManagedClass classInfo; void* assemblyHandle; - CoreCLR::CallStaticMethodInternal(TEXT("GetManagedClassFromType"), type, &classInfo, &assemblyHandle); + CoreCLR::CallStaticMethod(GetManagedClassFromTypePtr, type, &classInfo, &assemblyHandle); CoreCLRAssembly* image = GetAssembly(assemblyHandle); klass = New(classInfo.typeHandle, StringAnsi(classInfo.name), StringAnsi(classInfo.fullname), StringAnsi(classInfo.namespace_), classInfo.typeAttributes, image); if (image != nullptr) image->AddClass(klass); if (type != classInfo.typeHandle) - CoreCLR::CallStaticMethodInternal(TEXT("GetManagedClassFromType"), type, &classInfo); + CoreCLR::CallStaticMethod(GetManagedClassFromTypePtr, type, &classInfo); classHandles.Add(classInfo.typeHandle, klass); CoreCLR::Free((void*)classInfo.name); @@ -564,12 +565,14 @@ CoreCLRClass* GetOrCreateClass(void* type) gchandle CoreCLR::NewGCHandle(void* obj, bool pinned) { - return (gchandle)CoreCLR::CallStaticMethodInternal(TEXT("NewGCHandle"), obj, pinned); + static void* NewGCHandlePtr = CoreCLR::GetStaticMethodPointer(TEXT("NewGCHandle")); + return (gchandle)CoreCLR::CallStaticMethod(NewGCHandlePtr, obj, pinned); } gchandle CoreCLR::NewGCHandleWeakref(void* obj, bool track_resurrection) { - return (gchandle)CoreCLR::CallStaticMethodInternal(TEXT("NewGCHandleWeakref"), obj, track_resurrection); + static void* NewGCHandleWeakrefPtr = CoreCLR::GetStaticMethodPointer(TEXT("NewGCHandleWeakref")); + return (gchandle)CoreCLR::CallStaticMethod(NewGCHandleWeakrefPtr, obj, track_resurrection); } void* CoreCLR::GetGCHandleTarget(const gchandle& gchandle) @@ -579,7 +582,8 @@ void* CoreCLR::GetGCHandleTarget(const gchandle& gchandle) void CoreCLR::FreeGCHandle(const gchandle& gchandle) { - CoreCLR::CallStaticMethodInternal(TEXT("FreeGCHandle"), (void*)gchandle); + static void* FreeGCHandlePtr = CoreCLR::GetStaticMethodPointer(TEXT("FreeGCHandle")); + CoreCLR::CallStaticMethod(FreeGCHandlePtr, (void*)gchandle); } const char* CoreCLR::GetClassFullname(void* klass) @@ -597,7 +601,8 @@ bool CoreCLR::HasCustomAttribute(void* klass) } void* CoreCLR::GetCustomAttribute(void* klass, void* attribClass) { - return CoreCLR::CallStaticMethodInternal(TEXT("GetCustomAttribute"), ((CoreCLRClass*)klass)->GetTypeHandle(), ((CoreCLRClass*)attribClass)->GetTypeHandle()); + static void* GetCustomAttributePtr = CoreCLR::GetStaticMethodPointer(TEXT("GetCustomAttribute")); + return CoreCLR::CallStaticMethod(GetCustomAttributePtr, ((CoreCLRClass*)klass)->GetTypeHandle(), ((CoreCLRClass*)attribClass)->GetTypeHandle()); } Array CoreCLR::GetCustomAttributes(void* klass) { @@ -646,66 +651,78 @@ MONO_API MONO_RT_EXTERNAL_ONLY void mono_add_internal_call(const char* name, con MONO_API mono_unichar2* mono_string_chars(MonoString* s) { - _MonoString* str = (_MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("GetStringPointer"), s); + static void* GetStringPointerPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetStringPointer")); + _MonoString* str = (_MonoString*)CoreCLR::CallStaticMethod(GetStringPointerPtr, s); return str->chars; } MONO_API int mono_string_length(MonoString* s) { - _MonoString* str = (_MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("GetStringPointer"), s); + static void* GetStringPointerPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetStringPointer")); + _MonoString* str = (_MonoString*)CoreCLR::CallStaticMethod(GetStringPointerPtr, s); return str->length; } MONO_API MONO_RT_EXTERNAL_ONLY MonoObject* mono_object_new(MonoDomain* domain, MonoClass* klass) { - return (MonoObject*)CoreCLR::CallStaticMethodInternal(TEXT("NewObject"), ((CoreCLRClass*)klass)->GetTypeHandle()); + static void* NewObjectPtr = CoreCLR::GetStaticMethodPointer(TEXT("NewObject")); + return (MonoObject*)CoreCLR::CallStaticMethod(NewObjectPtr, ((CoreCLRClass*)klass)->GetTypeHandle()); } MONO_API MONO_RT_EXTERNAL_ONLY MonoArray* mono_array_new(MonoDomain* domain, MonoClass* eclass, uintptr_t n) { - return (MonoArray*)CoreCLR::CallStaticMethodInternal(TEXT("NewArray"), ((CoreCLRClass*)eclass)->GetTypeHandle(), n); + static void* NewArrayPtr = CoreCLR::GetStaticMethodPointer(TEXT("NewArray")); + return (MonoArray*)CoreCLR::CallStaticMethod(NewArrayPtr, ((CoreCLRClass*)eclass)->GetTypeHandle(), n); } MONO_API char* mono_array_addr_with_size(MonoArray* array, int size, uintptr_t idx) { - return (char*)CoreCLR::CallStaticMethodInternal(TEXT("GetArrayPointerToElement"), array, size, (int)idx); + static void* GetArrayPointerToElementPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetArrayPointerToElement")); + return (char*)CoreCLR::CallStaticMethod(GetArrayPointerToElementPtr, array, size, (int)idx); } MONO_API uintptr_t mono_array_length(MonoArray* array) { - return CoreCLR::CallStaticMethodInternal(TEXT("GetArrayLength"), array); + static void* GetArrayLengthPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetArrayLength")); + return CoreCLR::CallStaticMethod(GetArrayLengthPtr, array); } MONO_API MonoString* mono_string_empty(MonoDomain* domain) { - return (MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("GetStringEmpty")); + static void* GetStringEmptyPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetStringEmpty")); + return (MonoString*)CoreCLR::CallStaticMethod(GetStringEmptyPtr); } MONO_API MONO_RT_EXTERNAL_ONLY MonoString* mono_string_new_utf16(MonoDomain* domain, const mono_unichar2* text, int32_t len) { - return (MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("NewStringUTF16"), text, len); + static void* NewStringUTF16Ptr = CoreCLR::GetStaticMethodPointer(TEXT("NewStringUTF16")); + return (MonoString*)CoreCLR::CallStaticMethod(NewStringUTF16Ptr, text, len); } MONO_API MONO_RT_EXTERNAL_ONLY MonoString* mono_string_new(MonoDomain* domain, const char* text) { - return (MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("NewString"), text); + static void* NewStringPtr = CoreCLR::GetStaticMethodPointer(TEXT("NewString")); + return (MonoString*)CoreCLR::CallStaticMethod(NewStringPtr, text); } MONO_API MONO_RT_EXTERNAL_ONLY MonoString* mono_string_new_len(MonoDomain* domain, const char* text, unsigned int length) { - return (MonoString*)CoreCLR::CallStaticMethodInternal(TEXT("NewStringLength"), text, length); + static void* NewStringLengthPtr = CoreCLR::GetStaticMethodPointer(TEXT("NewStringLength")); + return (MonoString*)CoreCLR::CallStaticMethod(NewStringLengthPtr, text, length); } MONO_API MONO_RT_EXTERNAL_ONLY char* mono_string_to_utf8(MonoString* string_obj) { - Char* strw = string_obj != nullptr ? (Char*)mono_string_chars(string_obj) : nullptr; - auto len = string_obj != nullptr ? mono_string_length(string_obj) : 0; - ASSERT(len >= 0) - char* stra = (char*)CoreCLR::Allocate(sizeof(char) * (len + 1)); - StringUtils::ConvertUTF162UTF8(strw, stra, len, len); - stra[len] = 0; + static void* GetStringPointerPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetStringPointer")); + _MonoString* monoString = (_MonoString*)CoreCLR::CallStaticMethod(GetStringPointerPtr, string_obj); - return stra; + auto len = monoString->length; + ASSERT(len >= 0) + char* str = (char*)CoreCLR::Allocate(sizeof(char) * (len + 1)); + StringUtils::ConvertUTF162UTF8((Char*)monoString->chars, str, len, len); + str[len] = 0; + + return str; } MONO_API MONO_RT_EXTERNAL_ONLY MonoString* mono_object_to_string(MonoObject* obj, MonoObject** exc) @@ -720,7 +737,8 @@ MONO_API int mono_object_hash(MonoObject* obj) MONO_API MONO_RT_EXTERNAL_ONLY MonoObject* mono_value_box(MonoDomain* domain, MonoClass* klass, void* val) { - return (MonoObject*)CoreCLR::CallStaticMethodInternal(TEXT("BoxValue"), ((CoreCLRClass*)klass)->GetTypeHandle(), val); + static void* BoxValuePtr = CoreCLR::GetStaticMethodPointer(TEXT("BoxValue")); + return (MonoObject*)CoreCLR::CallStaticMethod(BoxValuePtr, ((CoreCLRClass*)klass)->GetTypeHandle(), val); } MONO_API void mono_value_copy(void* dest, /*const*/ void* src, MonoClass* klass) @@ -731,7 +749,8 @@ MONO_API void mono_value_copy(void* dest, /*const*/ void* src, MonoClass* klass) MONO_API MONO_RT_EXTERNAL_ONLY MonoClass* mono_object_get_class(MonoObject* obj) { - void* classHandle = CoreCLR::CallStaticMethodInternal(TEXT("GetObjectType"), obj); + static void* GetObjectTypePtr = CoreCLR::GetStaticMethodPointer(TEXT("GetObjectType")); + void* classHandle = CoreCLR::CallStaticMethod(GetObjectTypePtr, obj); CoreCLRClass* mi = GetOrCreateClass((void*)classHandle); @@ -741,17 +760,20 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoClass* mono_object_get_class(MonoObject* obj) MONO_API void* mono_object_unbox(MonoObject* obj) { - return CoreCLR::CallStaticMethodInternal(TEXT("UnboxValue"), obj); + static void* UnboxValuePtr = CoreCLR::GetStaticMethodPointer(TEXT("UnboxValue")); + return CoreCLR::CallStaticMethod(UnboxValuePtr, obj); } MONO_API MONO_RT_EXTERNAL_ONLY void mono_raise_exception(MonoException* ex) { - CoreCLR::CallStaticMethodInternal(TEXT("RaiseException"), ex); + static void* RaiseExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("RaiseException")); + CoreCLR::CallStaticMethod(RaiseExceptionPtr, ex); } MONO_API MONO_RT_EXTERNAL_ONLY void mono_runtime_object_init(MonoObject* this_obj) { - CoreCLR::CallStaticMethodInternal(TEXT("ObjectInit"), this_obj); + static void* ObjectInitPtr = CoreCLR::GetStaticMethodPointer(TEXT("ObjectInit")); + CoreCLR::CallStaticMethod(ObjectInitPtr, this_obj); } MONO_API MonoMethod* mono_object_get_virtual_method(MonoObject* obj, MonoMethod* method) @@ -763,29 +785,32 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoObject* mono_runtime_invoke(MonoMethod* metho { CoreCLRMethod* mi = (CoreCLRMethod*)method; void* methodPtr = mi->GetMethodHandle(); - ASSERT(methodPtr != nullptr) + ASSERT(methodPtr != nullptr); static void* InvokeMethodPtr = CoreCLR::GetStaticMethodPointer(TEXT("InvokeMethod")); - return (MonoObject*)CoreCLR::CallStaticMethodInternalPointer(InvokeMethodPtr, obj, methodPtr, params, exc); + return (MonoObject*)CoreCLR::CallStaticMethod(InvokeMethodPtr, obj, methodPtr, params, exc); } MONO_API MONO_RT_EXTERNAL_ONLY void* mono_method_get_unmanaged_thunk(MonoMethod* method) { CoreCLRMethod* mi = (CoreCLRMethod*)method; void* methodPtr = mi->GetMethodHandle(); - ASSERT(methodPtr != nullptr) + ASSERT(methodPtr != nullptr); - return CoreCLR::CallStaticMethodInternal(TEXT("GetMethodUnmanagedFunctionPointer"), methodPtr); + static void* GetMethodUnmanagedFunctionPointerPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetMethodUnmanagedFunctionPointer")); + return CoreCLR::CallStaticMethod(GetMethodUnmanagedFunctionPointerPtr, methodPtr); } MONO_API void mono_field_set_value(MonoObject* obj, MonoClassField* field, void* value) { - CoreCLR::CallStaticMethodInternal(TEXT("FieldSetValue"), obj, ((CoreCLRField*)field)->GetHandle(), value); + static void* FieldSetValuePtr = CoreCLR::GetStaticMethodPointer(TEXT("FieldSetValue")); + CoreCLR::CallStaticMethod(FieldSetValuePtr, obj, ((CoreCLRField*)field)->GetHandle(), value); } MONO_API void mono_field_get_value(MonoObject* obj, MonoClassField* field, void* value) { - CoreCLR::CallStaticMethodInternal(TEXT("FieldGetValue"), obj, ((CoreCLRField*)field)->GetHandle(), value); + static void* FieldGetValuePtr = CoreCLR::GetStaticMethodPointer(TEXT("FieldGetValue")); + CoreCLR::CallStaticMethod(FieldGetValuePtr, obj, ((CoreCLRField*)field)->GetHandle(), value); } MONO_API MONO_RT_EXTERNAL_ONLY MonoObject* mono_field_get_value_object(MonoDomain* domain, MonoClassField* field, MonoObject* obj) @@ -809,7 +834,8 @@ MONO_API void mono_gc_wbarrier_set_field(MonoObject* obj, void* field_ptr, MonoO } MONO_API void mono_gc_wbarrier_set_arrayref(MonoArray* arr, void* slot_ptr, MonoObject* value) { - CoreCLR::CallStaticMethodInternal(TEXT("SetArrayValueReference"), arr, slot_ptr, value); + static void* SetArrayValueReferencePtr = CoreCLR::GetStaticMethodPointer(TEXT("SetArrayValueReference")); + CoreCLR::CallStaticMethod(SetArrayValueReferencePtr, arr, slot_ptr, value); } MONO_API void mono_gc_wbarrier_generic_store(void* ptr, MonoObject* value) { @@ -844,7 +870,8 @@ MONO_API MonoAssembly* mono_domain_assembly_open(MonoDomain* domain, const char* { const char* name; const char* fullname; - void* assemblyHandle = CoreCLR::CallStaticMethodInternal(TEXT("LoadAssemblyFromPath"), path, &name, &fullname); + static void* LoadAssemblyFromPathPtr = CoreCLR::GetStaticMethodPointer(TEXT("LoadAssemblyFromPath")); + void* assemblyHandle = CoreCLR::CallStaticMethod(LoadAssemblyFromPathPtr, path, &name, &fullname); CoreCLRAssembly* assembly = New(assemblyHandle, name, fullname); CoreCLR::Free((void*)name); @@ -861,7 +888,8 @@ MONO_API MonoImage* mono_get_corlib(void) { const char* name; const char* fullname; - void* assemblyHandle = CoreCLR::CallStaticMethodInternal(TEXT("GetAssemblyByName"), "System.Private.CoreLib", &name, &fullname); + static void* GetAssemblyByNamePtr = CoreCLR::GetStaticMethodPointer(TEXT("GetAssemblyByName")); + void* assemblyHandle = CoreCLR::CallStaticMethod(GetAssemblyByNamePtr, "System.Private.CoreLib", &name, &fullname); corlibimage = New(assemblyHandle, name, fullname); CoreCLR::Free((void*)name); @@ -983,15 +1011,6 @@ MONO_API MonoClass* mono_get_string_class(void) return (MonoClass*)klass; } -/* - * jit.h -*/ - -MONO_API char* mono_get_runtime_build_info(void) -{ - return CoreCLR::CallStaticMethodInternal(TEXT("GetRuntimeInformation")); -} - /* * assembly.h */ @@ -1005,7 +1024,8 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoAssembly* mono_assembly_load_from_full(MonoIm MONO_API void mono_assembly_close(MonoAssembly* assembly) { - CoreCLR::CallStaticMethodInternal(TEXT("CloseAssembly"), ((CoreCLRAssembly*)assembly)->GetHandle()); + static void* CloseAssemblyPtr = CoreCLR::GetStaticMethodPointer(TEXT("CloseAssembly")); + CoreCLR::CallStaticMethod(CloseAssemblyPtr, ((CoreCLRAssembly*)assembly)->GetHandle()); Delete((CoreCLRAssembly*)assembly); } @@ -1053,7 +1073,8 @@ MONO_API void mono_debug_open_image_from_memory(MonoImage* image, const mono_byt MONO_API MONO_RT_EXTERNAL_ONLY MonoReflectionAssembly* mono_assembly_get_object(MonoDomain* domain, MonoAssembly* assembly) { - return (MonoReflectionAssembly*)CoreCLR::CallStaticMethodInternal(TEXT("GetAssemblyObject"), ((CoreCLRAssembly*)assembly)->GetFullname().Get()); + static void* GetAssemblyObjectPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetAssemblyObject")); + return (MonoReflectionAssembly*)CoreCLR::CallStaticMethod(GetAssemblyObjectPtr, ((CoreCLRAssembly*)assembly)->GetFullname().Get()); } MONO_API MONO_RT_EXTERNAL_ONLY MonoReflectionType* mono_type_get_object(MonoDomain* domain, MonoType* type) @@ -1166,11 +1187,10 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoClass* mono_array_class_get(MonoClass* elemen MONO_API MONO_RT_EXTERNAL_ONLY MonoClassField* mono_class_get_field_from_name(MonoClass* klass, const char* name) { - StringAnsi name2(name); CoreCLRClass* mi = (CoreCLRClass*)klass; for (auto field : mi->GetFields()) { - if (field->GetName() == name2) + if (field->GetName() == name) return (MonoClassField*)field; } return nullptr; @@ -1178,11 +1198,10 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoClassField* mono_class_get_field_from_name(Mo MONO_API MonoProperty* mono_class_get_property_from_name(MonoClass* klass, const char* name) { - StringAnsi name2(name); CoreCLRClass* mi = (CoreCLRClass*)klass; for (auto prop : mi->GetProperties()) { - if (prop->GetName() == name2) + if (prop->GetName() == name) return (MonoProperty*)prop; } return nullptr; @@ -1195,7 +1214,8 @@ MONO_API int32_t mono_class_instance_size(MonoClass* klass) MONO_API int32_t mono_class_value_size(MonoClass* klass, uint32* align) { - return CoreCLR::CallStaticMethodInternal(TEXT("NativeSizeOf"), ((CoreCLRClass*)klass)->GetTypeHandle(), align); + static void* NativeSizeOfPtr = CoreCLR::GetStaticMethodPointer(TEXT("NativeSizeOf")); + return CoreCLR::CallStaticMethod(NativeSizeOfPtr, ((CoreCLRClass*)klass)->GetTypeHandle(), align); } MONO_API MonoClass* mono_class_from_mono_type(MonoType* type) @@ -1206,7 +1226,8 @@ MONO_API MonoClass* mono_class_from_mono_type(MonoType* type) MONO_API mono_bool mono_class_is_subclass_of(MonoClass* klass, MonoClass* klassc, mono_bool check_interfaces) { - return CoreCLR::CallStaticMethodInternal(TEXT("TypeIsSubclassOf"), ((CoreCLRClass*)klass)->GetTypeHandle(), ((CoreCLRClass*)klassc)->GetTypeHandle(), check_interfaces); + static void* TypeIsSubclassOfPtr = CoreCLR::GetStaticMethodPointer(TEXT("TypeIsSubclassOf")); + return CoreCLR::CallStaticMethod(TypeIsSubclassOfPtr, ((CoreCLRClass*)klass)->GetTypeHandle(), ((CoreCLRClass*)klassc)->GetTypeHandle(), check_interfaces); } MONO_API char* mono_type_get_name(MonoType* type) @@ -1227,17 +1248,20 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoClass* mono_class_get_element_class(MonoClass MONO_API MONO_RT_EXTERNAL_ONLY mono_bool mono_class_is_valuetype(MonoClass* klass) { - return (mono_bool)CoreCLR::CallStaticMethodInternal(TEXT("TypeIsValueType"), ((CoreCLRClass*)klass)->GetTypeHandle()); + static void* TypeIsValueTypePtr = CoreCLR::GetStaticMethodPointer(TEXT("TypeIsValueType")); + return (mono_bool)CoreCLR::CallStaticMethod(TypeIsValueTypePtr, ((CoreCLRClass*)klass)->GetTypeHandle()); } MONO_API MONO_RT_EXTERNAL_ONLY mono_bool mono_class_is_enum(MonoClass* klass) { - return (mono_bool)CoreCLR::CallStaticMethodInternal(TEXT("TypeIsEnum"), ((CoreCLRClass*)klass)->GetTypeHandle()); + static void* TypeIsEnumPtr = CoreCLR::GetStaticMethodPointer(TEXT("TypeIsEnum")); + return (mono_bool)CoreCLR::CallStaticMethod(TypeIsEnumPtr, ((CoreCLRClass*)klass)->GetTypeHandle()); } MONO_API MONO_RT_EXTERNAL_ONLY MonoClass* mono_class_get_parent(MonoClass* klass) { - void* parentHandle = CoreCLR::CallStaticMethodInternal(TEXT("GetClassParent"), ((CoreCLRClass*)klass)->GetTypeHandle()); + static void* GetClassParentPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetClassParent")); + void* parentHandle = CoreCLR::CallStaticMethod(GetClassParentPtr, ((CoreCLRClass*)klass)->GetTypeHandle()); return (MonoClass*)classHandles[parentHandle]; } @@ -1426,7 +1450,8 @@ MONO_API mono_bool mono_type_is_byref(MonoType* type) MONO_API int mono_type_get_type(MonoType* type) { - return CoreCLR::CallStaticMethodInternal(TEXT("GetTypeMonoTypeEnum"), type); + static void* GetTypeMonoTypeEnumPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetTypeMonoTypeEnum")); + return CoreCLR::CallStaticMethod(GetTypeMonoTypeEnumPtr, type); } MONO_API MonoClass* mono_type_get_class(MonoType* type) @@ -1482,7 +1507,8 @@ MONO_API uint32 mono_signature_get_param_count(MonoMethodSignature* sig) MONO_API mono_bool mono_signature_param_is_out(MonoMethodSignature* sig, int param_num) { CoreCLRMethod* mi = (CoreCLRMethod*)sig; - return CoreCLR::CallStaticMethodInternal(TEXT("GetMethodParameterIsOut"), mi->GetMethodHandle(), param_num); + static void* GetMethodParameterIsOutPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetMethodParameterIsOut")); + return CoreCLR::CallStaticMethod(GetMethodParameterIsOutPtr, mi->GetMethodHandle(), param_num); } MONO_API int mono_type_stack_size(MonoType* type, int* alignment) @@ -1501,27 +1527,32 @@ MONO_API MonoException* mono_exception_from_name_msg(MonoImage* image, const cha MONO_API MonoException* mono_get_exception_null_reference(void) { - return (MonoException*)CoreCLR::CallStaticMethodInternal(TEXT("GetNullReferenceException")); + static void* GetNullReferenceExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetNullReferenceException")); + return (MonoException*)CoreCLR::CallStaticMethod(GetNullReferenceExceptionPtr); } MONO_API MonoException* mono_get_exception_not_supported(const char* msg) { - return (MonoException*)CoreCLR::CallStaticMethodInternal(TEXT("GetNotSupportedException")); + static void* GetNotSupportedExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetNotSupportedException")); + return (MonoException*)CoreCLR::CallStaticMethod(GetNotSupportedExceptionPtr); } MONO_API MONO_RT_EXTERNAL_ONLY MonoException* mono_get_exception_argument_null(const char* arg) { - return (MonoException*)CoreCLR::CallStaticMethodInternal(TEXT("GetArgumentNullException")); + static void* GetArgumentNullExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetArgumentNullException")); + return (MonoException*)CoreCLR::CallStaticMethod(GetArgumentNullExceptionPtr); } MONO_API MonoException* mono_get_exception_argument(const char* arg, const char* msg) { - return (MonoException*)CoreCLR::CallStaticMethodInternal(TEXT("GetArgumentException")); + static void* GetArgumentExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetArgumentException")); + return (MonoException*)CoreCLR::CallStaticMethod(GetArgumentExceptionPtr); } MONO_API MONO_RT_EXTERNAL_ONLY MonoException* mono_get_exception_argument_out_of_range(const char* arg) { - return (MonoException*)CoreCLR::CallStaticMethodInternal(TEXT("GetArgumentOutOfRangeException")); + static void* GetArgumentOutOfRangeExceptionPtr = CoreCLR::GetStaticMethodPointer(TEXT("GetArgumentOutOfRangeException")); + return (MonoException*)CoreCLR::CallStaticMethod(GetArgumentOutOfRangeExceptionPtr); } /* @@ -1532,7 +1563,8 @@ MONO_API MONO_RT_EXTERNAL_ONLY MonoImage* mono_image_open_from_data_with_name(ch { const char* name; const char* fullname; - void* assemblyHandle = CoreCLR::CallStaticMethodInternal(TEXT("LoadAssemblyImage"), data, data_len, path, &name, &fullname); + static void* LoadAssemblyImagePtr = CoreCLR::GetStaticMethodPointer(TEXT("LoadAssemblyImage")); + void* assemblyHandle = CoreCLR::CallStaticMethod(LoadAssemblyImagePtr, data, data_len, path, &name, &fullname); CoreCLRAssembly* assembly = New(assemblyHandle, name, fullname); CoreCLR::Free((void*)name); diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.cpp b/Source/Engine/Scripting/ManagedCLR/MCore.cpp index cc0aca74f..f1b7763cb 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MCore.cpp @@ -136,21 +136,21 @@ bool MCore::LoadEngine() // Prepare managed side const String hostExecutable = Platform::GetExecutableFilePath(); - CoreCLR::CallStaticMethodInternal(TEXT("Init"), hostExecutable.Get()); + CoreCLR::CallStaticMethodByName(TEXT("Init"), hostExecutable.Get()); MRootDomain = New("Root"); MDomains.Add(MRootDomain); - char* buildInfo = mono_get_runtime_build_info(); + char* buildInfo = CoreCLR::CallStaticMethodByName(TEXT("GetRuntimeInformation")); LOG(Info, ".NET runtime version: {0}", String(buildInfo)); - mono_free(buildInfo); + CoreCLR::Free(buildInfo); return false; } void MCore::UnloadEngine() { - CoreCLR::CallStaticMethodInternal(TEXT("Exit")); + CoreCLR::CallStaticMethodByName(TEXT("Exit")); MDomains.ClearDelete(); MRootDomain = nullptr; } diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs index 60eaad2d1..27cc24a10 100644 --- a/Source/Engine/Utilities/Utils.cs +++ b/Source/Engine/Utilities/Utils.cs @@ -341,9 +341,12 @@ namespace FlaxEngine return result; } +#if USE_NETCORE +#else [LibraryImport("FlaxEngine", EntryPoint = "FlaxEngine.Utils::Internal_ExtractArrayFromList")] [return: MarshalUsing(typeof(FlaxEngine.SystemArrayMarshaller))] internal static partial Array Internal_ExtractArrayFromList([MarshalUsing(typeof(FlaxEngine.GCHandleMarshaller))] object list); +#endif /// /// Reads the color from the binary stream. diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 77f217ea8..88113a756 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -1195,7 +1195,8 @@ namespace Flax.Build.Bindings #if USE_NETCORE if (!string.IsNullOrEmpty(marshallerName)) { - string marshallerDefinition = $$""" + contents.AppendLine(); + contents.AppendLine(String.Join("\n" + indent, (indent + $$""" [CustomMarshaller(typeof({{classInfo.Name}}), MarshalMode.ManagedToUnmanagedIn, typeof({{marshallerName}}.ManagedToNative))] [CustomMarshaller(typeof({{classInfo.Name}}), MarshalMode.UnmanagedToManagedOut, typeof({{marshallerName}}.ManagedToNative))] [CustomMarshaller(typeof({{classInfo.Name}}), MarshalMode.ElementIn, typeof({{marshallerName}}.ManagedToNative))] @@ -1207,34 +1208,33 @@ namespace Flax.Build.Bindings [CustomMarshaller(typeof({{classInfo.Name}}), MarshalMode.ElementRef, typeof({{marshallerName}}))] internal static class {{marshallerName}} { - public static class NativeToManaged - { - public static {{classInfo.Name}} ConvertToManaged(IntPtr unmanaged) => ({{classInfo.Name}})GCHandleMarshaller.NativeToManaged.ConvertToManaged(unmanaged); - public static void Free(IntPtr unmanaged) => GCHandleMarshaller.NativeToManaged.Free(unmanaged); - } - public static class ManagedToNative - { - public static IntPtr ConvertToUnmanaged({{classInfo.Name}} managed) => GCHandleMarshaller.ManagedToNative.ConvertToUnmanaged(managed); - public static void Free(IntPtr unmanaged) => GCHandleMarshaller.ManagedToNative.Free(unmanaged); - } - public struct Bidirectional - { - GCHandleMarshaller.Bidirectional marsh; - public void FromManaged({{classInfo.Name}} managed) => marsh.FromManaged(managed); - public IntPtr ToUnmanaged() => marsh.ToUnmanaged(); - public void FromUnmanaged(IntPtr unmanaged) => marsh.FromUnmanaged(unmanaged); - public {{classInfo.Name}} ToManaged() => ({{classInfo.Name}})marsh.ToManaged(); - public void Free() => marsh.Free(); - } - internal static {{classInfo.Name}} ConvertToManaged(IntPtr unmanaged) => ({{classInfo.Name}})GCHandleMarshaller.ConvertToManaged(unmanaged); - internal static IntPtr ConvertToUnmanaged({{classInfo.Name}} managed) => GCHandleMarshaller.ConvertToUnmanaged(managed); - internal static void Free(IntPtr unmanaged) => GCHandleMarshaller.Free(unmanaged); + public static class NativeToManaged + { + public static {{classInfo.Name}} ConvertToManaged(IntPtr unmanaged) => ({{classInfo.Name}})GCHandleMarshaller.NativeToManaged.ConvertToManaged(unmanaged); + public static void Free(IntPtr unmanaged) => GCHandleMarshaller.NativeToManaged.Free(unmanaged); + } + public static class ManagedToNative + { + public static IntPtr ConvertToUnmanaged({{classInfo.Name}} managed) => GCHandleMarshaller.ManagedToNative.ConvertToUnmanaged(managed); + public static void Free(IntPtr unmanaged) => GCHandleMarshaller.ManagedToNative.Free(unmanaged); + } + public struct Bidirectional + { + GCHandleMarshaller.Bidirectional marsh; + public void FromManaged({{classInfo.Name}} managed) => marsh.FromManaged(managed); + public IntPtr ToUnmanaged() => marsh.ToUnmanaged(); + public void FromUnmanaged(IntPtr unmanaged) => marsh.FromUnmanaged(unmanaged); + public {{classInfo.Name}} ToManaged() => ({{classInfo.Name}})marsh.ToManaged(); + public void Free() => marsh.Free(); + } + internal static {{classInfo.Name}} ConvertToManaged(IntPtr unmanaged) => ({{classInfo.Name}})GCHandleMarshaller.ConvertToManaged(unmanaged); + internal static IntPtr ConvertToUnmanaged({{classInfo.Name}} managed) => GCHandleMarshaller.ConvertToUnmanaged(managed); + internal static void Free(IntPtr unmanaged) => GCHandleMarshaller.Free(unmanaged); - internal static {{classInfo.Name}} ToManaged(IntPtr managed) => ({{classInfo.Name}})GCHandleMarshaller.ToManaged(managed); - internal static IntPtr ToNative({{classInfo.Name}} managed) => GCHandleMarshaller.ToNative(managed); + internal static {{classInfo.Name}} ToManaged(IntPtr managed) => ({{classInfo.Name}})GCHandleMarshaller.ToManaged(managed); + internal static IntPtr ToNative({{classInfo.Name}} managed) => GCHandleMarshaller.ToNative(managed); } - """; - contents.AppendLine(marshallerDefinition); + """).Split(new char[] { '\n'}))); } #endif // Namespace end