diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-04-25 13:01:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-25 13:01:11 +0200 |
commit | 7899b3e734e5c64304e8ffb56293fb4b1912b547 (patch) | |
tree | 5ef5991359b86f8ac8e7314e4d49f0ca6b2c8d96 | |
parent | cacedac8b7d402574dad1e2d8024cddff9d07331 (diff) | |
parent | f5510262bcfee430cab7cebf25d48f8367465750 (diff) |
Merge pull request #38150 from neikeq/fix-load-hook-for-reused-assembly
Mono/C#: Fix load hook not called for some assemblies on domain reload
-rw-r--r-- | modules/mono/mono_gd/gd_mono_assembly.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/modules/mono/mono_gd/gd_mono_assembly.cpp b/modules/mono/mono_gd/gd_mono_assembly.cpp index 8439769d84..0f211eebc6 100644 --- a/modules/mono/mono_gd/gd_mono_assembly.cpp +++ b/modules/mono/mono_gd/gd_mono_assembly.cpp @@ -277,12 +277,25 @@ no_pdb: #endif + bool need_manual_load_hook = mono_image_get_assembly(image) != nullptr; // Re-using an existing image with an assembly loaded + status = MONO_IMAGE_OK; MonoAssembly *assembly = mono_assembly_load_from_full(image, image_filename.utf8().get_data(), &status, p_refonly); ERR_FAIL_COND_V_MSG(status != MONO_IMAGE_OK || !assembly, nullptr, "Failed to load assembly for image"); + if (need_manual_load_hook) { + // For some reason if an assembly survived domain reloading (maybe because it's referenced somewhere else), + // the mono internal search hook don't detect it, yet mono_image_open_from_data_with_name re-uses the image + // and assembly, and mono_assembly_load_from_full doesn't call the load hook. We need to call it manually. + String name = String::utf8(mono_assembly_name_get_name(mono_assembly_get_name(assembly))); + bool has_extension = name.ends_with(".dll") || name.ends_with(".exe"); + GDMonoAssembly *loaded_asm = GDMono::get_singleton()->get_loaded_assembly(has_extension ? name.get_basename() : name); + if (!loaded_asm) + assembly_load_hook(assembly, nullptr); + } + // Decrement refcount which was previously incremented by mono_image_open_from_data_with_name mono_image_close(image); |