BsMonoManager.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "BsMonoManager.h"
  2. #include "CmException.h"
  3. #include "BsScriptMeta.h"
  4. #include "BsMonoAssembly.h"
  5. #include "BsMonoClass.h"
  6. #include <mono/metadata/assembly.h>
  7. #include <mono/metadata/mono-config.h>
  8. using namespace CamelotFramework;
  9. namespace BansheeEngine
  10. {
  11. const String MonoManager::MONO_LIB_DIR = "..\\..\\Mono\\lib";
  12. const String MonoManager::MONO_ETC_DIR = "..\\..\\Mono\\etc";
  13. MonoManager::MonoManager()
  14. {
  15. mono_set_dirs(MONO_LIB_DIR.c_str(), MONO_ETC_DIR.c_str());
  16. mono_config_parse(nullptr);
  17. }
  18. MonoManager::~MonoManager()
  19. {
  20. for(auto& entry : mAssemblies)
  21. {
  22. unloadAssembly(*entry.second);
  23. cm_delete(entry.second);
  24. }
  25. mAssemblies.clear();
  26. }
  27. MonoAssembly& MonoManager::loadAssembly(const String& path, const String& name, const String& entryPoint)
  28. {
  29. MonoAssembly* assembly = nullptr;
  30. auto iterFind = mAssemblies.find(name);
  31. if(iterFind != mAssemblies.end())
  32. {
  33. assembly = iterFind->second;
  34. }
  35. else
  36. {
  37. assembly = new (cm_alloc<MonoAssembly>()) MonoAssembly();
  38. mAssemblies[name] = assembly;
  39. }
  40. if(!assembly->mIsLoaded)
  41. {
  42. assembly->load(path, name);
  43. // Fully initialize all types that use this assembly
  44. Vector<ScriptMeta*>::type& mTypeMetas = getTypesToInitialize()[name];
  45. for(auto& meta : mTypeMetas)
  46. {
  47. meta->scriptClass = &assembly->getClass(meta->ns, meta->name);
  48. meta->thisPtrField = &meta->scriptClass->getField("mCachedPtr");
  49. meta->initCallback();
  50. }
  51. assembly->initialize(entryPoint); // Perform any initialization after everything is loaded
  52. }
  53. return *assembly;
  54. }
  55. void MonoManager::unloadAssembly(MonoAssembly& assembly)
  56. {
  57. ::MonoAssembly* monoAssembly = assembly.mMonoAssembly;
  58. assembly.unload();
  59. if(monoAssembly)
  60. mono_assembly_close(monoAssembly);
  61. }
  62. void MonoManager::registerScriptType(ScriptMeta* metaData)
  63. {
  64. Vector<ScriptMeta*>::type& mMetas = getTypesToInitialize()[metaData->assembly];
  65. mMetas.push_back(metaData);
  66. }
  67. }