.NET(3.5)框架类库到底有多大?

.NET(3.5)框架类库到底有多大?,.net,base-class-library,.net,Base Class Library,我经常读到,这个框架太大了,一个开发人员无法体验它的每一部分。有一些实际数字肯定会有助于正确看待问题 MSDN似乎列出了所有这些,但没有实际的数字(从我所看到的),花几个小时计算它们并不是我的生产时间概念 名称空间的数目 班级数 结构数 接口数量 我知道也有委托、枚举、事件等,但上面的类型最有意思 此外,基类库(BCL)中类型的数量以及整个框架类库(FCL)的大小也很有趣 这些信息有两种用途: 首先,了解您实际使用了多少总体框架,还有多少需要学习 第二,许多来自其他平台的程序员(以及非技术人

我经常读到,这个框架太大了,一个开发人员无法体验它的每一部分。有一些实际数字肯定会有助于正确看待问题

MSDN似乎列出了所有这些,但没有实际的数字(从我所看到的),花几个小时计算它们并不是我的生产时间概念

  • 名称空间的数目
  • 班级数
  • 结构数
  • 接口数量
我知道也有委托、枚举、事件等,但上面的类型最有意思

此外,基类库(BCL)中类型的数量以及整个框架类库(FCL)的大小也很有趣

这些信息有两种用途:

首先,了解您实际使用了多少总体框架,还有多少需要学习

第二,许多来自其他平台的程序员(以及非技术人员)经常惊讶于程序员可以将大部分时间花在“.NET Framework”中。拥有一些数字肯定有助于解释为什么这不是狭隘技能/经验的表现

[更新]

使用Andrew的代码(在我的.NET 3.5 SP1系统上),我得到:

类别:12688 值类型:4438
接口:1296您可以使用反射来查找BCL中不同类型的数量,但是您希望用这些信息实现什么

以下是如何获取该信息的示例:

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());
    }
}
请注意,您需要对框架中的每个程序集执行此操作,以获得总数

编辑:这里有一个快速而肮脏的解决方案,可以让您大致了解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);
    }
}

它如此之大以至于没有人真正知道它的大小


就文件大小而言,在我的系统上,2.0、3.0和3.5框架占用大约130MB的磁盘空间,而64位版本占用大约93MB的磁盘空间。但这还不包括Win7本身的核心内容。

我自己没有使用过它,但我认为这是可以提供给您的信息。

这两篇博文阐述了这个主题:

  • Brad Abrams:(显示不同框架版本的数字)
  • 帕特里克·斯马奇亚:(使用独立软件)

结果按程序集、名称空间、类型、成员和其他项的数量进行细分。

如果不定义“大”的含义--IL(.dll)大小,就有点难以回答?源代码大小?功能范围?另外,您是否在谈论最近的3.5 SP1可再发行版本,而没有任何官方附加组件(即F#stuff、MVC等),它们是“框架”的完全支持部分,但不随3.5可再发行版本一起提供


我不想变得困难。。。我只是说,有几个变量甚至可以用来决定要测量什么,然后是关于用什么样的棍子来测量它的一些问题。

1)了解如何最好地学习框架的新领域(至少对我而言)。2) 向非.NET程序员和非技术人员解释.NET有多大,以及为什么可以完全在.NET范围内工作。这是一个有趣的指标+1表示求和算法。但这些数字只有在你能弄清楚你知道多少FCL以及如何实际量化的情况下才会变得有趣?e、 g.你自己灰质的.Net部分的清单-p+1对代码进行了很好的更新,我将尝试一下。我以前没有使用过RuntimeEnvironment,这很有趣。以下是我在系统中得到的信息:类:12688值类型:4438接口:1296您可能对Patric Smacchia对.NET 4.0的快速分析感兴趣:我在VS2010中编译了Andrew的代码:类:12704值类型:4416接口:1287正如我在问题中所说的,FCL第3.5版(包括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);
    }
}