Getting all accessible assemblies in C# is easy. Calling GetReferencedAssemblies and you can get all you referenced assemblies. But project reference is recursive. To get all the class, you need to build a reference tree and read from the entire tree. Consider the following code:

        private IEnumerable<Assembly> ScanAssemblies(Assembly entry)
        {
            yield return entry;
            var references = entry
                .GetReferencedAssemblies();
            foreach (var referenced in references)
            {
                foreach (var scanned in ScanAssemblies(Assembly.Load(referenced)))
                {
                    yield return scanned;
                }
            }
        }

This returns all assemblies which your project reference.

But to get all accessible class, you need to load the assemblies:

        public List<Type> AllAccessiableClass()
        {
            var entry = Assembly.GetEntryAssembly();
            return ScanAssemblies(entry)
                .Distinct()
                .SelectMany(t => t.GetTypes())
                .ToList();
        }