有沒有辦法使用反射來完全「掃描」程序集以查看是否曾經使用過System.IO.File或System.IO.Directory?這些只是示例類。只是想知道是否有辦法通過反射(vs代碼分析)來做到這一點。.NET/C# - Reflection - 曾經使用過的System.IO.File
更新: 看評論
有沒有辦法使用反射來完全「掃描」程序集以查看是否曾經使用過System.IO.File或System.IO.Directory?這些只是示例類。只是想知道是否有辦法通過反射(vs代碼分析)來做到這一點。.NET/C# - Reflection - 曾經使用過的System.IO.File
更新: 看評論
正如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");
您可以通過Assembly.GetExecutingAssembly().GetReferencedAssemblies()
得到相關的組件列表。我不相信你可以通過反射來理解命名空間的使用。嘗試看看System.CodeDom。這可能會幫助你解析代碼。
我建議你看看Mono Cecil。使用Cecil,您可以枚舉所有類,方法甚至IL指令(包括所有方法調用)。
我從dailybuilds下載monocharge-20090414.tar.gz並沒有看到Mono.Cecil.dll。 Mono.Cecil命名空間是否在另一個程序集中? – BuddyJoe 2009-07-10 15:06:13
我不記得在哪裏,但我發現這個方便的一段代碼:
http://gist.github.com/raw/104001/5ed01ea8a3bf7c8ad669d836de48209048d02b96/MethodBaseRocks.cs
它增加了一個擴展方法MethodInfo
/ConstructorInfo
分析給ILByteArray
到Instruction
對象。
所以用這個,你可以循環遍歷組裝,然後在每一個Instruction
上MethodInfo
/ConstructorInfo
循環每MethodInfo
/ConstructorInfo
,並檢查是否有這些Instruction
對象包含Operand
這是一個MemberInfo
的一個實例,它有一個等於任一類。
我認爲它來自http://evain.net/blog/articles/2009/04/30/reflection-based-cil-reader – 2009-07-09 21:04:45
.NET Reflector可以做到這一點,或接近它。有一天,我檢查了一下特定類型的使用情況。
ReSharper可能也有幫助。我始終用我自己的符號來做這件事 - 我想這也適用於.NET Framework類型。
夢幻般的NDepend工具會給你這種依賴信息。
裝入DLL在NDepend的,要麼使用GUI來找到你想要的東西,或者下面的CQL查詢:
SELECT TYPES WHERE IsDirectlyUsing "System.IO.File"
,你應該得到所有使用此類型的列表。
嗯我不知道他們是如何做到這一點。 +1 – BuddyJoe 2009-07-09 21:09:43
那麼我沒有那麼感興趣,而是使用了System.IO類,但使用了System.IO.File類。 – BuddyJoe 2009-07-09 20:49:37
我不認爲只是因爲答案可能是錯的是給它一個負分的理由。我upvoted把它帶到0. – viggity 2009-08-03 13:16:23