CmScriptManager.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include "CmScriptManager.h"
  2. #include "CmException.h"
  3. #include "CmScriptAssembly.h"
  4. #include <mono/metadata/assembly.h>
  5. #include <mono/metadata/mono-config.h>
  6. namespace CamelotFramework
  7. {
  8. const String ScriptManager::DOMAIN_NAME = "BansheeEngine";
  9. const String ScriptManager::MONO_LIB_DIR = "..\\..\\Mono\\lib";
  10. const String ScriptManager::MONO_ETC_DIR = "..\\..\\Mono\\etc";
  11. ScriptManager::ScriptManager()
  12. {
  13. mono_set_dirs(MONO_LIB_DIR.c_str(), MONO_ETC_DIR.c_str());
  14. mono_config_parse(nullptr);
  15. mDomain = mono_jit_init (DOMAIN_NAME.c_str());
  16. if(mDomain == nullptr)
  17. {
  18. CM_EXCEPT(InternalErrorException, "Cannot initialize Mono runtime.");
  19. }
  20. }
  21. ScriptManager::~ScriptManager()
  22. {
  23. for(auto& entry : mAssemblies)
  24. {
  25. cm_delete(entry.second);
  26. }
  27. mAssemblies.clear();
  28. if(mDomain != nullptr)
  29. mono_jit_cleanup(mDomain);
  30. }
  31. ScriptAssembly& ScriptManager::loadAssembly(const String& name)
  32. {
  33. auto iterFind = mAssemblies.find(name);
  34. if(iterFind != mAssemblies.end())
  35. {
  36. return *iterFind->second;
  37. }
  38. MonoAssembly* monoAssembly = mono_domain_assembly_open (mDomain, name.c_str());
  39. if(monoAssembly == nullptr)
  40. {
  41. CM_EXCEPT(InvalidParametersException, "Cannot load Mono assembly: " + name);
  42. }
  43. ScriptAssembly* assembly = new (cm_alloc<ScriptAssembly>()) ScriptAssembly(monoAssembly);
  44. mAssemblies[name] = assembly;
  45. return *assembly;
  46. }
  47. }