private static void ProcessAssembly(AllAssemblies allAssemblies, FileSystemPath productBinariesDir,
                                            MetadataLoader metadataLoader, AssemblyNameInfo assemblyNameInfo,
                                            HashSet <ApplicationPackageFile> packageFiles, HashSet <ApplicationPackageReference> packageReferences)
        {
            var assembly = metadataLoader.TryLoad(assemblyNameInfo, JetFunc <AssemblyNameInfo> .False, false);

            if (assembly == null)
            {
                return;
            }

            var subplatformOfAssembly = allAssemblies.FindSubplatformOfAssembly(assemblyNameInfo, OnError.Ignore);

            if (subplatformOfAssembly != null)
            {
                var subplatformReference = new ApplicationPackageReference(subplatformOfAssembly.Name,
                                                                           subplatformOfAssembly.GetCompanyNameHuman());
                packageReferences.Add(subplatformReference);
                return;
            }

            if (assembly.AssemblyName?.Name.Contains("Microsoft.CodeAnalysis") == true)
            {
                return;
            }
            if (!packageFiles.Add(new ApplicationPackageFile(assembly.Location.MakeRelativeTo(productBinariesDir),
                                                             assemblyNameInfo)))
            {
                return;
            }

            foreach (var referencedAssembly in assembly.ReferencedAssembliesNames)
            {
                ProcessAssembly(allAssemblies, productBinariesDir, metadataLoader, referencedAssembly, packageFiles,
                                packageReferences);
            }
        }