2009-09-10 7 views
16

.NETのクラスの総数はいくらですか? の番号は、.NET 2.0、.NET 3.0、および.NET 3.5 SP1のダウンロードされたランタイムにあります。.NETのクラス数は?

は.NETをベースにしており、現在は6000クラスよりも が多いと書かれています。しかし、これが正しい場合は、 の番号ではわかりません。

たとえば、this pageは、アセンブリの数、名前空間、メソッドなど の数を示しますが、クラスの数は記載していません。

テストプラットフォーム:Windows XP 64ビットSP2、8 GB RAM。


更新4:私たちの論文が公開されました!クラス数に9911を使用しました(下記のアップデート3を参照)。ジャーナルはJournal of Proteome Researchで、タイトルは "MSQuant, an Open Source Platform for Mass Spectrometry-Based Quantitative Proteomics"です。残念ながら、論文の全文は自由に入手できず、要約のみです。

更新3:私は今、ソリューションに非常に近いと思います:.NET 3.5 SP1用の9911パブリッククラス。更新1で拡張された関数を再帰的に拡張し、サブフォルダとそのサブフォルダの型、クラス、パブリッククラスの数が報告されるように拡張しました。 これをC:\ WINDOWS \ Microsoft.NET で実行すると、40414種類が得られ、referenced articleの数からわずか0.2%です。 Full transcript - HTMLソースはタブで区切られているため、 スプレッドシートにインポートすることができます。 OpenOffice Calc。ここで publicクラスのブレークダウンです:

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によって提案され、それは.NET 2.0(89個のDLLを で、10%高い数値を与えましたC:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727):5855 クラス。これは、 プログラムソリューションとは異なるシステム上にありました(下記参照)。

手順:

  1. ダウンロードNDependの(NDepend_2_12_1_3122.zip)、 解凍

  2. http://www.ndepend.com/NDependDownload.aspxを経由して7-ZIP

  3. 実行VisualNDepend.exe

  4. メニューファイルと/解析する.NETアセンブリを選択/ < のC:¥WINDOWS¥Microsoft.NET¥Framework¥v2.0.50727 >/<の89個のDLLファイルを選択すべて>/OKを選択しました。

  5. 押して "クエリの作成"(右下)とタイプ/ペースト: "アクセシビリティ" ASSEMBLIES FROM

    SELECT TYPES、 "cscompmgd"、 "CustomMarshalers"、 "IEExecRemote"、 "IEHost"、 "IIEHost" 、 "ISymWrapper"、 "Microsoft.Build。"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.Data.OracleClient」、「System.Data.SqlXml」、「System.Deployment」、「System.Design」、「System.Data.OracleClient」、「System.Data.OracleClient」、 "System.DirectoryServices"、 "System.DirectoryServices.Protocols"、 "System.Drawing"、 "System.Drawing.Design"、 "System.EnterpriseServices"、 "System.Management"、 "System.Messaging"、 "System。 「System.ServiceProcess」、「System.Transactions」、「System.Web」、「System.Web.Mobile」、「System.Web.Mobile」、「System.ServiceProcess」、「System.ServiceProcess」、 System.Web.RegularExpressions "、" System.Web.Services "、" System.Windows.Forms "、" System.XML "WHERE IsPublic AND IsClass


アップデート1:ジョンスキートの答えに基づいて、私は(下記参照) 機能を開発しました。予備的な結果は、5265 publicクラス、合計12626クラス、.NET 2.0の18317タイプです。 mscorlib.dllからの802の公開クラスとSystem.dllからの公開の のクラス678これはAssembly.LoadFrom()で 40が失敗した89個のDLLファイルからのものです。しかし、私は確信していません 正しいことを測るか、正しい場所で。

コール:

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

列挙型、構造体およびインタフェースの場合、数は多少異なる場合があります。 – Lucero

+0

また、イテレータブロック、匿名クラス、クロージャがあり、コンパイラ生成クラスがかなり生成される可能性があります。非公開クラスを探すのは意味がありません。それからT4のようなテクニックを使っていろいろなマシン生成クラスがありますが、これはしばしば非常によく似た動作をカプセル化しますが、別個のクラスに終わることがあります。ファクトリメソッドを介して動作するApiは、関連クラスの束を隠すことができ、主にインターフェイスのみを公開します。インターフェイスにはパブリックな実装者はいませんが、まだ使用可能です。全体的に、測定するのは難しいです... –

+0

私はアセンブリを使用することをお勧めします。ReflectionOnlyLoadFromではなく、Assembly.LoadFrom、実際にはスピードのために。 –

答えて

16

このページには、種類(3.5SP1で40513)の数を与える - それは、クラスや構造体/列挙型を区別するために、あなたに本当に重要です/インタフェース?

私は40K +の大半がクラスであると予想していますので、6000人の数字は非常に控えめです。あなたが実際にpublicクラスのみに関心がある - あなたががすべてのクラスをしたい

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

これは前提としています

は、アセンブリのリストを考えると、それはクラスの数を動作するように非常に簡単ですか!あなたはポストを示してブログなどの.NET Frameworkの詳細な情報を見つけることがNDependのとCQLを使用して

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

+1 "非常に控えめな"確かに:) –

+0

アセンブリの一覧は、89のDLLファイルから来るC:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727にありますか? (私のシステム上の.NET 2.0の場合) –

+0

- .NET 2.0の場合。それはすべてのバージョンで変わるようです。 "Reference Assemblies"ディレクトリは有望ですが、v3.5ではmscorlib.dllとSystem.dllが欠けています... –

関連する問題