2009-09-10 7 views
16

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:

  1. Télécharger NDepend (NDepend_2_12_1_3122.zip), via http://www.ndepend.com/NDependDownload.aspx

  2. Décompressez avec 7-Zip

  3. Run VisualNDepend.exe

  4. 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.

  5. 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() 
+0

Selon la façon dont vous comptez le code privé et interne ainsi que enums, structs et interfaces, le nombre peut varier beaucoup. – Lucero

+0

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 ... –

+0

Je suggère d'utiliser l'Assemblée.ReflectionOnlyLoadFrom plutôt que Assembly.LoadFrom, juste pour la vitesse vraiment. –

Répondre

16

Cette page donne le nombre de types (40513 en 3.5SP1) - vous est-il vraiment important de faire la différence entre les classes et/structs énumérations/interfaces?

Je m'attendrais à ce que la grande majorité de ces 40K + soient des classes, donc votre chiffre 6000 est très conservateur.

donné une liste d'ensembles, il est très facile de travailler le nombre de classes:

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

Cela suppose que vous voulez toutes les classes si - vous êtes réellement intéressé par les classes que publiques?

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

+1 "très conservateur" en effet :) –

+0

La liste des assemblages proviendrait-elle des 89 fichiers DLL? dans C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727? (Pour .NET 2.0 sur mon système) –

+0

Pourrait être - pour .NET 2.0. Il semble changer pour chaque version. Le répertoire "Assemblées de référence" est prometteur, mais pour v3.5 qui manque mscorlib.dll et System.dll ... –

Questions connexes