2009-07-09 82 views

回答

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

您可以通過Assembly.GetExecutingAssembly().GetReferencedAssemblies()得到相關的組件列表。我不相信你可以通過反射來理解命名空間的使用。嘗試看看System.CodeDom。這可能會幫助你解析代碼。

+0

那麼我沒有那麼感興趣,而是使用了System.IO類,但使用了System.IO.File類。 – BuddyJoe 2009-07-09 20:49:37

+0

我不認爲只是因爲答案可能是錯的是給它一個負分的理由。我upvoted把它帶到0. – viggity 2009-08-03 13:16:23

1

我建議你看看Mono Cecil。使用Cecil,您可以枚舉所有類,方法甚至IL指令(包括所有方法調用)。

+0

我從dailybuilds下載monocharge-20090414.tar.gz並沒有看到Mono.Cecil.dll。 Mono.Cecil命名空間是否在另一個程序集中? – BuddyJoe 2009-07-10 15:06:13

1

我不記得在哪裏,但我發現這個方便的一段代碼:

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

它增加了一個擴展方法MethodInfo/ConstructorInfo分析給ILByteArrayInstruction對象。

所以用這個,你可以循環遍歷組裝,然後在每一個InstructionMethodInfo/ConstructorInfo循環每MethodInfo/ConstructorInfo,並檢查是否有這些Instruction對象包含Operand這是一個MemberInfo的一個實例,它有一個​​等於任一類。

+0

我認爲它來自http://evain.net/blog/articles/2009/04/30/reflection-based-cil-reader – 2009-07-09 21:04:45

0

.NET Reflector可以做到這一點,或接近它。有一天,我檢查了一下特定類型的使用情況。

ReSharper可能也有幫助。我始終用我自己的符號來做這件事 - 我想這也適用於.NET Framework類型。

3

夢幻般的NDepend工具會給你這種依賴信息。

裝入DLL在NDepend的,要麼使用GUI來找到你想要的東西,或者下面的CQL查詢:

SELECT TYPES WHERE IsDirectlyUsing "System.IO.File" 

,你應該得到所有使用此類型的列表。

+0

嗯我不知道他們是如何做到這一點。 +1 – BuddyJoe 2009-07-09 21:09:43

相關問題