2009-07-09 15 views
3

System.IO.FileまたはSystem.IO.Directoryが使用されているかどうかを確認するためにリフレクションを完全に "スキャン"する方法はありますか?これらは単なるクラスの例です。リフレクション(コード分析と比較して)を行う方法があるかどうかは不思議です。.NET/C# - Reflection - System.IO.File ever

更新: あなたはAssembly.GetExecutingAssembly().GetReferencedAssemblies()経由依存アセンブリの一覧を取得することができます

答えて

6

Tommy Carlierが示唆しているように、Cecilと非常に簡単です。

using Mono.Cecil; 

// .. 

var assembly = AssemblyFactory.GetAssembly ("Foo.Bar.dll"); 
var module = assembly.MainModule; 

bool references_file = module.TypeReferences.Contains ("System.IO.File"); 
+0

1語。驚くばかり!ありがとう。 – BuddyJoe

+0

dailybuildsからmonocharge-20090414.tar.gzをダウンロードしましたが、Mono.Cecil.dllは表示されません。別のアセンブリのMono.Cecil名前空間は今ですか? – BuddyJoe

+1

Monocharge/1.0/Mono.Cecil.dll –

0

コメントを参照してください。私はあなたがリフレクションを通して名前空間の使用を理解できるとは思わない。 System.CodeDomを見てみてください。それはコードを解析するのに役立ちます。

+0

私はSystem.IOが使用されていたが、System.IO.Fileクラスが使用されていることに興味はありません。 – BuddyJoe

+0

私は、答えが間違っているとは思わないが、それに否定的なスコアを与えることの正当性です。私はこれを0にするようにupvotedしました。 – viggity

1

これはMono Cecilです。 Cecilを使用すると、すべてのクラス、メソッド、およびIL命令(すべてのメソッド呼び出しを含む)さえも列挙できます。

+0

monocharge-20090414.tar.gzをdailybuildsからダウンロードしましたが、Mono.Cecil.dllは表示されません。別のアセンブリのMono.Cecil名前空間は今ですか? – BuddyJoe

1

私はどこ覚えていないが、私はこのコードの便利な一枚を見つけました:

http://gist.github.com/raw/104001/5ed01ea8a3bf7c8ad669d836de48209048d02b96/MethodBaseRocks.cs

それはILByteArrayInstructionにオブジェクトを解析しMethodInfo/ConstructorInfoに拡張メソッドを追加します。

だからこれで、あなたはそのMethodInfo/ConstructorInfo上のすべてのInstructionをループその後、アセンブリ内のすべてのMethodInfo/ConstructorInfoをループ可能性があり、それらのInstructionオブジェクトのいずれかがどのMemberInfoのインスタンスであるOperandが含まれているかどうかを確認いずれかのクラスに等しい​​があります。

+0

私はそれがから来ると思うhttp://evain.net/blog/articles/2009/04/30/reflection-based-cil-reader –

0

.NET Reflectorこれやこれに近いものを実行できます。先日、特定のタイプがどこで使用されたかを調べました。

ReSharperもお役に立ちます。私はいつも自分のシンボルでこれをやっています - .NET Frameworkタイプでも動作すると思います。

3

素晴らしいNDependツールは、この種の依存関係情報を提供します。

はNDependの中で、あなたのDLLをロードし、どちらかあなたが欲しいものを見つけるためにGUIを使用するか、または以下のCQLクエリ:

SELECT TYPES WHERE IsDirectlyUsing "System.IO.File" 

、あなたがこれを使用するすべてのタイプのリストを取得する必要があります。

+0

hmmm私は彼らがボンネットの下でそれをやっているのだろうか。 +1 – BuddyJoe

+2

彼らはMono.Cecilを使用します。 –

+2

のような間接的な依存関係もあります。 "System.IO.File" Isuching Is "System.IO.File" を使用して、System.IOを使用してCを使用してBを使用するAのようなクラスを取得します。ファイル –