Add support for compiling and running engine without C# scripting

(configurable via `EngineConfiguration.UseCSharp` in Flax.Build)
This commit is contained in:
Wojtek Figat
2021-10-23 16:41:57 +02:00
parent 0b3d6b03ac
commit 8938f13a0b
86 changed files with 1244 additions and 688 deletions

View File

@@ -18,8 +18,10 @@
#include "ManagedCLR/MCore.h"
#endif
#include "FlaxEngine.Gen.h"
#if USE_MONO
#include <ThirdParty/mono-2.0/mono/metadata/object.h>
#include <ThirdParty/mono-2.0/mono/metadata/appdomain.h>
#endif
#define ScriptingObject_unmanagedPtr "__unmanagedPtr"
#define ScriptingObject_id "__internalId"
@@ -54,14 +56,18 @@ ScriptingObject::~ScriptingObject()
}
}
MonoObject* ScriptingObject::GetManagedInstance() const
MObject* ScriptingObject::GetManagedInstance() const
{
#if USE_MONO
return _gcHandle ? mono_gchandle_get_target(_gcHandle) : nullptr;
#else
return nullptr;
#endif
}
MonoObject* ScriptingObject::GetOrCreateManagedInstance() const
MObject* ScriptingObject::GetOrCreateManagedInstance() const
{
MonoObject* managedInstance = GetManagedInstance();
MObject* managedInstance = GetManagedInstance();
if (!managedInstance)
{
const_cast<ScriptingObject*>(this)->CreateManaged();
@@ -144,9 +150,10 @@ void* ScriptingObject::ToInterface(ScriptingObject* obj, const ScriptingTypeHand
return result;
}
ScriptingObject* ScriptingObject::ToNative(MonoObject* obj)
ScriptingObject* ScriptingObject::ToNative(MObject* obj)
{
ScriptingObject* ptr = nullptr;
#if USE_MONO
if (obj)
{
// TODO: cache the field offset from object and read directly from object pointer
@@ -154,6 +161,7 @@ ScriptingObject* ScriptingObject::ToNative(MonoObject* obj)
CHECK_RETURN(ptrField, nullptr);
mono_field_get_value(obj, ptrField, &ptr);
}
#endif
return ptr;
}
@@ -191,7 +199,9 @@ void ScriptingObject::OnManagedInstanceDeleted()
// Release the handle
if (_gcHandle)
{
#if USE_MONO
mono_gchandle_free(_gcHandle);
#endif
_gcHandle = 0;
}
@@ -212,6 +222,8 @@ void ScriptingObject::OnScriptingDispose()
DeleteObject();
}
#if USE_MONO
MonoObject* ScriptingObject::CreateManagedInternal()
{
#if BUILD_DEBUG
@@ -254,8 +266,11 @@ MonoObject* ScriptingObject::CreateManagedInternal()
return managedInstance;
}
#endif
void ScriptingObject::DestroyManaged()
{
#if USE_MONO
// Get managed instance
const auto managedInstance = GetManagedInstance();
@@ -279,6 +294,9 @@ void ScriptingObject::DestroyManaged()
mono_gchandle_free(_gcHandle);
_gcHandle = 0;
}
#else
_gcHandle = 0;
#endif
}
void ScriptingObject::RegisterObject()
@@ -319,6 +337,8 @@ bool ScriptingObject::CanCast(MClass* from, MClass* to)
return from->IsSubClassOf(to);
}
#if USE_MONO
bool ScriptingObject::CanCast(MClass* from, MonoClass* to)
{
if (!from && !to)
@@ -333,6 +353,8 @@ bool ScriptingObject::CanCast(MClass* from, MonoClass* to)
return from->IsSubClassOf(to);
}
#endif
void ScriptingObject::OnDeleteObject()
{
// Cleanup managed object
@@ -358,6 +380,7 @@ ManagedScriptingObject::ManagedScriptingObject(const SpawnParams& params)
void ManagedScriptingObject::CreateManaged()
{
#if USE_MONO
MonoObject* managedInstance = CreateManagedInternal();
if (managedInstance)
{
@@ -368,6 +391,11 @@ void ManagedScriptingObject::CreateManaged()
if (!IsRegistered())
RegisterObject();
}
#else
// Ensure to be registered
if (!IsRegistered())
RegisterObject();
#endif
}
PersistentScriptingObject::PersistentScriptingObject(const SpawnParams& params)
@@ -385,7 +413,9 @@ void PersistentScriptingObject::OnManagedInstanceDeleted()
// Cleanup
if (_gcHandle)
{
#if USE_MONO
mono_gchandle_free(_gcHandle);
#endif
_gcHandle = 0;
}
@@ -404,6 +434,7 @@ void PersistentScriptingObject::OnScriptingDispose()
void PersistentScriptingObject::CreateManaged()
{
#if USE_MONO
MonoObject* managedInstance = CreateManagedInternal();
if (managedInstance)
{
@@ -414,11 +445,18 @@ void PersistentScriptingObject::CreateManaged()
if (!IsRegistered())
RegisterObject();
}
#else
// Ensure to be registered
if (!IsRegistered())
RegisterObject();
#endif
}
class ScriptingObjectInternal
{
public:
#if !COMPILE_WITHOUT_CSHARP
static MonoObject* Create1(MonoReflectionType* type)
{
@@ -676,6 +714,14 @@ public:
ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetUnmanagedInterface", &GetUnmanagedInterface);
}
#else
static void InitRuntime()
{
}
#endif
static ScriptingObject* Spawn(const ScriptingObjectSpawnParams& params)
{
return New<PersistentScriptingObject>(params);