[英].NET / C# - Reflection - System.IO.File ever used
有沒有辦法使用反射來完全“掃描”程序集,以查看是否曾使用過System.IO.File或System.IO.Directory? 這些只是示例類。 只是想知道是否有辦法通過反射(vs代碼分析)來做到這一點。
更新 :見評論
正如湯米卡里爾所說, 塞西爾很容易做到。
using Mono.Cecil;
// ..
var assembly = AssemblyFactory.GetAssembly ("Foo.Bar.dll");
var module = assembly.MainModule;
bool references_file = module.TypeReferences.Contains ("System.IO.File");
奇妙的NDepend工具將為您提供這種依賴性信息。
在NDepend中加載你的dll並使用GUI來查找你想要的東西,或者下面的CQL查詢:
SELECT TYPES WHERE IsDirectlyUsing "System.IO.File"
你應該得到一個使用它的所有類型的列表。
我建議看看Mono Cecil 。 使用Cecil,您可以枚舉所有類,方法甚至IL指令(包括所有方法調用)。
我不記得在哪里,但我找到了這個方便的代碼:
http://gist.github.com/raw/104001/5ed01ea8a3bf7c8ad669d836de48209048d02b96/MethodBaseRocks.cs
它為MethodInfo
/ ConstructorInfo
添加了一個擴展方法,將ILByteArray
解析為Instruction
對象。
所以用這個,你可以遍歷每MethodInfo
/ ConstructorInfo
在組裝,然后在每次循環Instruction
上MethodInfo
/ ConstructorInfo
,並檢查是否有這些的Instruction
對象包含一個Operand
是一個實例MemberInfo
具有DeclaringType
是等於任何一個班級。
您可以通過Assembly.GetExecutingAssembly().GetReferencedAssemblies()
獲取依賴程序集的列表Assembly.GetExecutingAssembly().GetReferencedAssemblies()
。 我不相信你可以通過反射理解名稱空間的使用。 嘗試查看System.CodeDom。 這可能有助於您解析代碼。
.NET Reflector可以做到這一點,或者接近它。 有一天,我檢查了特定類型的使用位置。
ReSharper也可以提供幫助。 我一直使用自己的符號執行此操作 - 我認為它也適用於.NET Framework類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.