public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string moduleFolder, Assembly assembly) { AssemblyName[] references = assembly.GetReferencedAssemblies(); foreach (AssemblyName item in references) { string name = item.Name; string version = item.Version.ToString(); Stream stream = _referenceContainer.GetStream(name, version); if (stream != null) { _logger.LogDebug($"Found the cached reference '{name}' v.{version}"); assembly = context.Assemblies.FirstOrDefault(a => a.GetName().Name == name); if (assembly == null) { assembly = context.LoadFromStream(stream); } } else { if (IsSharedFreamwork(name) || IsLoadedByDefault(item.FullName)) { continue; } string dllName = $"{name}.dll"; string filePath = $"{moduleFolder}/{dllName}"; if (!File.Exists(filePath)) { _logger.LogWarning($"The package '{dllName}' in '{filePath}' is missing."); continue; } using (FileStream fs = new FileStream(filePath, FileMode.Open)) { assembly = context.LoadFromStream(fs); MemoryStream memoryStream = new MemoryStream(); fs.Position = 0; fs.CopyTo(memoryStream); fs.Position = 0; memoryStream.Position = 0; _referenceContainer.SaveStream(name, version, memoryStream); } } LoadStreamsIntoContext(context, moduleFolder, assembly); } }
public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string moduleFolder, Assembly assembly) { var references = assembly.GetReferencedAssemblies(); foreach (var item in references) { var name = item.Name; var version = item.Version.ToString(); var stream = _referenceContainer.GetStream(name, version); if (stream != null) { _logger.LogDebug($"Found the cached reference '{name}' v.{version}"); context.LoadFromStream(stream); } else { if (IsSharedFreamwork(name)) { continue; } var dllName = $"{name}.dll"; var filePath = $"{moduleFolder}\\{dllName}"; if (!File.Exists(filePath)) { _logger.LogWarning($"The package '{dllName}' is missing."); continue; } using (var fs = new FileStream(filePath, FileMode.Open)) { var referenceAssembly = context.LoadFromStream(fs); var memoryStream = new MemoryStream(); fs.Position = 0; fs.CopyTo(memoryStream); fs.Position = 0; memoryStream.Position = 0; _referenceContainer.SaveStream(name, version, memoryStream); LoadStreamsIntoContext(context, moduleFolder, referenceAssembly); } } } }
public void LoadStreamsIntoContext(CollectibleAssemblyLoadContext context, string moduleFolder, Assembly assembly) { var references = assembly.GetReferencedAssemblies(); foreach (var item in references.Where(x => !SharedFrameworkConst.SharedFrameworkDLLs.Contains($"{x.Name}.dll"))) { var name = item.Name; var version = item.Version.ToString(); var stream = referenceContainer.GetStream(name, version); if (stream != null) { logger.LogDebug($"Found the cached reference '{name}' v.{version}"); context.LoadFromStream(stream); continue; } var filePath = Path.Combine(moduleFolder, $"{name}.dll"); if (!File.Exists(filePath)) { logger.LogWarning($"The package '{name}.dll' is missing. {filePath} not exist"); continue; } using (var fs = new FileStream(filePath, FileMode.Open)) { var referenceAssembly = context.LoadFromStream(fs); var memoryStream = new MemoryStream(); fs.Position = 0; fs.CopyTo(memoryStream); fs.Position = 0; memoryStream.Position = 0; referenceContainer.SaveStream(name, version, memoryStream); LoadStreamsIntoContext(context, moduleFolder, referenceAssembly); } } }