2011-03-10 42 views
0

我試圖讀取已知路徑中的一個dll文件的所有依賴關係。要做到這一點,我使用反射,因爲這代碼所示:使用反射來處理依賴關係

 For Each AsmName As AssemblyName In asm.GetReferencedAssemblies() 
     Try 
      Log += AsmName.Name & " : " & [Assembly].ReflectionOnlyLoad(AsmName.ToString).Location & vbCrLf 
     Catch ex As Exception 
      Log += AsmName.Name & " : NOT FOUND." & vbCrLf 
     End Try 
    Next 

爲了驗證這一點,我已經開發了VB NET一個dll從我做的其他的dll文件的幾個dependeces。

當我通過文件路徑時,我可以檢測到所有依賴於該文件的程序集。但是當我嘗試恢復依賴文件的文件路徑時,我可以找到所有依賴項的所有文件路徑,除了我製作的dll文件。

當我跑我得到以下日誌結果代碼:

mscorlib程序:C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ mscorlib.dll中 Microsoft.VisualBasic程序:C:\ WINDOWS \ assembly \ GAC_MSIL \ Microsoft.VisualBasic \ 8.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualBasic.dll System.Xml.Linq:C:\ WINDOWS \ assembly \ GAC_MSIL \ System.Xml.Linq \ 3.5.0.0__b77a5c561934e089 \ System.Xml .Linq.dll 系統:C:\ WINDOWS \ assembly \ GAC_MSIL \ System \ 2.0.0.0__b77a5c561934e089 \ System.dll IM2_DataFile:NOT FOUND。 System.Data:C:\ WINDOWS \ assembly \ GAC_32 \ System.Data \ 2.0.0.0__b77a5c561934e089 \ System.Data.dll IM2_DataRow:NOT FOUND。 System.Drawing:C:\ WINDOWS \ assembly \ GAC_MSIL \ System.Drawing \ 2.0.0.0__b03f5f7f11d50a3a \ System.Drawing.dll IM2_DataProviderTools:NOT FOUND。 System.Windows.Forms:C:\ WINDOWS \ assembly \ GAC_MSIL \ System.Windows.Forms \ 2.0.0.0__b77a5c561934e089 \ System.Windows.Forms.dll Telerik.WinControls.UI:C:\ WINDOWS \ assembly \ GAC_MSIL \ Telerik.WinControls.UI \ 2009.2.9.729__5bb2a467cbec794e \ Telerik.WinControls.UI.dll IM2_DataRowPanel:NOT FOUND。 Telerik.WinControls.GridView:C:\ WINDOWS \ assembly \ GAC_MSIL \ Telerik.WinControls.GridView \ 2009.2.9.729__5bb2a467cbec794e \ Telerik.WinControls.GridView.dll IM2_Language_Controller:NOT FOUND。 System.Core:C:\ WINDOWS \ assembly \ GAC_MSIL \ System.Core \ 3.5.0.0__b77a5c561934e089 \ System.Core.dll Telerik.WinControls:C:\ WINDOWS \ assembly \ GAC_MSIL \ Telerik.WinControls \ 2009.2.9.729__5bb2a467cbec794e \ Telerik.WinControls.dll IM2_CommonTools:NOT FOUND。

所有以IM2_開頭的文件都是我想要的路徑文件。

我發現那些無法找到的文件有PublicKeyToken = null。我用這個Google搜索了,這是因爲我沒有在編譯時序列化類。

請任何人都可以幫我嗎?目標是獲取一個dll文件的所有依賴關係的所有文件路徑。

在此先感謝。

回答

0

它看起來像你試圖加載程序集上使用的程序集名稱(不是完整的文件/路徑的程序集)。 對於在GAC(全局程序集緩存)中註冊的程序集可以工作,但您的+程序集可能未在GAC中註冊,因此無法以相同的方式加載。 我將不得不挖掘一個如何通過實際文件名加載程序集的例子。

+0

你說得對。我想知道一個DLL使用的每個程序集的當前文件路徑。要做到這一點,只有我有集合GetReferencedAssemblies的AssemblyName。對於所有的GAC來說,沒有問題,但是與自定義的dll無法獲得文件路徑。目標是創建一個包含該dll所需的所有文件的包。 – Nemesys 2011-03-10 20:16:59

+0

我試圖用強名稱創建dll以填充PublicKeyToken字段,因爲我懷疑問題可能是所有的自定義dll都將此值設置爲null。但問題依然存在。 – Nemesys 2011-03-10 20:19:32