コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
                    }
                }
            }
        }
コード例 #3
0
        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);
                }
            }
        }