bool GDMono::_load_assembly(const String &p_name, GDMonoAssembly **r_assembly) { CRASH_COND(!r_assembly); if (OS::get_singleton()->is_stdout_verbose()) OS::get_singleton()->print((String() + "Mono: Loading assembly " + p_name + "...\n").utf8()); MonoImageOpenStatus status = MONO_IMAGE_OK; MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8()); MonoAssembly *assembly = mono_assembly_load_full(aname, NULL, &status, false); mono_assembly_name_free(aname); if (!assembly) return false; uint32_t domain_id = mono_domain_get_id(mono_domain_get()); GDMonoAssembly **stored_assembly = assemblies[domain_id].getptr(p_name); ERR_FAIL_COND_V(status != MONO_IMAGE_OK, false); ERR_FAIL_COND_V(stored_assembly == NULL, false); ERR_FAIL_COND_V((*stored_assembly)->get_assembly() != assembly, false); *r_assembly = *stored_assembly; if (OS::get_singleton()->is_stdout_verbose()) OS::get_singleton()->print(String("Mono: Assembly " + p_name + " loaded from path: " + (*r_assembly)->get_path() + "\n").utf8()); return true; }
bool GDMono::load_assembly(const String &p_name, GDMonoAssembly **r_assembly, bool p_refonly) { CRASH_COND(!r_assembly); MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8()); bool result = load_assembly(p_name, aname, r_assembly, p_refonly); mono_assembly_name_free(aname); mono_free(aname); return result; }
//##################################################################### // Function loadAssembly //##################################################################### bool MonoSystem::loadAssembly(const Meru::String& name, const Meru::String& dir) const { MonoAssemblyName aname; bool parsed = mono_assembly_name_parse(name.c_str(), &aname); if (!parsed) return false; MonoImageOpenStatus image_open_status; MonoAssembly* assembly = mono_assembly_load(&aname, dir.c_str(), &image_open_status); mono_assembly_name_free(&aname); return (assembly != NULL); }
GodotSharpExport::GodotSharpExport() { // MonoAssemblyName is an incomplete type (internal to mono), so we can't allocate it ourselves. // There isn't any api to allocate an empty one either, so we need to do it this way. aname_prealloc = mono_assembly_name_new("whatever"); mono_assembly_name_free(aname_prealloc); // "it does not frees the object itself, only the name members" (typo included) }