2012-06-01 64 views
1

背景
首先,我確實在其他地方尋找解決辦法,發現this solution,但這並不能解決我的問題。如何讓我的程序從另一個文件夾引用程序集?

我在Visual Studio的主項目中引用了一個程序集,但我需要從我的項目外部加載它,而不是在子文件夾中加載它。我可以調用加載程序集...

System.Reflection.Assembly.LoadFrom(myExternalAssemblyPath); 

...但該程序將無法運行,並給了我以下錯誤:

FileNotFoundException was unhandled

Could not load file or assembly 'MyAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.

我之前向大會沒有呼叫調用來加載它,但程序仍然期望,甚至在它甚至在明顯進入Main函數之前,該DLL就在該程序的文件夾中。

Quesiton:
如何讓我的程序,在Visual Studio中仍引用此,但實際上運行該程序時,從不同的位置加載它?是否有指示我需要指定某處告訴程序等待加載它?有其他解決方案嗎?

注:我不想將文件夾和DLL添加到PATH變量。這不是一個可行的解決方案。

+0

如果期望它在Main方法之前,那麼:不要在Main方法中使用該程序集(JIT在方法啓動之前發生) - 但是,您所描述的將與常規裝配探測規則對抗 - 是否真的值得? –

+0

@MarcGravell:是的,我需要這樣做,因爲我們最終會在其他類似的程序中引用這個相同的庫。 –

+0

讓我問一下這個問題:「是嗎?」您可以允許多個文件副本 - 它使部署變得更容易。或者,考慮GAC。 .net設計期望在本地(每個應用程序複製)庫或GAC中的中央共享庫。 –

回答

3

訣竅是在您的應用程序域中實現AssemblyResolve事件。

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

這是你幫助運行時找到它會嘗試加載組件並不能找到使用默認的搜索戰略。這應該是直截了當的,運行時會爲每個缺失的程序集調用你的處理程序,並且你只需從自定義路徑加載它並從處理程序返回。需要記住的一點很重要:在.NET中,JIT在調用之前將方法(本地代碼)完全處理。如果您的Main方法使用任何類型或方法從您試圖加載的程序集,它將不會執行Main。因此,Main應該只有設置程序集加載。所有其他代碼(特別是涉及有問題的程序集的代碼)必須將移動到另一個方法,以便分別得到JIT-ted。

+1

這是行不通的,直到Main()運行之後才能訂閱該事件,但他沒有那麼遠 –

+0

Hans是正確的,我已經嘗試過了 –

+0

這就是 –

相關問題