2008-08-22 68 views
21

我的應用程序動態地從具體的子文件夾中運行時加載的程序集。這些程序集編譯時會依賴於其他程序集。運行時會嘗試從應用程序目錄加載這些文件。但我想把它們放到模塊目錄中。加載組件和它的依賴

有沒有辦法告訴運行時,該DLL是在一個單獨的子文件夾?

回答

18

一個不錯的方法我最近使用的是添加事件處理程序的AppDomain的AssemblyResolve事件。

AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 

然後在事件處理方法,你可以加載嘗試使用Assembly.Load,Assembly.LoadFrom覆蓋之一,從方法返回它來解決裝配。

編輯:

您更多的信息基於我認爲使用上述技術,專門解決一個組件引用自己是打算不重組你的應用程序工作的唯一真正的辦法。它給你的是CLR未能解決的每個程序集的位置都可以在運行時由你的代碼來確定和加載......我在類似的情況下對於可插入體系結構和程序集引用的完整性掃描工具。

+3

這種技術的一個很好的例子是應用程序LINQPad。它作爲一個單獨的exe文件發佈,因此所有庫都被包含爲嵌入式資源。有關代碼和http://www.linqpad.net/HowLINQPadWorks.aspx的信息,請參見http://www.albahari.com/nutshell/ch16.aspx。 – Pat 2012-07-20 20:45:36

4

可以使用<probing>元素清單文件來告訴運行時在其裝配的文件不同的目錄中查找。

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

例如爲:

<configuration> 
<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="bin;bin2\subbin;bin3"/> 
    </assemblyBinding> 
</runtime> 
</configuration> 
1

您可以使用應用程序配置文件中找到的<codeBase>元素。有關「Locating the Assembly through Codebases or Probing」的更多信息

那麼,加載的程序集沒有 應用程序配置文件。

那麼,如果你知道在運行時的特定文件夾,您可以使用Assembly.LoadFrom

+0

第一個鏈接提供「主題不再存在」。指定.NET 4.0提起這件事,但:[https://msdn.microsoft.com/en-us/library/15hyw9x3%28v=vs.100%29.aspx](https://msdn.microsoft.com/en -us /庫/ 15hyw9x3%28V = VS.100%29.aspx) – AnorZaken 2016-02-01 17:17:51

相關問題