From a63a12ea4ad57bd9ed372641ae0d2b17f191ef9f Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 23 Nov 2024 17:52:16 +0530 Subject: [PATCH] DnsApplicationAssemblyLoadContext: fixed issue caused when an assembly is already loaded in default context but is required for loading assembly in current context. Minor code refactoring done. --- .../DnsApplicationAssemblyLoadContext.cs | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/DnsServerCore/Dns/Applications/DnsApplicationAssemblyLoadContext.cs b/DnsServerCore/Dns/Applications/DnsApplicationAssemblyLoadContext.cs index 531c77b3..0ea273e7 100644 --- a/DnsServerCore/Dns/Applications/DnsApplicationAssemblyLoadContext.cs +++ b/DnsServerCore/Dns/Applications/DnsApplicationAssemblyLoadContext.cs @@ -63,6 +63,27 @@ namespace DnsServerCore.Dns.Applications } }; + Resolving += delegate (AssemblyLoadContext currentContext, AssemblyName requiredAssembly) + { + string requiredAssemblyName = requiredAssembly.Name; + + foreach (Assembly loadedAssembly in Default.Assemblies) + { + if (!string.IsNullOrEmpty(loadedAssembly.Location)) + { + if (requiredAssemblyName.Equals(Path.GetFileNameWithoutExtension(loadedAssembly.Location), StringComparison.OrdinalIgnoreCase)) + return loadedAssembly; + } + else + { + if (requiredAssemblyName.Equals(loadedAssembly.GetName().Name, StringComparison.OrdinalIgnoreCase)) + return loadedAssembly; + } + } + + return null; + }; + //load all app assemblies IEnumerable loadedAssemblies = Default.Assemblies; Dictionary appAssemblies = new Dictionary(); @@ -77,7 +98,7 @@ namespace DnsServerCore.Dns.Applications { if (!string.IsNullOrEmpty(loadedAssembly.Location)) { - if (Path.GetFileNameWithoutExtension(loadedAssembly.Location).Equals(dllFileName, StringComparison.OrdinalIgnoreCase)) + if (dllFileName.Equals(Path.GetFileNameWithoutExtension(loadedAssembly.Location), StringComparison.OrdinalIgnoreCase)) { isLoaded = true; break; @@ -85,9 +106,7 @@ namespace DnsServerCore.Dns.Applications } else { - AssemblyName assemblyName = loadedAssembly.GetName(); - - if ((assemblyName.Name != null) && assemblyName.Name.Equals(dllFileName, StringComparison.OrdinalIgnoreCase)) + if (dllFileName.Equals(loadedAssembly.GetName().Name, StringComparison.OrdinalIgnoreCase)) { isLoaded = true; break;