MonoInit.cc 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright: All Rights Reserved
  2. // Author: egametang@gmail.com (tanghai)
  3. #include <glog/logging.h>
  4. #include <mono/jit/jit.h>
  5. #include <mono/metadata/assembly.h>
  6. #include <mono/metadata/debug-helpers.h>
  7. #include <mono/metadata/mono-gc.h>
  8. #include <mono/metadata/class.h>
  9. #include "Mono/MonoInit.h"
  10. namespace Egametang {
  11. MonoInit::MonoInit(const std::string & domainName)
  12. {
  13. domain = mono_jit_init(domainName.c_str());
  14. }
  15. MonoInit::~MonoInit()
  16. {
  17. mono_jit_cleanup(domain);
  18. }
  19. void MonoInit::LoadAssembly(const std::string& fileName)
  20. {
  21. MonoAssembly* assembly = mono_domain_assembly_open(domain, fileName.c_str());
  22. MonoImage* image = mono_assembly_get_image(assembly);
  23. imageMap[fileName] = image;
  24. }
  25. void MonoInit::InvokeMethod(const std::string& className, const std::string& methodName)
  26. {
  27. MonoImage* image = imageMap[className];
  28. CHECK(image) << "not found image: " << className << "::" << methodName;
  29. std::string fullName = className + ":" + methodName;
  30. MonoMethodDesc* desc = mono_method_desc_new(fullName.c_str(), 1);
  31. MonoMethod* monoMethod = mono_method_desc_search_in_image(desc, image);
  32. MonoClass* monoClass = mono_method_get_class(monoMethod);
  33. MonoObject* newInstance = mono_object_new(domain, monoClass);
  34. MonoObject* exc;
  35. MonoObject* ret = mono_runtime_invoke(monoMethod, newInstance, 0, &exc);
  36. }
  37. void MonoInit::InvokeMain(const char *file, int argc, char** argv)
  38. {
  39. }
  40. } // namespace Egametang