6

カスタム FxCop (= コード分析) ルールを Visual Studio 2010 から Visual Studio 2012 に移行しようとしています。

これまでのところ、それらは 1 つのことを除いて正常に動作します: 結果ウィンドウ ( View-> Other windows-> Code Analysis) では名前が空白で、CheckIdとのみがResolution表示され、名前は Microsoft のルールで表示されます:

この名前は、カスタム ルールの CheckId の右側には表示されませんが、Microsoft ルールでは表示されます。

奇妙なのは、名前ルールセット エディターに表示されることです。

名前は、ルールセット エディターの両方のルールで表示されます

私のルールの何が問題になっていますか?

詳細

両方のルールが MSBuild の出力にどのように表示されるかを次に示します (怪しいものがありますが、別のメッセージが表示される理由がわかりません)。

6>c:\Users\Me\MySolution\MyProject\Program.cs(15): warning : CA1804 : Microsoft.Performance : 'Foo<T>.SomeMethod()' declares a variable, 'z', of type 'int', which is never used or is only assigned to. Use this variable or remove it.
6>MSBUILD : warning : CF1001 : CustomRules.ThreadSafety : The public Public Field "Tests.Program.Foo" must be preceded of readonly

私のルールの XML ファイル内のルール宣言は次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="CustomRules">
  <Rule TypeName="PublicFieldsMustBeReadonly" Category="CustomRules.ThreadSafety" CheckId="CF1001">
    <Name>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Name>
    <Description>Public Fields must be readonly or must be replaced with a Getter/Setter Method.</Description>
    <GroupOwner>MyCompany</GroupOwner>
    <DevOwner>Me</DevOwner>
    <Owner>Me</Owner>
    <Url>http://example.com</Url>
    <Resolution>The public Public Field "{0}" must be preceded of readonly</Resolution>
    <Email>my@email.com</Email>
    <MessageLevel Certainty="100">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
  </Rule>
</Rules>

Microsoft のルールの XML でのルール宣言は次のとおりです。

<Rules FriendlyName="Performance Rules">
  <Rule TypeName="RemoveUnusedLocals" Category="Microsoft.Performance" CheckId="CA1804">
    <Name>
      Remove unused locals
    </Name>
    <Description>
      Remove locals that are not used or are only assigned to in method implementations.
    </Description>
    <Url>
      @ms182278(VS.100).aspx
    </Url>
    <Resolution>
      {0} declares a variable, {1}, of type {2}, which is never used or is only assigned to. Use this variable or remove it.
    </Resolution>
    <Email />
    <MessageLevel Certainty="95">
      Warning
    </MessageLevel>
    <FixCategories>
      NonBreaking
    </FixCategories>
    <Owner />
  </Rule>
</Rules>
4

1 に答える 1

6

これは、コード分析の実行によって生成された FxCop レポートの違反メッセージに、ルール名 (クラス タイプ名ではなく) が含まれていないために発生します。<Rules>理論的には、Visual Studioはレポート内のノードの下にあるルール名を検索してから、別の場所を検索することができます (おそらくそうすべきです) 。ただし、VS 2012 ではそうではありません。代わりに、読み込まれたルール アセンブリから取得したルール情報からのみルール名を取得します。

ここで注意が必要なのは、UI 表示の目的で、Visual Studio はコード分析の実行とはまったく別の検索とルール アセンブリの読み込みを行っていることです。後者はfxcopcmd.exe、MSBuild プロパティから生成されたコマンド ラインで実行することによって実行されます。前者は、コード分析用に Visual Studio プラグインに埋め込まれた完全に別個のロジックを使用し、プロジェクト レベルのルールの場所やルールセット ファイルを考慮しません。(詳細に興味がある場合はMicrosoft.VisualStudio.CodeAnalysis.ManagedRuleProvider、アセンブリ内のクラスを介して行われるようです。)CodeAnalysis.dll

つまり... ルール名を表示する場合、基本的に 2 つの選択肢があります。

  1. <VS install directory>\Team Tools\Static Analysis Tools\FxCop\RulesVisual Studio によって取得されるように、ルール アセンブリをフォルダーに配置します。

  2. 次のような値を持つレジストリ ノードを追加します (既存の を使用する代わりに、スペースを使用してHKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\Code Analysis\FxCopRulePathという名前の新しいキーを作成します)。これにより、ルールと組み込みルールの両方に名前が表示されるようになります。Code AnalysisCodeAnalysis%FxCopDir%\Rules;C:\Foo\Bar\YourRulesFolder

于 2013-08-02T12:35:39.053 に答える