2012年11月19日月曜日

CA0060 間接的な参照のアセンブリが見つかりませんでした

ポータブル クラス ライブラリ(Portable Class Library)を使用した開発を行っている場合などで、Visual Studio のコード分析(Code Analysis)が CA0060 の警告を発生させる場合があります。本稿では、この警告の発生原因と解決方法を説明します。

警告 CA0060 とは

ポータブル クラス ライブラリを使用するコードを Visual Studio を使用してコード分析にかけると、CA0060 の警告が出る場合があります。

例えば、ポータブル クラス ライブラリ プロジェクトで System.Xml を参照しており、このプロジェクトを参照する Silverlight 5 プロジェクトも System.Xml を参照しているとします。この時、Silverlight 5 プロジェクトが参照している System.Xml は Version 5.0.5 ですが、ポータブル クラス ライブラリ プロジェクトが参照している System.Xml は Version 2.0.5 だったりします。コード分析モジュールは分析のために Version 2.0.5 の System.Xml を要求するようですが、コード分析モジュールがこのアセンブリを見つけることができなかった場合に、CA0060 の警告がコード分析モジュールから発せられます。

CA0060 の警告はコード分析の結果として報告される警告ではなく、コード分析モジュール自身の動作についての警告なので、プロジェクト抑制ファイル(GlobalSuppressions.cs)等でこの警告を抑制することはできません。

対処法

根本的な問題はコード分析モジュールが必要なアセンブリを見つけることができないことにあり、コード分析モジュールが必要とするアセンブリのありかを教えてあげることができれば、この警告が出なくなるはずです。

Visual Studio の GUI を使用してコード分析モジュールに対して必要なアセンブリのありかを構成することはできませんが、分析対象のプロジェクト ファイル(C# ならば *.csproj ファイル)を直接編集することで、この問題に対処することができます。

コード分析モジュールは起動時に分析対象のアセンブリのパスなどをいわゆるコマンド ライン引数として受け取っており、このコマンド ライン引数に追加する内容をプロジェクト ファイル内で指定することができます。

ポータブル クラス ライブラリを使用する側のプロジェクト ファイルを以下の例のように編集します。

<RunCodeAnalysis>true</RunCodeAnalysis>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisAdditionalOptions>/d:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0"</CodeAnalysisAdditionalOptions>

1 行目は、コード分析を実行するかどうかを指定しています。この値が false ならばコード分析は実行されないので、必然的に CA0060 の警告も発生しなくなります。



2 行目は、コード分析モジュールが使用するルール セットです。この値は Visual Studio の GUI で変更できるので、特に手動で変更する必要はないでしょう。



3 行目が、今回のポイントです。CodeAnalysisAdditionalOptions タグは、その名の通りコード分析モジュールに対する追加のオプションを指定するために存在します。そこに、コード分析時に必要になると思われるアセンブリ(警告メッセージで指定されたアセンブリ)が含まれているフォルダのパスを指定します。



コマンド ライン引数の仕様は、「/d:(参照モジュールのパス)」です。上述の例では、ポータブル クラス ライブラリ 4.0 のパスを指定しています。ポータブル クラス ライブラリ 4.5 を使用している場合は、パスの最後が v4.5 になると思います。自身の環境に合わせて指定してください。



なお、/d オプションは複数回指定することができます。コード分析に必要なアセンブリが複数のフォルダに分散している場合などは、CodeAnalysisAdditionalOptions タグの中に /d オプションを複数続けて書くことで対処できるようです。



まとめ



コード分析モジュールの CA0060 の警告は、コード分析モジュールがコード分析に必要なアセンブリを見つけられなかったことを示しています。



コード分析モジュールが必要なアセンブリを見つけられるように、プロジェクト ファイルを編集してコード分析モジュールに対する追加オプションを指定することにより、この警告を発生させることなく、正しいコード分析を実行できるようになります。

0 件のコメント:

コメントを投稿