2009-08-27 169 views
17

我正在研究一個簡單的類瀏覽器對話框,該對話框允許用戶打開程序集並從中選擇靜態方法。但是,在某些情況下程序集的依賴關係丟失。在ReflectionOnlyLoad期間忽略缺失的依賴關係

由於我只需要方法名稱而不是其完整的原型,有什麼方法可以通過調用Assembly.ReflectionOnlyLoadFrom時引發的FileNotFoundException?我目前正在處理AppDomain.ReflectionOnlyAssemblyResolve但如果我返回空值然後我得到以下消息一個FileLoadException:

無法解析依賴於組裝「...」,因爲它沒有被預裝。在使用ReflectionOnly API時,必須通過ReflectionOnlyAssemblyResolve事件按需預加載或加載相關程序集。

我知道這一定是可能的,因爲.NET Reflector允許您跳過未解決的依賴關係。不過,我開始認爲Reflector可能會手動解析程序集,而不是將其加載到CLR中並使用標準反射。也許它使用Mono項目中的Cecil之類的東西。

+0

我懷疑反射器是使用塞西爾 - 它早於它,並從內部MS來了。我也懷疑它使用CCI。 Methinks Lutz只是一個上帝,他將所有這些東西都放在了睡眠中(儘管他最後很累了)! – 2009-08-27 07:48:25

回答

3

我想嘗試Cecil如果你打算用程序集進行非平凡的工作。還有MS CCI。 (我不是100%肯定這些工作中有一些缺少工作,但他們肯定是這個領域的好工具,如果他們沒有,我會感到驚訝)

如果你真的需要去金屬,你無法擊敗這個Asmex tutorial and sample,這應該defintely工作或讓你解決它。

+0

Asmex教程看起來很有趣,我得試試看。 – 2009-08-28 07:00:06

1

我相信Reflector會自己完成解析/加載 - 我回頭看了一下它的源代碼(通過使用Reflector本身:p),並看到大量與assembly相關的類,它們似乎被解析爲巨大的樹結構。

您可以隨時向Red Gate/Rutz Loeder發送電子郵件並要求他們進行確認。 :)

3

這會忽略你缺少的依賴關係:

 static void Main(string[] args) 
     { 
      AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); 
      Assembly assembly = Assembly.ReflectionOnlyLoad("foo"); 
      foreach (Type t in assembly.GetTypes()) 
      { 
       Console.WriteLine(t.FullName); 
      } 
     } 

     static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) 
     { 
      return System.Reflection.Assembly.ReflectionOnlyLoad(args.Name); 
     } 
+2

這不適合我。它仍然搜索缺失的依賴關係。 – Jonn 2015-11-18 09:02:07