diff --git a/src/DynamoCLI/CommandLineRunner.cs b/src/DynamoCLI/CommandLineRunner.cs index b10f511bed6..e31ccaee97d 100644 --- a/src/DynamoCLI/CommandLineRunner.cs +++ b/src/DynamoCLI/CommandLineRunner.cs @@ -105,7 +105,7 @@ protected internal static void ImportAssembly(DynamoModel model, string path) else { Console.WriteLine($"attempting to import assembly {path}"); - var assembly = System.Reflection.Assembly.LoadFile(path); + var assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(path); model.LoadNodeLibrary(assembly, true); } } diff --git a/src/DynamoCore/Core/NodeModelAssemblyLoader.cs b/src/DynamoCore/Core/NodeModelAssemblyLoader.cs index bdc8c777d27..fa23333b01f 100644 --- a/src/DynamoCore/Core/NodeModelAssemblyLoader.cs +++ b/src/DynamoCore/Core/NodeModelAssemblyLoader.cs @@ -150,7 +150,7 @@ var assembly in Assembly assembly; if (!loadedAssembliesByPath.TryGetValue(assemblyPath, out assembly)) { - assembly = Assembly.LoadFrom(assemblyPath); + assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath); loadedAssembliesByName[assembly.GetName().Name] = assembly; loadedAssembliesByPath[assemblyPath] = assembly; } @@ -214,6 +214,7 @@ internal static IEnumerable GetCustomizationTypesUsingReflection(Assembly } try { + // TODO: ALC issue ? DynamoCoreWpf will probably be loaded only once, in a single ALC? var customizerType = Type.GetType("Dynamo.Wpf.INodeViewCustomization`1,DynamoCoreWpf"); if (customizerType != null) { diff --git a/src/DynamoCore/Extensions/ExtensionLoader.cs b/src/DynamoCore/Extensions/ExtensionLoader.cs index b641702e22a..09da6d502b4 100644 --- a/src/DynamoCore/Extensions/ExtensionLoader.cs +++ b/src/DynamoCore/Extensions/ExtensionLoader.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Reflection; using System.Xml; using Dynamo.Logging; using DynamoUtilities; @@ -30,7 +29,7 @@ private IExtension Load(ExtensionDefinition extension) CertificateVerification.CheckAssemblyForValidCertificate(extension.AssemblyPath); } - var assembly = Assembly.LoadFrom(extension.AssemblyPath); + var assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(extension.AssemblyPath); var result = assembly.CreateInstance(extension.TypeName) as IExtension; ExtensionLoading?.Invoke(result); diff --git a/src/DynamoCore/Library/FunctionDescriptor.cs b/src/DynamoCore/Library/FunctionDescriptor.cs index 7b5d72ec779..0692524af35 100644 --- a/src/DynamoCore/Library/FunctionDescriptor.cs +++ b/src/DynamoCore/Library/FunctionDescriptor.cs @@ -348,7 +348,7 @@ public string Category #if DEBUG var LoadedAssemblyCount = AppDomain.CurrentDomain.GetAssemblies().Length; #endif - var asm = AppDomain.CurrentDomain.Load(Path.GetFileNameWithoutExtension(Assembly)); + var asm = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), Assembly)); #if DEBUG Debug.Assert(AppDomain.CurrentDomain.GetAssemblies().Length == LoadedAssemblyCount, diff --git a/src/DynamoCore/Library/LibraryCustomization.cs b/src/DynamoCore/Library/LibraryCustomization.cs index 8c8c7fecd98..349e3a234f4 100644 --- a/src/DynamoCore/Library/LibraryCustomization.cs +++ b/src/DynamoCore/Library/LibraryCustomization.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -89,7 +89,7 @@ public static LibraryCustomization GetForAssembly(string assemblyPath, IPathMana if (ResolveResourceAssembly(assemblyPath, pathManager, useAdditionalPaths, out resourceAssemblyPath)) { - resAssembly = Assembly.LoadFile(resourceAssemblyPath); + resAssembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(resourceAssemblyPath); } // We need 'LibraryCustomization' if either one is not 'null' diff --git a/src/DynamoCore/Library/LibraryServices.cs b/src/DynamoCore/Library/LibraryServices.cs index 788cf956fd6..d4290544c59 100644 --- a/src/DynamoCore/Library/LibraryServices.cs +++ b/src/DynamoCore/Library/LibraryServices.cs @@ -3,7 +3,6 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Reflection.Metadata.Ecma335; using System.Xml; using Dynamo.Configuration; using Dynamo.Core; @@ -106,14 +105,14 @@ private Assembly ResolveAssembly(object sender, ResolveEventArgs args) { if (pathManager.ResolveLibraryPath(ref assemblyPath)) { - return Assembly.LoadFrom(assemblyPath); + return Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath); } foreach (var packagesDirectory in pathManager.PackagesDirectories) { assemblyPath = Path.Combine(packagesDirectory, assemblyName); if (File.Exists(assemblyPath)) - return Assembly.LoadFrom(assemblyPath); + return Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath); } return null; diff --git a/src/DynamoCoreWpf/Extensions/ViewExtensionLoader.cs b/src/DynamoCoreWpf/Extensions/ViewExtensionLoader.cs index 07def6fafbb..713abde72ca 100644 --- a/src/DynamoCoreWpf/Extensions/ViewExtensionLoader.cs +++ b/src/DynamoCoreWpf/Extensions/ViewExtensionLoader.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Collections.Generic; using System.IO; -using System.Reflection; using System.Xml; using Dynamo.Logging; using DynamoUtilities; @@ -20,7 +19,7 @@ internal IViewExtension Load(ViewExtensionDefinition viewExtension) { CertificateVerification.CheckAssemblyForValidCertificate(viewExtension.AssemblyPath); } - var assembly = Assembly.LoadFrom(viewExtension.AssemblyPath); + var assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(viewExtension.AssemblyPath); var result = assembly.CreateInstance(viewExtension.TypeName) as IViewExtension; ExtensionLoading?.Invoke(result); diff --git a/src/DynamoCoreWpf/TestInfrastructure/CustomNodeCompatibilityMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/CustomNodeCompatibilityMutator.cs index 43f68107d63..bdfc040665d 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/CustomNodeCompatibilityMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/CustomNodeCompatibilityMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -268,7 +268,7 @@ public List LoadAllTypesFromDynamoAssemblies() { try { - var assembly = Assembly.LoadFrom(assemblyPath); + var assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath); allLoadedAssemblies[assembly.GetName().Name] = assembly; List types = LoadNodesFromAssembly(assembly); nodeTypes.AddRange(types); @@ -392,4 +392,4 @@ private List LoadNodesFromAssembly(Assembly assembly) #endregion } -} \ No newline at end of file +} diff --git a/src/DynamoCoreWpf/TestInfrastructure/DirectoryPathMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/DirectoryPathMutator.cs index 47083e72cd2..53961726316 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/DirectoryPathMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/DirectoryPathMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -23,7 +23,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("DSCore.File.Directory"); return type; diff --git a/src/DynamoCoreWpf/TestInfrastructure/DoubleSliderMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/DoubleSliderMutator.cs index a708a16ba0d..d217a3757ab 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/DoubleSliderMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/DoubleSliderMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -23,7 +23,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("Dynamo.Nodes.DoubleSlider"); return type; @@ -109,7 +109,7 @@ public override bool RunTest(NodeModel node, EngineController engine, StreamWrit public override int Mutate(NodeModel node) { string assemblyPass = Environment.CurrentDirectory + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(assemblyPass); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPass); Type type = assembly.GetType("Dynamo.Nodes.DoubleSlider"); PropertyInfo propInfo = type.GetProperty("Min"); diff --git a/src/DynamoCoreWpf/TestInfrastructure/FilePathMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/FilePathMutator.cs index 355f0044514..d87b75966de 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/FilePathMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/FilePathMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -23,7 +23,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("DSCore.File.Filename"); return type; diff --git a/src/DynamoCoreWpf/TestInfrastructure/IntegerSliderMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/IntegerSliderMutator.cs index da19e6006c0..5602b6e3b95 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/IntegerSliderMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/IntegerSliderMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -23,7 +23,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("Dynamo.Nodes.IntegerSlider"); return type; @@ -111,7 +111,7 @@ public override int Mutate(NodeModel node) string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("Dynamo.Nodes.IntegerSlider"); @@ -143,4 +143,4 @@ public override int Mutate(NodeModel node) return returnCode; } } -} \ No newline at end of file +} diff --git a/src/DynamoCoreWpf/TestInfrastructure/ListMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/ListMutator.cs index bed414f7a1e..3b224c217f9 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/ListMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/ListMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -25,7 +25,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("CoreNodeModels.CreateList"); return type; diff --git a/src/DynamoCoreWpf/TestInfrastructure/NumberRangeMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/NumberRangeMutator.cs index c086fc46b1d..8001d16434a 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/NumberRangeMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/NumberRangeMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -25,7 +25,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("CoreNodeModels.NumberRange"); return type; diff --git a/src/DynamoCoreWpf/TestInfrastructure/NumberSequenceMutator.cs b/src/DynamoCoreWpf/TestInfrastructure/NumberSequenceMutator.cs index 92cd5125305..c5c1fe363fd 100644 --- a/src/DynamoCoreWpf/TestInfrastructure/NumberSequenceMutator.cs +++ b/src/DynamoCoreWpf/TestInfrastructure/NumberSequenceMutator.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -25,7 +25,7 @@ public override Type GetNodeType() string assemblyPath = Assembly.GetExecutingAssembly().Location; string assemblyDir = Path.GetDirectoryName(assemblyPath); string pathToNodesDll = assemblyDir + "\\nodes\\CoreNodeModels.dll"; - Assembly assembly = Assembly.LoadFile(pathToNodesDll); + Assembly assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(pathToNodesDll); Type type = assembly.GetType("CoreNodeModels.NumberSeq"); return type; diff --git a/src/DynamoCoreWpf/Utilities/CrashReportTool.cs b/src/DynamoCoreWpf/Utilities/CrashReportTool.cs index 7c7d3ea7748..1b7ce4b670d 100644 --- a/src/DynamoCoreWpf/Utilities/CrashReportTool.cs +++ b/src/DynamoCoreWpf/Utilities/CrashReportTool.cs @@ -137,7 +137,7 @@ private static string FindCERToolInInstallLocations() if (!File.Exists(assemblyPath)) throw new FileNotFoundException(assemblyPath); - var assembly = Assembly.LoadFrom(assemblyPath); + var assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath); type = assembly.GetType("DynamoInstallDetective.Utilities"); } diff --git a/src/DynamoPackages/PackageLoader.cs b/src/DynamoPackages/PackageLoader.cs index 7de57e4ae70..18160d1b8b8 100644 --- a/src/DynamoPackages/PackageLoader.cs +++ b/src/DynamoPackages/PackageLoader.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Runtime.Loader; using Dynamo.Core; using Dynamo.Exceptions; using Dynamo.Extensions; @@ -744,7 +745,7 @@ internal static bool TryLoadFrom(string filename, out Assembly assem) { try { - assem = Assembly.LoadFrom(filename); + assem = AssemblyHelper.LoadInALCFrom(filename); return true; } catch (FileLoadException e) diff --git a/src/DynamoSandbox/Program.cs b/src/DynamoSandbox/Program.cs index 44c945ae835..7b8e4461b06 100644 --- a/src/DynamoSandbox/Program.cs +++ b/src/DynamoSandbox/Program.cs @@ -1,3 +1,4 @@ +using Dynamo.Utilities; using Dynamo.Wpf.Utilities; using System; using System.Diagnostics; @@ -45,13 +46,13 @@ public static Assembly ResolveAssembly(object sender, ResolveEventArgs args) { string assemblyPath = Path.Combine(DynamoCorePath, assemblyName); if (File.Exists(assemblyPath)) - return Assembly.LoadFrom(assemblyPath); + return AssemblyHelper.LoadInALCFrom(assemblyPath); var assemblyLocation = Assembly.GetExecutingAssembly().Location; var assemblyDirectory = Path.GetDirectoryName(assemblyLocation); assemblyPath = Path.Combine(assemblyDirectory, assemblyName); - return (File.Exists(assemblyPath) ? Assembly.LoadFrom(assemblyPath) : null); + return (File.Exists(assemblyPath) ? AssemblyHelper.LoadInALCFrom(assemblyPath) : null); } catch (Exception ex) { diff --git a/src/DynamoUtilities/AssemblyHelper.cs b/src/DynamoUtilities/AssemblyHelper.cs index 809d34283d8..2e1fce8801e 100644 --- a/src/DynamoUtilities/AssemblyHelper.cs +++ b/src/DynamoUtilities/AssemblyHelper.cs @@ -1,7 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; +using System.Runtime.Loader; namespace Dynamo.Utilities { @@ -50,7 +51,7 @@ public Assembly ResolveAssembly(object sender, ResolveEventArgs args) Console.WriteLine("loading from " + assemblyPath); } - return Assembly.LoadFrom(assemblyPath); + return LoadInALCFrom(assemblyPath); } // Then check all additional resolution paths @@ -68,7 +69,7 @@ public Assembly ResolveAssembly(object sender, ResolveEventArgs args) { Console.WriteLine("loading from " + assemblyPath); } - return Assembly.LoadFrom(assemblyPath); + return LoadInALCFrom(assemblyPath); } } @@ -89,5 +90,11 @@ public static Version GetDynamoVersion(bool includeRevisionNumber = true) ? version : new Version(version.Major, version.Minor, version.Build, 0); } + + internal static Assembly LoadInALCFrom(string assemblyPath, AssemblyLoadContext alc = null) + { + alc ??= AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()); + return alc.LoadFromAssemblyPath(assemblyPath); + } } } diff --git a/src/DynamoUtilities/Md2Html.cs b/src/DynamoUtilities/Md2Html.cs index 68ac5f73b91..174dd8941c5 100644 --- a/src/DynamoUtilities/Md2Html.cs +++ b/src/DynamoUtilities/Md2Html.cs @@ -2,7 +2,7 @@ using System.IO; using System.Text; using System.Threading; -using DynamoUtilities.Properties; +using DynamoUtility.Properties; using Newtonsoft.Json.Linq; namespace Dynamo.Utilities diff --git a/src/DynamoUtilities/Properties/AssemblyInfo.cs b/src/DynamoUtilities/Properties/AssemblyInfo.cs index 1af76109f57..7f6e08faa56 100644 --- a/src/DynamoUtilities/Properties/AssemblyInfo.cs +++ b/src/DynamoUtilities/Properties/AssemblyInfo.cs @@ -32,3 +32,7 @@ [assembly: InternalsVisibleTo("Notifications")] [assembly: InternalsVisibleTo("SystemTestServices")] [assembly: InternalsVisibleTo("NodeAutoCompleteViewExtension")] +[assembly: InternalsVisibleTo("DynamoSandbox")] +[assembly: InternalsVisibleTo("DynamoWPFCLI")] +[assembly: InternalsVisibleTo("DynamoPythonTests")] +[assembly: InternalsVisibleTo("NodeDocumentationMarkdownGeneratorTests")] diff --git a/src/DynamoUtilities/Properties/Resources.Designer.cs b/src/DynamoUtilities/Properties/Resources.Designer.cs index 0443334b655..96674f857da 100644 --- a/src/DynamoUtilities/Properties/Resources.Designer.cs +++ b/src/DynamoUtilities/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace DynamoUtilities.Properties { +namespace DynamoUtility.Properties { using System; diff --git a/src/DynamoWPFCLI/Program.cs b/src/DynamoWPFCLI/Program.cs index fcb37a02894..9f1ce355ac2 100644 --- a/src/DynamoWPFCLI/Program.cs +++ b/src/DynamoWPFCLI/Program.cs @@ -5,8 +5,8 @@ #endif using System.Threading; using Dynamo.Applications; -using Dynamo.Logging; using Dynamo.Models; +using Dynamo.Utilities; using Dynamo.ViewModels; using Dynamo.Wpf.ViewModels.Watch3D; using static System.Windows.Threading.Dispatcher; @@ -156,7 +156,7 @@ private static void ImportAssembly(DynamoModel model, string path) else { Console.WriteLine($"attempting to import assembly {path}"); - var assembly = System.Reflection.Assembly.LoadFile(path); + var assembly = AssemblyHelper.LoadInALCFrom(path); model.LoadNodeLibrary(assembly, true); } } diff --git a/src/Engine/ProtoCore/FFI/ExtensionAppLoader.cs b/src/Engine/ProtoCore/FFI/ExtensionAppLoader.cs index 5ebe3a36b54..a9c670acf0b 100644 --- a/src/Engine/ProtoCore/FFI/ExtensionAppLoader.cs +++ b/src/Engine/ProtoCore/FFI/ExtensionAppLoader.cs @@ -108,7 +108,7 @@ private Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) //load from search path, if file exists string filepath = ProtoCore.Utils.FileUtils.GetDSFullPathName(shortname + ".dll"); if (File.Exists(filepath)) - return Assembly.LoadFrom(filepath); + return Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(filepath); } catch (Exception) { diff --git a/src/Engine/ProtoCore/FFI/FFIExecutionManager.cs b/src/Engine/ProtoCore/FFI/FFIExecutionManager.cs index ec6817f9261..d787d0bd9a7 100644 --- a/src/Engine/ProtoCore/FFI/FFIExecutionManager.cs +++ b/src/Engine/ProtoCore/FFI/FFIExecutionManager.cs @@ -43,10 +43,11 @@ public Assembly LoadAssembly(string name) //https://github.com/dotnet/runtime/issues/89215 if (name.ToLower().Contains("system.private.corelib")) { + // Assembly.Load will either return an already loaded assembly or load it in the Default load context (which is where it should be). return Assembly.Load(System.IO.Path.GetFileNameWithoutExtension(name)); } - return Assembly.LoadFrom(name); + return Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(name); } catch(System.IO.FileLoadException e) { diff --git a/src/Libraries/DynamoUnits/Utilities.cs b/src/Libraries/DynamoUnits/Utilities.cs index 6b092336df1..817764f55a1 100644 --- a/src/Libraries/DynamoUnits/Utilities.cs +++ b/src/Libraries/DynamoUnits/Utilities.cs @@ -5,6 +5,7 @@ using System.IO; using System.Reflection; using System.Runtime.InteropServices; +using System.Runtime.Loader; using ForgeUnits = Autodesk.ForgeUnits; namespace DynamoUnits @@ -425,11 +426,12 @@ private static void AddAscSchemaPaths(List candidateDirectories) try { + var executingAssem = Assembly.GetExecutingAssembly(); // Use reflection to dynamically load DynamoInstallDetective at runtime. // This avoids the need for a direct project reference and InternalsVisibleTo, // maintaining cross-platform compatibility for the DynamoUnits library. - var dynamoInstallDetectiveAssembly = Assembly.LoadFrom( - Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), + var dynamoInstallDetectiveAssembly = AssemblyLoadContext.GetLoadContext(executingAssem).LoadFromAssemblyPath( + Path.Combine(Path.GetDirectoryName(executingAssem.Location), "DynamoInstallDetective.dll")); var ascWrapperType = dynamoInstallDetectiveAssembly.GetType("DynamoInstallDetective.AscSdkWrapper"); diff --git a/src/Tools/DynamoShapeManager/Utilities.cs b/src/Tools/DynamoShapeManager/Utilities.cs index 532b4f08b98..63c36849c81 100644 --- a/src/Tools/DynamoShapeManager/Utilities.cs +++ b/src/Tools/DynamoShapeManager/Utilities.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using System.Runtime.Loader; using System.Text.RegularExpressions; namespace DynamoShapeManager @@ -263,7 +264,7 @@ public static void PreloadAsmFromPath(string preloaderLocation, string asmLocati Debug.WriteLine(string.Format("LibG ASM Preloader location: {0}", preloaderPath)); Debug.WriteLine(string.Format("ASM loading location: {0}", asmLocation)); - var libG = Assembly.LoadFrom(preloaderPath); + var libG = AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()).LoadFromAssemblyPath(preloaderPath); var preloadType = libG.GetType(PreloaderClassName); var preloadMethod = preloadType.GetMethod(PreloaderMethodName, @@ -367,7 +368,7 @@ private static IEnumerable GetAsmInstallations(string rootFolder) if (!File.Exists(assemblyPath)) throw new FileNotFoundException(assemblyPath); - var assembly = Assembly.LoadFrom(assemblyPath); + var assembly = AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()).LoadFromAssemblyPath(assemblyPath); type = assembly.GetType("DynamoInstallDetective.Utilities"); } diff --git a/src/Tools/NodeDocumentationMarkdownGenerator/AssemblyHandler.cs b/src/Tools/NodeDocumentationMarkdownGenerator/AssemblyHandler.cs index 60c14eb112f..d06fd18f414 100644 --- a/src/Tools/NodeDocumentationMarkdownGenerator/AssemblyHandler.cs +++ b/src/Tools/NodeDocumentationMarkdownGenerator/AssemblyHandler.cs @@ -69,7 +69,7 @@ private static List Scan(IEnumerable assemblyPaths) else { //load the assembly. - Assembly asm = Assembly.LoadFrom(path); + Assembly asm = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(path); AssemblyName name = asm.GetName(); if (NodeModelAssemblyLoader.ContainsNodeModelSubType(asm)) diff --git a/src/Tools/NodeDocumentationMarkdownGenerator/Program.cs b/src/Tools/NodeDocumentationMarkdownGenerator/Program.cs index 969eb139274..0a5aba85f8a 100644 --- a/src/Tools/NodeDocumentationMarkdownGenerator/Program.cs +++ b/src/Tools/NodeDocumentationMarkdownGenerator/Program.cs @@ -75,7 +75,7 @@ internal static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEve Assembly assembly = null; try { - assembly = Assembly.LoadFrom(requestedAssemblyLocation.FullName); + assembly = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(requestedAssemblyLocation.FullName); } catch (Exception ex) { diff --git a/test/DynamoCoreTests/ExtensionTests.cs b/test/DynamoCoreTests/ExtensionTests.cs index ef115c951ac..0db4d260acf 100644 --- a/test/DynamoCoreTests/ExtensionTests.cs +++ b/test/DynamoCoreTests/ExtensionTests.cs @@ -242,7 +242,7 @@ public void RegisterSameObjectAsManyServices() public void ExtensionLoader_LoadNodeLibraryAddsZTNodesToSearch() { var assemPath = Path.Combine(testpkgPath, "Dynamo Samples", "bin", "SampleLibraryZeroTouch.dll"); - var assembly = Assembly.LoadFrom(assemPath); + var assembly = Utilities.AssemblyHelper.LoadInALCFrom(assemPath); var libraryLoader = new ExtensionLibraryLoader(model); libraryLoader.LoadNodeLibrary(assembly); diff --git a/test/DynamoCoreWpf3Tests/SliderTests.cs b/test/DynamoCoreWpf3Tests/SliderTests.cs index 4f17becffae..301606a3871 100644 --- a/test/DynamoCoreWpf3Tests/SliderTests.cs +++ b/test/DynamoCoreWpf3Tests/SliderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Reflection; using System.Xml; @@ -24,7 +24,7 @@ System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveE { // Look in the nodes folder string assemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "nodes", new AssemblyName(args.Name).Name + ".dll"); - return File.Exists(assemblyPath) ? Assembly.LoadFrom(assemblyPath) : null; + return File.Exists(assemblyPath) ? Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath) : null; } [Test] diff --git a/test/DynamoCoreWpfTests/DynamoConverterTest.cs b/test/DynamoCoreWpfTests/DynamoConverterTest.cs index 7c14ae0e957..483b6bba604 100644 --- a/test/DynamoCoreWpfTests/DynamoConverterTest.cs +++ b/test/DynamoCoreWpfTests/DynamoConverterTest.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Reflection; @@ -38,7 +38,7 @@ System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveE { // Look in the nodes folder string assemblyPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "nodes", new AssemblyName(args.Name).Name + ".dll"); - return File.Exists(assemblyPath) ? Assembly.LoadFrom(assemblyPath) : null; + return File.Exists(assemblyPath) ? Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(assemblyPath) : null; } [Test] diff --git a/test/Libraries/DynamoPythonTests/CodeCompletionTests.cs b/test/Libraries/DynamoPythonTests/CodeCompletionTests.cs index 22f68a70a34..fce938aff9d 100644 --- a/test/Libraries/DynamoPythonTests/CodeCompletionTests.cs +++ b/test/Libraries/DynamoPythonTests/CodeCompletionTests.cs @@ -20,7 +20,7 @@ public override void Setup() base.Setup(); //for some legacy tests we'll need the DSCPython binary loaded manually //as the types are found using reflection - during normal dynamo use these types are already loaded. - Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "DSCPython.dll")); + AssemblyHelper.LoadInALCFrom(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "DSCPython.dll")); } [Test] diff --git a/test/Tools/NodeDocumentationMarkdownGeneratorTests/MarkdownGeneratorCommandTests.cs b/test/Tools/NodeDocumentationMarkdownGeneratorTests/MarkdownGeneratorCommandTests.cs index 560a8ff599b..bf4789907d6 100644 --- a/test/Tools/NodeDocumentationMarkdownGeneratorTests/MarkdownGeneratorCommandTests.cs +++ b/test/Tools/NodeDocumentationMarkdownGeneratorTests/MarkdownGeneratorCommandTests.cs @@ -51,7 +51,7 @@ public void FixtureSetup() try { AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - var libviewExtensionAssem = Assembly.LoadFrom(Path.Combine(DynamoCoreDir, LibraryViewExtension_DLL_NAME)); + var libviewExtensionAssem = Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(Path.Combine(DynamoCoreDir, LibraryViewExtension_DLL_NAME)); SaveCoreLayoutSpecToPath(libviewExtensionAssem, testLayoutSpecPath); } catch(Exception e) @@ -80,7 +80,7 @@ private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs a var found = files.Where(f => Path.GetFileNameWithoutExtension(f.FullName) == requestedAssembly.Name).FirstOrDefault(); if (found != null) { - return Assembly.LoadFrom(found.FullName); + return Dynamo.Utilities.AssemblyHelper.LoadInALCFrom(found.FullName); } return null; } diff --git a/test/Tools/NodeDocumentationMarkdownGeneratorTests/NodeDocumentationMarkdownGeneratorTests.csproj b/test/Tools/NodeDocumentationMarkdownGeneratorTests/NodeDocumentationMarkdownGeneratorTests.csproj index d3a734c33f6..3075c1d7e9c 100644 --- a/test/Tools/NodeDocumentationMarkdownGeneratorTests/NodeDocumentationMarkdownGeneratorTests.csproj +++ b/test/Tools/NodeDocumentationMarkdownGeneratorTests/NodeDocumentationMarkdownGeneratorTests.csproj @@ -18,6 +18,7 @@ + {0dd3e4ed-66aa-47fc-9eb9-2a0e6a0ea01b} NodeDocumentationMarkdownGenerator