FxCop SDKを使ってカスタムルールを実装する
詳しい例は後で示しますが、FxCopでカスタムルールを作成するために従う必要がある手順の概要を以下に示します。
最初に、クラスライブラリプロジェクトを作成し、「FxCopSdk.dll」および「Microsoft.Cci.dll」アセンブリへの参照を追加します。
次に、クラスを作成してルールを実装します。このクラスは、BaseIntrospectionRuleクラスから継承する必要があります。
次のusing文をカスタムルールクラスに追加します。
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を使って、事前定義のルールと新しいカスタムルールの両方に基づいてターゲットアセンブリを評価できます。
カスタムルールの例
この例ではBaseRuleクラスを作成しますが、後でこのクラスを継承してカスタムルールクラスを作成します。必要なファイルは次のとおりです。
- NamingRules.xml
- NamingRules.cs
- BaseRule.cs
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です。
BaseRuleクラスのコードを以下に示します。このコードはダウンロードサンプルの「BaseRule.cs」ファイル内にあります。なお、後でこのクラスを継承してカスタムルールクラスを作成します。
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) { } } }
上記のコードのBaseRuleクラスは、コードの再利用性を促進し、コードのメンテナンスを簡単化する、共通機能を提供します。例えば、クラスコンストラクタは、要求されたパラメータを使ってBaseIntrospectionRuleコンストラクタへの呼び出しを行います。
リスト1は、BaseRuleクラスを継承するカスタムルールを示しています。これは、ダウンロードサンプルの「NamingRules.cs」ファイルに含まれています。
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アプリケーションを開始します。
- プロジェクトで分析するターゲット(アセンブリ)を選択し、追加します(FxCopメニューシステムの[Project]-[Add Targets])。
- カスタムルール(ある場合)をFxCopアプリケーションに追加します(FxCopメニューシステムの[Project]-[Add Rules])。
- [Analyze]ボタンをクリックします。
FxCopとVS.NETの統合
FxCopとVisual Studio IDEを統合することによって、開発者は、コーディング時にソースコードを分析できるようになります。FxCopが生成するレポートによって開発者はアプリケーションを展開する前にエラーを見つけて修正できるため、この統合は開発者にとってメリットがあります。
統合方法
FxCopには「fxcopcmd.exe」という名前のコマンドラインツールがあり、これを使用することで、FxCopとVS.NET IDEを統合したり、または、FxCopの分析およびレポート生成機能をビルドプロセスに追加したりできます。統合するには、次の手順を実行します。
- VSメニューの[Tools]-[External Tools]を選択します。ポップアップウィンドウが表示され、構成可能なオプションが表示されます。
- [Title]フィールドに「FxCop」と入力します。
- [Command]フィールドに「C:\Program Files\Microsoft FxCop 1.32\FxCopCmd.exe」と入力します。
- [Arguments]フィールドに「/f:$(TargetPath) /r:"C:\Program Files\Microsoft FxCop 1.32\Rules" /c」と入力します。
- [Initial Directory]フィールドを[$(ProjectDir)]に設定します。
- [Use Output Window]をオンにします。
変更を保存します。VS.IDEから、メニューシステムで[Tools]-[FxCop]をクリックします。FxCopによってルールがロードされ、VS.NET IDEの出力ウィンドウにレポートが表示されます。
現代のIT業界におけるソフトウェアアプリケーションは、時間と共に複雑になり、高度になってきています。Microsoftがリリースした無料のFxCopコード分析ツールを使用することで、開発者は、事前に定義された標準に準拠する高品質なソフトウェアアプリケーションを設計するという目標を達成できます。本稿では、FxCopを使ってカスタムルールを作成し、要求される標準にマネージドアセンブリが準拠しているかどうかを分析する方法について説明しました。また、FxCopをVisual Studio IDEに統合する方法についても説明しました。この操作によって、開発者はアセンブリの問題点をオンデマンドで、または標準のビルドプロセスの一部として、簡単に分析することができます。
