SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

FxCopとカスタムルールを使って.NETコードの品質を監視する

アセンブリに含まれるMSILを解析しルールに一致しないコードを調べる

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
  • すべてのカスタム命名ルールのC#コードが含まれています。
  • 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」ファイルに含まれています。

リスト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アプリケーションを開始します。
  • プロジェクトで分析するターゲット(アセンブリ)を選択し、追加します(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」と入力します。
メモ
 これは既定のインストールパスです。FxCopを別の場所にインストールしている場合は、異なるパスを使用する必要がある可能性があります。
  • [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に統合する方法についても説明しました。この操作によって、開発者はアセンブリの問題点をオンデマンドで、または標準のビルドプロセスの一部として、簡単に分析することができます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Joydip Kanjilal(Joydip Kanjilal)

業界で10年以上のキャリアを持ち、C、C++、Java、C#、VB、VC++、ASP.Net、XML、デザインパターン、UMLなどに携わる。現在は、インドのハイデラバードにある一流の多国籍企業のシニアプロジェクトリーダーを務めるかたわら、.NETおよび関連テクノロジに関する記事をAspAllianceに投稿...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/582 2006/09/21 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー