2015-09-10 47 views
0

我一直在通過C++/CLI尋找與單元測試和託管/本地interop相關的問題。細節並不重要,所以我不會在填補他們除非問,但情況可以如下蒸餾水:默認AppDomain與新AppDomain的不同依賴解析行爲加載程序集

兩個組件,給他們打電話庫和DEP,在同一個目錄中,命名爲D.庫取決於通過裝配參考Dep。我們正在運行在一個不同的,不相關的目錄中的應用程序中。應用程序創建一個新的AppDomain,並將ApplicationBase設置爲目錄D,加載Lib程序集,並嘗試通過反射構造一個類型。

由於庫的模塊構造我們將轉換到默認的AppDomain並加載引用的程序集德普的一部分。由於缺省AppDomain的ApplicationBase不是目錄D,因此無法解析Dep,引發FileNotFoundException,並且加載Lib程序集失敗。

這都有道理 - 費解,因爲它可能是,我們試圖加載程序集,這不是大會決議路徑上對當前的AppDomain,但失敗了。

,但如果我在默認的AppDomain,而不是創建一個新的AppDomain運行這整個過程中,沒有失敗。即使通過目錄D不是應用程序庫,Lib程序集也被加載,並且實例化其一個類的代碼正確運行。模塊構造函數代碼仍然應該在默認的AppDomain中運行,儘管它不需要轉換到它。

在我看來,第二種情況應該像第一種情況一樣失敗。這兩種情況之間的裝配參考解決過程有什麼不同?

+0

使用Fuslogvw.exe獲取洞察。記錄所有綁定。 –

+0

偉大的建議,感謝您指向我的實用程序。我會檢查出來並報告。 – rationull

+0

我一直無法從Fusion日誌中獲得任何有用的信息。在成功或失敗的情況下,Dep程序集根本沒有日誌條目。 Lib程序集的日誌條目在成功案例中有一些內容,但在故障情況下,它似乎很早就出現故障,可能是因爲實際加載失敗。儘管我期望至少看到失敗的程序集本身,這可能會提供一些見解。 – rationull

回答

0

OK,我找到了我經的the MSDN page "How the Runtime Locates Assemblies"一個更完整的閱讀比我以前做過前失蹤。最後一節「探測到的其他位置」概述了在解析被加載程序集的引用時,加載程序集的位置被用作提示引用程序集的位置的提示。

基於我所看到的行爲,我認爲我們可以推斷提示信息是AppDomain特定的,這樣在觸發原始程序集加載的AppDomain之外不會考慮提示。

我驗證了這一點與我的測試項目 - 如果引用的程序集不切換到那麼默認的AppDomain它正確加載。所以這不是默認的AppDomain特殊行爲,它是一般的AppDomain限制行爲。

相關問題