Skip to content

Commit

Permalink
Merge pull request #38150 from neikeq/fix-load-hook-for-reused-assembly
Browse files Browse the repository at this point in the history
Mono/C#: Fix load hook not called for some assemblies on domain reload
  • Loading branch information
akien-mga authored Apr 25, 2020
2 parents cacedac + f551026 commit 7899b3e
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions modules/mono/mono_gd/gd_mono_assembly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -277,12 +277,25 @@ MonoAssembly *GDMonoAssembly::_real_load_assembly_from(const String &p_path, boo

#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);

Expand Down

0 comments on commit 7899b3e

Please sign in to comment.