2013-10-25 57 views
1

與MEF用戶的常見問題相反,我並不想弄清楚爲什麼我用MEF 加載的程序集的依賴關係不是已解決。我正在解決相反的問題 - 試圖找出爲什麼加載依賴項爲什麼使用MEF時會成功加載程序集引用?

這種情況是,我有一個ASP.NET應用程序,它使用MEF來動態加載位於應用程序目錄之外的擴展程序集。在我用MEF探測的不同目錄中可能存在多個版本的相同擴展程序集,每個目錄都有其自己的一組依賴關係,並且這些依賴關係可能是單個程序集的多個版本(即擴展A.dll,1.0.0.0已依賴關係D.dll,1.0.0.0和擴展B.dll,2.0.0.0具有依賴關係D.dll,2.0.0.0)。

它的工作原理是,所有的擴展及其所有依賴都被正確加載。我不知道爲什麼。我在我的web.config文件中沒有特殊設置。它在official documentation on assembly resolving它說它應該工作?它沒有說任何關於查看請求程序集所在的同一個目錄的信息。

我希望Fusion Log Viewer能告訴我運行時如何查找依賴關係,但即使它顯示了給定依賴關係的所有不同版本的綁定請求,當我點擊它查看完整日誌時,我只看到失敗的綁定(是的,I have it set to log all binding requests,不只是失敗的)。

任何人都可以指出我的正式文件的部分解釋爲什麼這種情況下工作?

+0

他們不在GAC中。當我在'Debug' - >'Windows' - >'Modules'中看到加載的模塊時,我可以看到它們是從MEF加載的程序集駐留在相同的目錄中加載的。 – twoflower

回答

1

MEF的主分辨率取決於使用的ComposablePartCatalog。例如,如果您使用DirectoryCatalog,指定目錄中的所有程序集都會被探測並找到。

通過查看CompositionContainer,您應該能夠找到適當的目錄,而這些目錄又應該提供一些有關爲什麼這些部分正確組成的細節。

它也有可能是你的依賴被發現由於"Other Locations Probed"定義的規則:

如果一個組件使用的LoadFrom方法來引用另一個組件,調用組件的位置被認爲是一個提示關於在哪裏找到引用的程序集。如果找到一個匹配,那個程序集就會被加載。


如果您使用的是DirectoryCatalog找到一個目錄中的組件,它在內部加載該文件夾中的每個組件。當構建DirectoryCatalog時,這將導致您的所有依賴關係也被加載到進程中。

+0

謝謝里德。是的,我使用了「DirectoryCatalog」。擴展程序集不使用'LoadFrom',它們的依賴關係是普通的靜態引用。關於'DirectoryCatalog' - 是否在試圖解決它們的過程中加載的依賴關係(我不會說),還是隻是因爲MEF需要檢查它們是否導出我感興趣的某些接口而加載的? – twoflower

+0

@twoflower我相信(在這裏不是100%肯定)他們會被加載,因爲依賴是通過'LoadFrom'加載的,而這又會導致他們的目錄成爲探索提示。 –

+0

你的意思是MEF明確調用'LoadFrom'?我生活在這樣一種印象中,即MEF沒有對定位依賴關係做任何特殊的事情,並且多次提到它。我要檢查MEF的源代碼,看看我能不能找到它。 – twoflower

相關問題