Количество классов в .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()
Ответы
Ответ 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();
Ответ 2
Используя NDepend и CQL, вы можете найти дополнительную информацию о .NET Framework, например, сообщения в блогах,
Быстрый анализ .NET Fx v4.0 Beta1
.NET 3.5 SP1: Обзор изменений