Подтвердить что ты не робот

Количество классов в .NET?

Каково общее число классов в .NET? Число, которое находится в загруженной среде выполнения для .NET 2.0,.NET 3.0 и .NET 3.5 SP1.

Мы пишем научную статью о приложении, которое основано на .NET и в настоящее время заявляет, что есть больше чем 6000 классов. Но я не уверен, правильно ли это число.

Например, эта страница указывает количество сборок, пространства имен, методы и т.д., но не количество классов.

Платформа тестирования: Windows XP 64-разрядная версия SP2, оперативная память 8 ГБ.


Обновление 4. Наша публикация опубликована! Я использовал 9911 для количества классов (см. Обновление 3 ниже). Журнал Journal of Proteome Research, а заголовок: MSQuant, платформа с открытым исходным кодом для количественной количественной протеомики на основе масс-спектрометрии ". К сожалению, полный текст статьи не является бесплатным, а только тезисы.

Обновление 3. Я думаю, что сейчас я пришел очень близко к решению: 9911 общедоступных классов для .NET 3.5 SP1. Расширяясь при обновлении 1, я сделал функцию рекурсивной и расширил ее, чтобы сообщать количество типов, классов и общедоступных классов для любой подпапки и ее подпапок. Выполнение этого на C:\WINDOWS\Microsoft.NET дает 40414 типов, всего 0,2% от числа в ссылка на статью. Полная расшифровка - HTML-источник разделен на вкладку, поэтому его можно импортировать в таблицу, например. OpenOffice Calc. Вот разбивка для публичных классов:

Framework:

  Total: 6025

    v1.1.4322
      0

    v2.0.50727
      5265

    v3.0
      641

    v3.5
      119

Framework64:

  Total: 3886

    v2.0.50727
      3126  

    v3.0
      641

    v3.5
      119

Обновление 2. Я попытался использовать NDepend и CQL, предложенные lextm, и он дал 10% больше для .NET 2.0 (89 DLLs в C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727): 5855 классы. Это было в другой системе, чем для программное решение (см. ниже).

Процедура:

  • Загрузите NDepend (NDepend_2_12_1_3122.zip), через http://www.ndepend.com/NDependDownload.aspx

  • Распакуйте с помощью 7-Zip

  • Запустите VisualNDepend.exe

  • Файл меню/выберите сборки .NET для анализа / < Выбрано 89 DLL файлов в C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 > /< Выделить все > /OK.

  • Нажмите "Создать запрос" (внизу справа) и введите/вставьте:

    ВЫБЕРИТЕ ТИПЫ ИЗ АССАМБЛЕЙ "Доступность", "cscompmgd", "CustomMarshalers", "IEExecRemote", "IEHost", "IIEHost", "ISymWrapper", "Microsoft.Build.Engine", "Microsoft.Build.Framework", "Microsoft.Build.Tasks", "Microsoft.Build.Utilities", "Microsoft.JScript", "Microsoft.VisualBasic", "Microsoft.VisualBasic.Compatibility", "Microsoft.VisualBasic.Compatibility.Data", "Microsoft. VisualBasic.Vsa", "Microsoft.VisualC", "Microsoft.Vsa", "Microsoft.Vsa.Vb.CodeDOMProcessor", "Microsoft_VsaVb", "mscorlib", "sysglobl", "System", "System.configuration", "System.Configuration.Install", "System.Data", "System.Data.OracleClient", "System.Data.SqlXml", "System.Deployment", "System.Design", "System.DirectoryServices", "Система. DirectoryServices.Protocols", "System.Drawing", "System.Drawing.Design", "System.EnterpriseServices", "System.Management", "System.Messaging", "System.Runtime.Remoting", "System.Runtime. Serialization.Formatters.Soap", "System.Security", "System.ServiceProcess", "System.Transa" "System.Web", "System.Web.Mobile", "System.Web.RegularExpressions", "System.Web.Services", "System.Windows.Forms", "System.XML" WHERE IsPublic AND IsClass


Обновление 1: на основании ответа Джона Скита я разработал (перечисленные ниже). Предварительным результатом является 5265 общедоступные классы, всего 12626 классов, 18317 типов для .NET. 2,0. 802 общедоступных классов из mscorlib.dll и 678 общедоступных классов из System.dll. Это из 89 DLL файлов, из которых Ошибка 40 с Assembly.LoadFrom(). Но я не уверен, что я измерьте правильную вещь или в нужном месте.

Вызов:

DotNetClassCount("C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727")

Функции:

Imports System.Reflection 'For Assembly
Imports System.IO 'For Path

Private Function DotNetClassCount(ByRef aBaseDirectory As String) _
  As Integer

    Dim classCount As Integer = 0

    Dim failCount As Integer = 0 'For statistics only.

    Dim folderItems As String() = Directory.GetFiles(aBaseDirectory)
    Dim someFolderItem As String
    For Each someFolderItem In folderItems

        Dim fileName As String = Path.GetFileName(someFolderItem)

        If Path.GetExtension(fileName) = ".dll" Then
            Try
                Dim asm3 As Assembly = _
                  Assembly.LoadFrom(someFolderItem)
                Dim types As System.Type() = asm3.GetTypes()

                Dim DLLclassCount As Integer = 0
                Dim someType As System.Type
                For Each someType In types
                    If someType.IsClass AndAlso someType.IsPublic Then
                        DLLclassCount += 1
                    End If
                Next
                classCount += DLLclassCount
            Catch ex As Exception
                'Fail silently...
                failCount += 1
            End Try
        End If
    Next
    Return classCount
End Function 'DotNetClassCount()
4b9b3361

Ответ 1

Эта страница дает количество типов (40513 в 3.5SP1) - действительно ли вам важно различать классы и структуры/перечисления/интерфейсы?

Я бы ожидал, что подавляющее большинство из этих 40K + будут классами, поэтому ваша цифра 6000 очень консервативна.

Учитывая список сборок, очень легко выработать количество классов:

int classes = assemblies.GetTypes()
                        .Where(t => t.IsClass)
                        .Count();

Предполагается, что вы хотите все классы, но на самом деле вас интересуют только публичные классы?

int classes = assemblies.GetTypes()
                        .Where(t => t.IsClass && t.IsPublic)
                        .Count();