Exactly how large is the .NET (3.5) Framework Class Library?

前端 未结 5 1167
粉色の甜心
粉色の甜心 2021-02-06 01:07

I\'ve regularly read that the framework is just too large for one developer to have experience with every part of it. Having some actual numbers would certainly help put things

5条回答
  •  一向
    一向 (楼主)
    2021-02-06 01:22

    You could use reflection to find the number of different types in the BCL but what are you hoping to accomplish with that information?

    Here is an example of how to get that information:

    using System;
    using System.Linq;
    using System.Reflection;
    
    class Example
    {
        static void Main()
        {
            Assembly mscorlib = typeof(String).Assembly;
    
            // Number of classes
            Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsClass).Count());
            // Number of value types (structs and enums)
            Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsValueType).Count());
            // Number of interfaces
            Console.WriteLine(mscorlib.GetTypes().Where(t => t.IsInterface).Count());
        }
    }
    

    Just note that you will need to do this for every assembly in the framework to get total numbers.

    Edit: Here is a quick and dirty solution that should give you a general idea of the number of types in the BCL:

    using System;
    using System.Linq;
    using System.Reflection;
    using System.IO;
    using System.Runtime.InteropServices;
    
    class Example
    {
        static void Main()
        {
            // Get all DLLs in the current runtime directory
            var assemblies = Directory.GetFiles(
                RuntimeEnvironment.GetRuntimeDirectory())
                .Where(f => f.EndsWith(".dll"));
    
            Int32 classes = 0;
            Int32 valueTypes = 0;
            Int32 interfaces = 0;
    
            foreach (String name in assemblies)
            {
                // We need to catch BadImageFormatException
                // because not all DLLs in the runtime directory
                // are CLR assemblies.
                try
                {
                    var types = Assembly.LoadFile(name).GetTypes();
    
                    classes += types.Where(t => t.IsClass).Count();
                    valueTypes += types.Where(t => t.IsValueType).Count();
                    interfaces += types.Where(t => t.IsInterface).Count();
                }
                catch (BadImageFormatException) { }
            }
    
            Console.WriteLine("Classes: {0}", classes);
            Console.WriteLine("Value types: {0}", valueTypes);
            Console.WriteLine("Interfaces: {0}", interfaces);
        }
    }
    

提交回复
热议问题