CScriptDomain::~CScriptDomain() { m_bDestroying = true; for each(auto assembly in m_assemblies) delete assembly; m_assemblies.clear(); if(m_bRootDomain) mono_jit_cleanup(m_pDomain); else { if(IsActive()) mono_domain_set(mono_get_root_domain(), false); mono_domain_finalize(m_pDomain, 2); MonoObject *pException; try { mono_domain_try_unload(m_pDomain, &pException); } catch(char *ex) { MonoWarning("An exception was raised during ScriptDomain unload: %s", ex); } if(pException) { MonoWarning("An exception was raised during ScriptDomain unload:"); MonoMethod *pExceptionMethod = mono_method_desc_search_in_class(mono_method_desc_new("::ToString()", false),mono_get_exception_class()); MonoString *exceptionString = (MonoString *)mono_runtime_invoke(pExceptionMethod, pException, nullptr, nullptr); CryLogAlways(ToCryString((mono::string)exceptionString)); } } g_pScriptSystem->OnDomainReleased(this); }
static void load_roots (const char* filename) { FILE *file; char buf [2048]; char *p, *s; int line = 0; MonoImage *image = NULL; MonoClass *klass = NULL; MonoClassField *field; MonoMethodDesc *mdesc; MonoMethod *method; if (!(file = fopen (filename, "r"))) return; while (fgets (buf, sizeof (buf), file)) { /* FIXME: * decide on the format to use to express types, fields, methods, * maybe the same used on output from the tool, but with explicit * names and signatures instead of token indexes * add wildcard support */ ++line; s = buf; while (*s && g_ascii_isspace (*s)) ++s; switch (*s) { case 0: case '#': continue; /* comment */ case '[': p = strchr (s, ']'); if (!p) g_error ("invalid assembly format at line %d\n", line); *p = 0; p = s + 1; image = find_image (p); if (!image) g_error ("image not loaded: %s\n", p); klass = NULL; break; case 'T': if (s [1] != ':') g_error ("invalid type format at line %d\n", line); if (!image) break; klass = find_class (image, s + 2); break; case 'F': if (s [1] != ':') g_error ("invalid field format at line %d\n", line); if (!image || !klass) break; p = s + 2; if (*p == '*') { handle_type (klass, TYPE_FIELDS); break; } field = mono_class_get_field_from_name (klass, p); if (!field) g_warning ("no field '%s' at line %d\n", p, line); else add_field (field); break; case 'M': if (s [1] != ':') g_error ("invalid method format at line %d\n", line); if (!image || !klass) break; p = s + 2; if (*p == '*') { handle_type (klass, TYPE_METHODS); break; } mdesc = mono_method_desc_new (p, FALSE); if (!mdesc) { g_error ("invalid method desc at line %d\n", line); } method = mono_method_desc_search_in_class (mdesc, klass); if (!method) g_warning ("no method '%s' at line %d\n", p, line); else add_types_from_method (method); mono_method_desc_free (mdesc); break; default: g_error ("invalid format at line %d\n", line); } } fclose (file); }