Add support for compiling and running engine without C# scripting
(configurable via `EngineConfiguration.UseCSharp` in Flax.Build)
This commit is contained in:
87
Source/Engine/Scripting/ManagedCLR/MDomain.cpp
Normal file
87
Source/Engine/Scripting/ManagedCLR/MDomain.cpp
Normal file
@@ -0,0 +1,87 @@
|
||||
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
||||
|
||||
#include "MDomain.h"
|
||||
#include "MCore.h"
|
||||
#include "MAssembly.h"
|
||||
#include "Engine/Threading/Threading.h"
|
||||
#include "Engine/Core/Log.h"
|
||||
#include "Engine/Debug/Exceptions/ArgumentException.h"
|
||||
#include "Engine/Debug/Exceptions/Exceptions.h"
|
||||
#if USE_MONO
|
||||
#include <ThirdParty/mono-2.0/mono/metadata/threads.h>
|
||||
#endif
|
||||
|
||||
extern MDomain* MActiveDomain;
|
||||
|
||||
MDomain::MDomain(const MString& domainName)
|
||||
: _domainName(domainName)
|
||||
{
|
||||
}
|
||||
|
||||
bool MDomain::SetCurrentDomain(bool force)
|
||||
{
|
||||
#if USE_MONO
|
||||
if (mono_domain_set(_monoDomain, force) == 0)
|
||||
return false;
|
||||
#endif
|
||||
MActiveDomain = this;
|
||||
return true;
|
||||
}
|
||||
|
||||
MAssembly* MDomain::CreateEmptyAssembly(const MString& assemblyName, const MAssemblyOptions options)
|
||||
{
|
||||
// Validates if assembly is already open
|
||||
if (_assemblies.ContainsKey(assemblyName))
|
||||
{
|
||||
Log::ArgumentException(String::Format(TEXT("{0} assembly has already been added"), String(assemblyName)));
|
||||
return _assemblies.At(assemblyName);
|
||||
}
|
||||
|
||||
// Create shared pointer to the assembly
|
||||
const auto assembly = New<MAssembly>(this, assemblyName, options);
|
||||
|
||||
// Add assembly instance to dictionary
|
||||
_assemblies.Add(assemblyName, assembly);
|
||||
|
||||
return assembly;
|
||||
}
|
||||
|
||||
void MDomain::RemoveAssembly(const MString& assemblyName)
|
||||
{
|
||||
auto assembly = _assemblies[assemblyName];
|
||||
_assemblies.Remove(assemblyName);
|
||||
Delete(assembly);
|
||||
}
|
||||
|
||||
MAssembly* MDomain::GetAssembly(const MString& assemblyName) const
|
||||
{
|
||||
MAssembly* result = nullptr;
|
||||
if (!_assemblies.TryGet(assemblyName, result))
|
||||
{
|
||||
Log::ArgumentOutOfRangeException(TEXT("Current assembly was not found in given domain"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void MDomain::Dispatch() const
|
||||
{
|
||||
#if USE_MONO
|
||||
if (!IsInMainThread())
|
||||
{
|
||||
mono_thread_attach(_monoDomain);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
MClass* MDomain::FindClass(const StringAnsiView& fullname) const
|
||||
{
|
||||
for (auto assembly = _assemblies.Begin(); assembly != _assemblies.End(); ++assembly)
|
||||
{
|
||||
const auto currentClass = assembly->Value->GetClass(fullname);
|
||||
if (!currentClass)
|
||||
{
|
||||
return currentClass;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
Reference in New Issue
Block a user