Quel est le nombre total de classes dans .NET? Le nombre que est dans le runtime téléchargé pour .NET 2.0, .NET 3.0 et .NET 3.5 SP1.Nombre de classes dans .NET?
Nous écrivons un article scientifique sur une application qui est basé sur .NET et indiquent actuellement qu'il y a plus de que 6000 classes. Mais je ne suis pas sûr que ce soit le bon numéro .
Par exemple this page indique le nombre d'assemblages, espaces de noms, méthodes, etc., mais pas le nombre de classes.
Plate-forme de test: Windows XP 64 bits SP2, 8 Go de RAM.
Mise à jour 4: Notre document a été publié! J'ai utilisé 9911 pour le nombre de classes (voir mise à jour 3 ci-dessous). Le journal est Journal of Proteome Research et le titre est: "MSQuant, an Open Source Platform for Mass Spectrometry-Based Quantitative Proteomics". Malheureusement, le texte intégral du document n'est pas disponible gratuitement, seul le résumé.
Mise à jour 3: Je pense que je suis très proche d'une solution maintenant: classes publiques 9911 pour .NET 3.5 SP1. S'étendant sur la mise à jour 1, j'ai rendu la fonction récursive et l'ai étendue de sorte que le nombre de types, de classes et de classes publiques soit rapporté pour n'importe quel sous-dossier et ses sous-dossiers. En cours d'exécution sur C: \ WINDOWS \ Microsoft.NET donne 40414 types, seulement 0,2% du nombre dans le referenced article. Full transcript - La source HTML est séparée par des tabulations de sorte qu'elle puisse être importée dans une feuille de calcul, par ex. OpenOffice Calc. Voici une pause vers le bas pour les classes publiques:
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
Mise à jour 2: J'ai essayé d'utiliser NDepend et CQL suggéré par lextm et il a donné un plus grand nombre de 10% pour .NET 2.0 (89 DLLs dans C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727): 5855 classes. C'était sur un système différent de celui de la solution programmatique (voir ci-dessous).
Procédure:
Télécharger NDepend (NDepend_2_12_1_3122.zip), via http://www.ndepend.com/NDependDownload.aspx
Décompressez avec 7-Zip
Run VisualNDepend.exe
Menu Fichier/Sélectionnez les assemblys .NET à analyser/ < Sélection des 89 fichiers DLL dans C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 >/< Sélectionné tout >/OK.
Appuyez sur "Créer une requête" (en bas à droite) et le type/coller:
TYPES SELECT DE ENSEMBLES "Accessibilité", "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 "," Système "," System.configuration "," System.Configuration.Install "," System.Data "," System.Data.OracleClient "," System.Data.SqlXml "," System.Deployment "," System.Design " , "System.DirectoryServices", "System.DirectoryServices.Protocols", "System.Drawing", "System.Drawing.Design", "System.EnterpriseServices", "System.Management", "System.Messaging", "Système. Runtime.Remoting "," System.Runtime.Serialization.Formatters.Soap "," System.Security "," System.ServiceProcess "," System.Transactions "," System.Web "," System.Web.Mobile "," System.Web.RegularExpressions "," System.Web.Services "," System.Windows.Forms "," System.XML "WHERE IsPublic ET IsClass
Update 1: basé sur la réponse de Jon Skeet J'ai développé une fonction (voir la liste ci-dessous). Le résultat préliminaire est 5265 classes publiques, 12626 classes au total, 18317 types pour .NET 2.0. 802 classes publiques de mscorlib.dll et 678 classes publiques de System.dll. C'est à partir de 89 fichiers DLL dont 40 échoue avec Assembly.LoadFrom(). Mais je ne suis pas sûr que je mesure la bonne chose ou au bon endroit.
Appel:
DotNetClassCount("C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727")
Fonction:
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()
Selon la façon dont vous comptez le code privé et interne ainsi que enums, structs et interfaces, le nombre peut varier beaucoup. – Lucero
Il existe également un bloc d'itérateur, des classes anonymes et des fermetures qui peuvent entraîner la création de plusieurs classes générées par le compilateur - donc regarder des classes non publiques est probablement moins significatif. Ensuite, il existe probablement diverses classes générées par des machines utilisant des techniques comme T4 qui encapsulent souvent un comportement très similaire mais se retrouvent dans des classes distinctes. Api est ce travail par des méthodes d'usine peut cacher un tas de classes pertinentes, exposant principalement seulement des interfaces - une interface peut ne pas avoir d'implémenteurs publics encore être utilisable. Dans l'ensemble, difficile à mesurer ... –
Je suggère d'utiliser l'Assemblée.ReflectionOnlyLoadFrom plutôt que Assembly.LoadFrom, juste pour la vitesse vraiment. –