Fix internal assembly load from
- Also make sure we load API assemblies from 'res://.mono/assemblies/'.
This commit is contained in:
parent
6312f18f8e
commit
454b933106
@ -191,21 +191,21 @@ Error GodotSharpExport::_get_assembly_dependencies(GDMonoAssembly *p_assembly, c
|
|||||||
if (has_extension) {
|
if (has_extension) {
|
||||||
path = search_dir.plus_file(ref_name);
|
path = search_dir.plus_file(ref_name);
|
||||||
if (FileAccess::exists(path)) {
|
if (FileAccess::exists(path)) {
|
||||||
GDMono::get_singleton()->load_assembly_from(ref_name.get_basename(), search_dir, ref_aname, &ref_assembly, true);
|
GDMono::get_singleton()->load_assembly_from(ref_name.get_basename(), path, &ref_assembly, true);
|
||||||
if (ref_assembly != NULL)
|
if (ref_assembly != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
path = search_dir.plus_file(ref_name + ".dll");
|
path = search_dir.plus_file(ref_name + ".dll");
|
||||||
if (FileAccess::exists(path)) {
|
if (FileAccess::exists(path)) {
|
||||||
GDMono::get_singleton()->load_assembly_from(ref_name, search_dir, ref_aname, &ref_assembly, true);
|
GDMono::get_singleton()->load_assembly_from(ref_name, path, &ref_assembly, true);
|
||||||
if (ref_assembly != NULL)
|
if (ref_assembly != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
path = search_dir.plus_file(ref_name + ".exe");
|
path = search_dir.plus_file(ref_name + ".exe");
|
||||||
if (FileAccess::exists(path)) {
|
if (FileAccess::exists(path)) {
|
||||||
GDMono::get_singleton()->load_assembly_from(ref_name, search_dir, ref_aname, &ref_assembly, true);
|
GDMono::get_singleton()->load_assembly_from(ref_name, path, &ref_assembly, true);
|
||||||
if (ref_assembly != NULL)
|
if (ref_assembly != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -378,34 +378,24 @@ GDMonoAssembly **GDMono::get_loaded_assembly(const String &p_name) {
|
|||||||
|
|
||||||
bool GDMono::load_assembly(const String &p_name, GDMonoAssembly **r_assembly, bool p_refonly) {
|
bool GDMono::load_assembly(const String &p_name, GDMonoAssembly **r_assembly, bool p_refonly) {
|
||||||
|
|
||||||
return load_assembly_from(p_name, String(), r_assembly, p_refonly);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GDMono::load_assembly(const String &p_name, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly) {
|
|
||||||
|
|
||||||
return load_assembly_from(p_name, String(), p_aname, r_assembly, p_refonly);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool GDMono::load_assembly_from(const String &p_name, const String &p_basedir, GDMonoAssembly **r_assembly, bool p_refonly) {
|
|
||||||
|
|
||||||
CRASH_COND(!r_assembly);
|
CRASH_COND(!r_assembly);
|
||||||
|
|
||||||
MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8());
|
MonoAssemblyName *aname = mono_assembly_name_new(p_name.utf8());
|
||||||
bool result = load_assembly_from(p_name, p_basedir, aname, r_assembly, p_refonly);
|
bool result = load_assembly(p_name, aname, r_assembly, p_refonly);
|
||||||
mono_assembly_name_free(aname);
|
mono_assembly_name_free(aname);
|
||||||
mono_free(aname);
|
mono_free(aname);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GDMono::load_assembly_from(const String &p_name, const String &p_basedir, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly) {
|
bool GDMono::load_assembly(const String &p_name, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly) {
|
||||||
|
|
||||||
CRASH_COND(!r_assembly);
|
CRASH_COND(!r_assembly);
|
||||||
|
|
||||||
print_verbose("Mono: Loading assembly " + p_name + (p_refonly ? " (refonly)" : "") + "...");
|
print_verbose("Mono: Loading assembly " + p_name + (p_refonly ? " (refonly)" : "") + "...");
|
||||||
|
|
||||||
MonoImageOpenStatus status = MONO_IMAGE_OK;
|
MonoImageOpenStatus status = MONO_IMAGE_OK;
|
||||||
MonoAssembly *assembly = mono_assembly_load_full(p_aname, p_basedir.length() ? p_basedir.utf8().get_data() : NULL, &status, p_refonly);
|
MonoAssembly *assembly = mono_assembly_load_full(p_aname, NULL, &status, p_refonly);
|
||||||
|
|
||||||
if (!assembly)
|
if (!assembly)
|
||||||
return false;
|
return false;
|
||||||
@ -426,6 +416,32 @@ bool GDMono::load_assembly_from(const String &p_name, const String &p_basedir, M
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GDMono::load_assembly_from(const String &p_name, const String &p_path, GDMonoAssembly **r_assembly, bool p_refonly) {
|
||||||
|
|
||||||
|
CRASH_COND(!r_assembly);
|
||||||
|
|
||||||
|
print_verbose("Mono: Loading assembly " + p_name + (p_refonly ? " (refonly)" : "") + "...");
|
||||||
|
|
||||||
|
GDMonoAssembly *assembly = GDMonoAssembly::load_from(p_name, p_path, p_refonly);
|
||||||
|
|
||||||
|
if (!assembly)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
|
uint32_t domain_id = mono_domain_get_id(mono_domain_get());
|
||||||
|
GDMonoAssembly **stored_assembly = assemblies[domain_id].getptr(p_name);
|
||||||
|
|
||||||
|
ERR_FAIL_COND_V(stored_assembly == NULL, false);
|
||||||
|
ERR_FAIL_COND_V(*stored_assembly != assembly, false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*r_assembly = assembly;
|
||||||
|
|
||||||
|
print_verbose("Mono: Assembly " + p_name + (p_refonly ? " (refonly)" : "") + " loaded from path: " + (*r_assembly)->get_path());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
APIAssembly::Version APIAssembly::Version::get_from_loaded_assembly(GDMonoAssembly *p_api_assembly, APIAssembly::Type p_api_type) {
|
APIAssembly::Version APIAssembly::Version::get_from_loaded_assembly(GDMonoAssembly *p_api_assembly, APIAssembly::Type p_api_type) {
|
||||||
APIAssembly::Version api_assembly_version;
|
APIAssembly::Version api_assembly_version;
|
||||||
|
|
||||||
@ -481,7 +497,14 @@ bool GDMono::_load_core_api_assembly() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool success = load_assembly(API_ASSEMBLY_NAME, &core_api_assembly);
|
String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(API_ASSEMBLY_NAME ".dll");
|
||||||
|
|
||||||
|
if (!FileAccess::exists(assembly_path))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool success = load_assembly_from(API_ASSEMBLY_NAME,
|
||||||
|
assembly_path,
|
||||||
|
&core_api_assembly);
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
#ifdef MONO_GLUE_ENABLED
|
#ifdef MONO_GLUE_ENABLED
|
||||||
@ -511,7 +534,14 @@ bool GDMono::_load_editor_api_assembly() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool success = load_assembly(EDITOR_API_ASSEMBLY_NAME, &editor_api_assembly);
|
String assembly_path = GodotSharpDirs::get_res_assemblies_dir().plus_file(EDITOR_API_ASSEMBLY_NAME ".dll");
|
||||||
|
|
||||||
|
if (!FileAccess::exists(assembly_path))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool success = load_assembly_from(EDITOR_API_ASSEMBLY_NAME,
|
||||||
|
assembly_path,
|
||||||
|
&editor_api_assembly);
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
#ifdef MONO_GLUE_ENABLED
|
#ifdef MONO_GLUE_ENABLED
|
||||||
|
@ -199,8 +199,7 @@ public:
|
|||||||
|
|
||||||
bool load_assembly(const String &p_name, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
bool load_assembly(const String &p_name, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
||||||
bool load_assembly(const String &p_name, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
bool load_assembly(const String &p_name, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
||||||
bool load_assembly_from(const String &p_name, const String &p_basedir, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
bool load_assembly_from(const String &p_name, const String &p_path, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
||||||
bool load_assembly_from(const String &p_name, const String &p_basedir, MonoAssemblyName *p_aname, GDMonoAssembly **r_assembly, bool p_refonly = false);
|
|
||||||
|
|
||||||
Error finalize_and_unload_domain(MonoDomain *p_domain);
|
Error finalize_and_unload_domain(MonoDomain *p_domain);
|
||||||
|
|
||||||
|
@ -457,6 +457,20 @@ GDMonoClass *GDMonoAssembly::get_object_derived_class(const StringName &p_class)
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GDMonoAssembly *GDMonoAssembly::load_from(const String &p_name, const String &p_path, bool p_refonly) {
|
||||||
|
|
||||||
|
GDMonoAssembly **loaded_asm = GDMono::get_singleton()->get_loaded_assembly(p_name);
|
||||||
|
if (loaded_asm)
|
||||||
|
return *loaded_asm;
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
|
CRASH_COND(!FileAccess::exists(p_path));
|
||||||
|
#endif
|
||||||
|
no_search = true;
|
||||||
|
GDMonoAssembly *res = _load_assembly_from(p_name, p_path, p_refonly);
|
||||||
|
no_search = false;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
GDMonoAssembly::GDMonoAssembly(const String &p_name, const String &p_path) {
|
GDMonoAssembly::GDMonoAssembly(const String &p_name, const String &p_path) {
|
||||||
|
|
||||||
loaded = false;
|
loaded = false;
|
||||||
|
@ -128,6 +128,8 @@ public:
|
|||||||
|
|
||||||
static void fill_search_dirs(Vector<String> &r_search_dirs, const String &p_custom_config = String());
|
static void fill_search_dirs(Vector<String> &r_search_dirs, const String &p_custom_config = String());
|
||||||
|
|
||||||
|
static GDMonoAssembly *load_from(const String &p_name, const String &p_path, bool p_refonly);
|
||||||
|
|
||||||
GDMonoAssembly(const String &p_name, const String &p_path = String());
|
GDMonoAssembly(const String &p_name, const String &p_path = String());
|
||||||
~GDMonoAssembly();
|
~GDMonoAssembly();
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user