2017-03-08 63 views
1

我有一個程序集,名爲實驗室,它由作爲解決方案一部分的項目構建。此程序集包含一個對象,我想使用來自同一解決方案上的其他程序集的反射來訪問該對象。 在其他組件(被叫BL)我有以下代碼:未能加載程序集C#

Assembly assembly = Assembly.Load("Lab"); 

的問題是,它是扔FileNotFoundException除非我添加嘗試從實驗室組件發起的對象的行代碼中的任何地方。 就好像編譯器將實驗室程序集加載到Assembly.Load函數的可識別位置。

這確實讓我困惑, 我試圖通過全集名稱 而且還試圖組裝的絕對路徑傳遞給Assembly.LoadFrom但無濟於事,同樣的問題在所有情況下。

我試圖訪問對象槽反射而不是僅僅引用它的原因是因爲代碼是將被隔離的模塊的一部分。然後反射的DLL(在這種情況下Lab.dll)將在運行時動態傳遞。

解決方案

事實上,正如阿夫納解釋,我懷疑,大會並沒有複製到項目的文件夾,因爲沒有使用它的任何代碼。 進一步證明程序集丟失的是FusionLog中的Lordkain在註釋中提到的異常。

由於該項目的想法是在將來使用通過的Assembly Path,因此我剛剛採取了相應的措施,而不是Avner建議的解決方案。 因此,通過使用該組件的路徑,而不是程序集的名稱與方法:

Assembly.LoadFrom(*Assembly Path*); 

我工作圍繞缺少的裝配問題。

+0

對你有幫助https://indexoutofrange.com/Could_not_load_file_or_assembly_or_one_of_its_dependencies/ – lordkain

+0

你需要指定程序集名稱的長形式。例如'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' – DavidG

回答

1

檢出BL項目的輸出文件夾。很可能,你不會在那裏找到Lab.dll。這是因爲Visual Studio偶爾嘗試有幫助,發現沒有使用Lab.dll的可識別代碼,並且實際上並沒有將其複製到輸出文件夾。當您使用反射代碼時,靜態分析無法找到任何用法,並優化了參考。

這個答案解決了這個問題,雖然從不同的角度:

MSBuild doesn't copy references (DLL files) if using project dependencies in solution

因爲在你的情況你不必與二手引用的一個問題,但與動態加載,所以選項# 1是無關緊要的,你可能需要解決參考(注意:引用,不一定實例化)Lab.dll中的一個項目。

您可以通過從Lab.dll中獲取對象的類型(如鏈接的答案顯示)或訪問類的Static屬性(如果有)來完成此操作。醜陋,但有效。

相關問題