private static Assembly LoadAssembly(string baseDir, ReferencedAssemblyInfo info)
        {
            Assembly assembly = null;

            try
            {
                assembly = Assembly.Load(info.FullName);
            }
            catch
            {
                try
                {
                    assembly = Assembly.LoadFrom(Path.Combine(baseDir, info.Name + ".dll"));
                }
                catch
                {
                    try
                    {
                        assembly = Assembly.LoadFrom(Path.Combine(baseDir, info.Name + ".exe"));
                    }
                    catch
                    {
                    }
                }
            }
            return(assembly);
        }
        private static void FindReferencedAssemblies(string programPath, Dictionary <string, ReferencedAssemblyInfo> assemblies)
        {
            string baseDir = Path.GetDirectoryName(programPath);
            int    order   = 0;

            Queue <ReferencedAssemblyInfo> queue = new Queue <ReferencedAssemblyInfo>();

            Assembly assembly = Assembly.LoadFrom(programPath);

            queue.Enqueue(new ReferencedAssemblyInfo()
            {
                Name     = assembly.GetName().Name,
                FullName = assembly.FullName,
                Level    = 0
            });

            while (queue.Count > 0)
            {
                ReferencedAssemblyInfo info = queue.Dequeue();
                if (!assemblies.ContainsKey(info.FullName))
                {
                    assembly = LoadAssembly(baseDir, info);
                    if (assembly != null)
                    {
                        info.Order = order++;
                        info.Path  = assembly.Location;
                        assemblies.Add(info.FullName, info);

                        foreach (var reference in assembly.GetReferencedAssemblies())
                        {
                            queue.Enqueue(new ReferencedAssemblyInfo()
                            {
                                ReferencedByFullName = info.FullName,
                                Name     = reference.Name,
                                FullName = reference.FullName,
                                Level    = info.Level + 1,
                            });
                        }
                    }
                }
            }
        }