2012-10-26 51 views
0

我有一個可執行文件,比如abc.exe,它引用a.dll(與可執行文件相同的文件夾),b.dll(隨機文件夾中)和c.dll(隨機文件夾中)。使用System.Diagnostics.Process來反映引用的程序集?

但是,這些DLL不一定與可執行文件(或GAC)位於同一目錄中,這是我無法做的任何事情。

我試過使用System.Reflection.Assembly來試圖找到abc.exe使用的所有引用程序集。

foreach (AssemblyName an in assembly.GetReferencedAssemblies()) 
{ 
    Assembly.Load(an); 
} 

這似乎是加載可執行文件目錄(a.dll)中的程序集,但並不出人意料地拋出其他文件沒有發現異常。

我的想法是使用的System.Diagnostics.Process加載過程,然後反思的過程,因爲這應該告訴我在哪裏可以找到B.DLL和c.dll(?)

不過,我不不知道如何去做。這是否可能,如果是這樣,那該怎麼辦?謝謝!

+0

如果exe或dll的分發者沒有將依賴關係放在相同的位置或GAC中作爲調用它們的文件,那麼應用程序可能會從dll或exe中使用Assembly編碼的指定位置動態地加載它們解決...如果是這種情況,我懷疑你會通過反射找到位置... – devHead

+0

這是正確的唐,有一段代碼捕捉程序集沒有發現異常(不知道它被稱爲是什麼)和引用到一個文本文件來查找特定的位置。 我不想做的就是依賴這個文本文件。在這種情況下不可能嗎? – r3su

+1

你看到了嗎? http://msdn.microsoft.com/en-us/magazine/cc163641.aspx – devHead

回答

0

因此,原來這可以用System.Diagnostic.Process進行,例如:

public void findModules(string executablePath) 
    { 
     Process process = new Process(); 
     process.StartInfo.FileName = executablePath; 
     process.Start(); 
     process.WaitForInputIdle(); 
     System.Threading.Thread.Sleep(10000); 

     ProcessModuleCollection mods = process.Modules; 

     foreach (ProcessModule m in mods) 
     { 
      Console.WriteLine(m.ModuleName + ":" + m.FileName); 
     } 
    } 

模塊名在哪裏給你的程序集的名稱和文件名給你正確的裝配路徑,無論它在哪裏是(在網絡上,在C:\ Windows等)

但是,我無法弄清楚當一個可執行文件完成加載所有模塊時如何'檢測'。如果我刪除了睡眠線,我只能看到部分模塊列表,我想這些模塊是通過時間過程加載完成的。模塊被調用。

相關問題