2012-06-19 42 views
5

我很好奇,如果有可能確定一個Assembly是否引用了某個特定的類。我目前使用反射來加載程序集,然後我確定組件正在從我加載在組件中引用的內容:確定一個類是否被引用C#

foreach (var vReferencedAssembly in vSomeAssembly.GetReferencedAssemblies()) 

現在我知道組件引用什麼,我想挖成的vReferencedAssembly和確定這樣的事情發生:

File.Create(vSomeFile); 

用簡單的英語,我不想從提供給我,可能含有什麼,我認爲一個威脅列表加載程序集。所以我可能想要阻止可能操縱文件等等的東西。

+0

這是動態的要求嗎?如果它是靜態的,你可以使用反彙編器來查看引用的程序集以及它可能調用的內容。 – Josh

+0

我認爲如果可能的話,我寧願它是動態的。最好的選擇可能是使用反彙編程序。 – Tada

回答

2

我相信你正在尋找的是將程序集加載到僅反射的上下文中。這可以讓你將它們加載到一個安全的區域,在你檢查它們之前不會執行任何代碼。

參見:http://msdn.microsoft.com/en-us/library/ms172331.aspx

更新:您可以使用反射來看待事物一樣,變量,屬性,參數,返回類型但仍然不會幫你檢測是完全包含在一個方法中的惡意代碼。我的理解是,區分安全代碼和不安全代碼最好留給系統管理員。這些應用程序與PC上的受保護位置存在隱含的信任關係。 IE:全局程序集緩存,當前工作目錄或由您的應用程序確定的某個固定路徑。 PC然後只授予管理員在此位置管理程序集的能力。

更新2:您也可以考慮在其自己的應用程序域中運行此潛在的不安全代碼。在這裏你可以設置什麼是允許的,什麼不是。見http://msdn.microsoft.com/en-us/library/bb763046.aspx

更新3:雖然我仍然認爲使用適當的權限在其自己的應用程序域中加載不受信任的代碼是最乾淨的方法,但可以根據此question詢問在運行時內部引用的方法。它的要點是使用反射來獲得方法(MethodBody.GetILAsByteArray)的原始IL字節,並用您選擇的IL解析器進行分析。

+0

我不知道這是我可能要找的。我將如何檢查大會以確定是否引用或調用了特定的類?例如: 我知道mscorlib(mscorlib.dll)包含File.Create,但這並不意味着我剛加載的程序集實際上引用了File.Create。我如何確定?如果有的話.. – Tada

+0

它看起來像反射可以標識方法參數或返回中使用的類,但如果在方法的實際主體內引用,我將無法找到它... – Tada

相關問題