簡體   English   中英

.NET / C# - Reflection - System.IO.File曾經使用過

[英].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在組裝,然后在每次循環InstructionMethodInfo / 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM