|
ニュース検索
ピックアップ
今週のIT求人情報
|
FxCopとカスタムルールを使って.NETコードの品質を監視するはじめにFxCopは、Microsoftが提供している、マネージド.NETアセンブリを分析するための無料のコード分析ツール(オープンソース)です。.NETアセンブリは、アセンブリと、含まれているすべてのデータ型を表すメタデータのエントリで構成されています。FxCopは、アセンブリメタデータを読み取り、それが推奨のコーディング標準やプラクティスを記述しているビルトインルールおよびカスタムルールに準拠しているかどうかをチェックします。 FxCopは、アセンブリを分析した後に、ローカライゼーション、パフォーマンス、およびセキュリティの分野におけるルール違反をレポートします。コードのチェックは、埋め込みxmlファイルに格納されている一連のルールとメッセージに対して行われ、ルール違反が発生する場合は、実行時に該当のメッセージが表示されます。ビルトインルールを、自分で作成するカスタムルールで拡張できます。本稿では、FxCopの使用方法と、このようなカスタムルールを作成し、適用する方法について説明します。 本稿で説明する方法を実装するには、FxCop Version 1.32、.NET Framework Version 1.1以上のインストール、およびWindows XP/2000以上のOSが必要です。 FxCopとは?FxCopは「Framework Police」の略であり、マネージドコードアセンブリがMicrosoft .NET Frameworkのデザインガイドラインおよびカスタムガイドラインに準拠しているかどうかをチェックする、ルールベースのエンジンです。アセンブリに対するチェックは、アセンブリに含まれるMSILを解析し、ルールに一致しないコードを調べてレポートすることによって行われます。FxCopによるテストは、.NET対応言語のソースコードでなく、マネージドアセンブリに対して行われます。つまり、Microsoft.NETマネージド環境対応の言語を使って作成された任意のアセンブリに対して、FxCopを適用することができます。 FxCopを使用する理由FxCopは、特に複数の.NET言語を使用する会社に、次のような直接的な利益をもたらします。
一方、現時点のFxCopには、次のような制限があります。
FxCopの入手方法FxCopはMicrosoftが開発したツールであり、無料でダウンロードできます。 問題や質問がある場合は、FxCopチームまたはMSDNフォーラムにメッセージを送ることができます。 重要なFxCop用語ターゲットとは、FxCopを使って標準への準拠性を調べる対象となるマネージドアセンブリのことです。 FxCopは、分析時に実行するチェックをルールとして表現します。FxCopルールは FxCop内のルールは、既定ルールとカスタムルールに分けられます。既定ルールは、カテゴリに基づいてグループ化されています。FxCopのいくつかの重要なビルトインルール、その目的、および例を以下に示します。
.NETのデータ型とアセンブリのデザインに関するルール。
例: 抽象型にはコンストラクタを指定できない。
グローバリゼーションとローカライゼーションに関するルール。
例: ロケール固有の文字列をハードコード化してはならない。
命名規約に関するルール。
例: データ型の名前をパラメータで使用してはならない。
コードのパフォーマンスの向上または障害の可能性をチェックするルール。
例: 文字列長を使って空の文字列をテストする。
セキュアなコードをチェックするルール。
例: ポインタが認識可能であってはならない。
標準的な.NET Frameworkの使用に関するガイダンスを提供するルール。
例: ファイナライザは保護する必要がある。
FxCopインターフェイスFxCopには、GUIベースのユーザーインターフェイスとコマンドラインインターフェイスの2種類があります。FxCop GUIは、3つのウィンドウから成ります(図1を参照)。 構成ペインには、現在のFxCopプロジェクトのターゲットとルールがツリービュー形式で表示されます。この構成ペインを使って、ターゲットアセンブリと、ターゲットアセンブリの分析に使用するルールを選択します(複数のアセンブリを同時に分析できます)。 メッセージペインには、検査後のターゲットアセンブリに関する分析レポートが表示されます。これらのメッセージは、その重要度と危険度に基づいて次のレベルで表示されます。
図2は、典型的なFxCop分析レポートです。 プロパティタブには、名前空間、型と型メンバー、ルールグループ、ルール、メッセージなどを含む、ターゲットアセンブリに関する情報が表示されます。ルールやルールグループを選択したり、一部のルールを破棄したりして、FxCopがアセンブリをテストする基準となるルールセットを構築できます。 FxCopでカスタムルールを作成する FxCopでは、カスタムルールを作成して、独自の標準を適用することができます。このためには、FxCop SDKを使ってカスタムルールを開発し、それをビルトインの既定ルールに追加します。カスタムクラスは、FxCop SDK内の FxCop SDKを使ってカスタムルールを実装する詳しい例は後で示しますが、FxCopでカスタムルールを作成するために従う必要がある手順の概要を以下に示します。 最初に、クラスライブラリプロジェクトを作成し、「FxCopSdk.dll」および「Microsoft.Cci.dll」アセンブリへの参照を追加します。 次に、クラスを作成してルールを実装します。このクラスは、 次の using Microsoft.Cci; using Microsoft.Tools.FxCop.Sdk; using Microsoft.Tools.FxCop.Sdk.Introspection; 次に示すような、カスタムルールクラスのコンストラクタを作成します。 public MyCustomRule() : base( "MyCustomRule", "ProjectName.RuleCategory.RuleDefinitions", typeof(MyCustomRule).Assembly ) { } XMLドキュメントファイルでルールを記述し、これを埋め込みリソースとしてメインアセンブリに保存する必要があります(このファイルの"Build Action"を"Embedded Resource"に変更)。このプロセスについては、以下で詳しく説明します。 保存およびコンパイルして、アセンブリをビルドします。 最後に、FxCop IDEを使って新しいルールを追加します。このアセンブリがFxCopルールエンジンに追加されることに注意してください。この時点で、FxCopを使って、事前定義のルールと新しいカスタムルールの両方に基づいてターゲットアセンブリを評価できます。 カスタムルールの例 この例では
実装するすべてのルールの説明が含まれています。
すべてのカスタム命名ルールのC#コードが含まれています。
BaseRuleクラスが含まれているC#コードファイル。「NamingRules.xml」ファイル内の、XML形式のサンプルカスタムルールのルール定義を以下に示します。 <Rule TypeName="ObjectNamingRule" Category="FxCopCustomRules.CustomRules" CheckId="Rule0001"> <Name> Objects of the Object class should be properly named.</Name> <Description> Objects of the Object class should be prefixed with obj’. </Description> <GroupOwner>Joydip</GroupOwner> <DevOwner>Self</DevOwner> <Owner>Self</Owner> <Url>http://localhost</Url> <Resolution>Change the name of the object {0} so that it starts with a prefix of ’obj’.</Resolution> <Email>joydipkanjilal@yahoo.com</Email> <MessageLevel Certainty="50">Warning</MessageLevel> <FixCategories>Breaking</FixCategories> </Rule> 上記のコードのルール名はInterfaceNamingRuleであり、カテゴリはNamingRulesです。 using System; using Microsoft.Cci; using Microsoft.Tools.FxCop.Sdk; using Microsoft.Tools.FxCop.Sdk.Introspection; [CLSCompliant(false)] namespace FxCopCustomRulesLibrary { public abstract class BaseRule : BaseIntrospectionRule { protected BaseRule(string name) : base(name, "FxCopCustomRulesLibrary.NamingRules.NamingRules", typeof(BaseRule).Assembly) { } } } 上記のコードの リスト1は、 リスト1 カスタムルールクラスの例:このObjectNamingRuleクラスはBaseRuleクラスを継承
public class ObjectNamingRule : BaseRule { public ObjectNamingRule() : base("ObjectNamingRule") { } public override ProblemCollection Check(Member member) { Method method = member as Method; bool problem = false; if (method != null) { InstructionList instructions = method.Instructions; if (instructions.Length == 0) return null; LocalList localList = instructions[0].Value as LocalList; if (localList == null) return null; Local local; string strName = String.Empty; string strType = String.Empty; for (int index = 0, length = localList.Length; index < length ; index++) { local = localList[index]; strName = local.Name.Name; strType = local.Type.FullName.ToString(); if (strType.Equals("System.Object") && !strName.StartsWith("CS$")) { problem = (strName.Length < 3 || !strName.Substring(0,3).Equals("obj")); } if (problem) { Problems.Add ( new Problem ( GetResolution (strName) ) ) ; } } } else { Field field = member as Field; if (field == null) return null; else { if (field.Type.FullName.ToString() .Equals("System.Object")) { problem = ((member.Name.ToString().Length < 3 || !member.Name.ToString().Substring(0,3) .Equals("obj"))); } if (problem) { Problems.Add ( new Problem ( GetResolution (member.Name.Name))) ; } } } return Problems; } } FxCopを使ってアセンブリを分析するFxCopを使ってアセンブリを分析するには、次の一連の手順に従う必要があります。
FxCopとVS.NETの統合FxCopとVisual Studio IDEを統合することによって、開発者は、コーディング時にソースコードを分析できるようになります。FxCopが生成するレポートによって開発者はアプリケーションを展開する前にエラーを見つけて修正できるため、この統合は開発者にとってメリットがあります。 統合方法FxCopには「fxcopcmd.exe」という名前のコマンドラインツールがあり、これを使用することで、FxCopとVS.NET IDEを統合したり、または、FxCopの分析およびレポート生成機能をビルドプロセスに追加したりできます。統合するには、次の手順を実行します。
メモ
これは既定のインストールパスです。FxCopを別の場所にインストールしている場合は、異なるパスを使用する必要がある可能性があります。
変更を保存します。VS.IDEから、メニューシステムで[Tools]-[FxCop]をクリックします。FxCopによってルールがロードされ、VS.NET IDEの出力ウィンドウにレポートが表示されます。 現代のIT業界におけるソフトウェアアプリケーションは、時間と共に複雑になり、高度になってきています。Microsoftがリリースした無料のFxCopコード分析ツールを使用することで、開発者は、事前に定義された標準に準拠する高品質なソフトウェアアプリケーションを設計するという目標を達成できます。本稿では、FxCopを使ってカスタムルールを作成し、要求される標準にマネージドアセンブリが準拠しているかどうかを分析する方法について説明しました。また、FxCopをVisual Studio IDEに統合する方法についても説明しました。この操作によって、開発者はアセンブリの問題点をオンデマンドで、または標準のビルドプロセスの一部として、簡単に分析することができます。 著者紹介Joydip Kanjilal(Joydip Kanjilal)
業界で10年以上のキャリアを持ち、C、C++、Java、C#、VB、VC++、ASP.Net、XML、デザインパターン、UMLなどに携わる。現在は、インドのハイデラバードにある一流の多国籍企業のシニアプロジェクトリーダーを務めるかたわら、.NETおよび関連テクノロジに関する記事をAspAllianceに投稿している。
|