private static IEnumerable <(string, byte[])> ComputeContents(
            string rootAssemblyName,
            ReferencedAssemblyResolver resolver)
        {
            var foundAssemblies = new Dictionary <string, ReferencedAssemblyInfo>();

            AddWithReferencesRecursive(rootAssemblyName, resolver, foundAssemblies);

            return(foundAssemblies.Values.Select(assembly => (
                                                     $"/{assembly.Definition.Name.Name}.dll",
                                                     assembly.Data)));
        }
        private static void AddWithReferencesRecursive(
            string name,
            ReferencedAssemblyResolver resolver,
            IDictionary <string, ReferencedAssemblyInfo> results)
        {
            if (resolver.TryResolve(name, out var assemblyBytes))
            {
                var assemblyInfo = new ReferencedAssemblyInfo(assemblyBytes);
                results.Add(assemblyInfo.Definition.Name.Name, assemblyInfo);

                var childReferencesToAdd = assemblyInfo.Definition.Modules
                                           .SelectMany(module => module.AssemblyReferences)
                                           .Select(childReference => childReference.Name)
                                           .Where(childReferenceName => !results.ContainsKey(childReferenceName));
                foreach (var childReferenceName in childReferencesToAdd)
                {
                    AddWithReferencesRecursive(childReferenceName, resolver, results);
                }
            }
        }
 public ReferencedAssemblyFileProvider(string rootAssemblyName, ReferencedAssemblyResolver resolver)
     : base(ComputeContents(rootAssemblyName, resolver))
 {
 }