2011-11-16 2 views
6

特定のメソッドが呼び出された場合にコンパイル時エラーを生成する方法はありますか?.NETコードが特定のメソッドを呼び出さないようにしますか?

たとえば、特定のプロジェクトのコードがSystem.Configuration.ConfigurationManager.AppSettings()を呼び出さないようにしたいとします。そのメソッドが呼び出された場合、コンパイル時エラーを発生させるためにプロジェクトまたはクラスファイルにタグを付ける方法はありますか?

私はそこにいるとは思わないので、これを行う唯一の方法は、これらの呼び出しをフラグするFxCopルールを生成してその方法で行うことですが、私は他のアイデアを公開しています。

私は.NET 3.5を使用しています。 4.0のコード契約でこれができるかどうかは不明です。

アップデート

私は具体的には、フレームワークの方法について話して私自身ではないので、私は廃止されたとして、それらをマークすることはできませんしています。

この時点で私は反射については気にしません。

もう1つの例は、MicrosoftのAntiXssライブラリを検索して置き換えるSystem.Web.HttpUtility.HtmlEncodeですが、新しいコードもチェックするビルドサーバーに何らかのチェックプロセスを統合したいと思います。

+0

あなたも、リフレクションを通じて、このメソッドを呼び出す許可しないようにしたいですか? – Vlad

+1

独自のアセンブリで再コンパイルできる場合は、Obsolete属性を使用できます。 – asawyer

+0

なぜあなたはそれを使いたくないのですか? –

答えて

2

ツールNDependを使用することができます。免責事項:私はツールの開発者の一人です。

Code Rules over LINQ Queries (CQLinq)のように、メソッドコールなどのような依存関係をチェックすることができます。コードの規則は、コンパイルが成功するたびにchecked in Visual Studio、またはrules can be checked at build process timeにもなります。

ようなCQLinqコードルールは次のように見ることができる:

warnif count > 0 
from m in Application.Methods   
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

ルールはget_AppSettings()ゲッターメソッドを呼び出すメソッドを含むように、正規表現に一致し、例えば名前空間のために禁止する、気まぐれに特化することができる。

NDependの dependency matrixまたは dependency graphから
warnif count > 0 
from m in Application.Namespaces.WithNameLike("regex").ChildMethods() 
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

、あなたはまた、右の依存関係(マトリックスセルまたはグラフの矢印)をクリックし、依存性が存在する場合は警告したコードのルールを生成することができます(その後、ルールGENを専門に)あなたが必要な場合はerated:

enter image description here

+0

NDepend UI。私はそれをCruiseControl.NET/NAntビルドスクリプトに統合できるかどうかを確認する必要があります。それは可能ですか? – slolife

+0

はい、これは可能です、私たちのCC.NET統合関連のドキュメントを読んでください:http://www.ndepend.com/Doc_CI_CCNet.aspx –

4

あなたはwrite your own rules in FxCopにできるので、それはおそらくオプションです。

しかし、この場合、既存のコードベースでは、「ConfigurationManager.AppSettings」のエディタでCtrl-F(検索)を使用すると、これまでよりも少ない作業で同等の良い仕事をすることができます。開発チームへの電子メールのより人間的なルートを検討するかもしれませんが...

上記のコメント者によって強調され、同様の目標を持つ他の人に注目する価値があるのは、あなた自身のコードベース(この質問はではなく、である)では、[Obsolete]属性を使用できます。

+0

電子メール**が**有効であることに私は同意しますが、検証の点でもう少し具体的なことが必要です。 – slolife

+1

おそらくチームに、コーディング基準を破って残りのチームに6パックのビールを借りなければならないと言ってもらえますか?すべての深刻さで、カスタムルールを使用するFxCopは、それを検証するのに役立ちますが、開発者(またはビルドサーバー)がルールをインストールし、FxCopを適切に使用する限りです... – Reddog

関連する問題