2013-03-28 38 views
1

設置AssemblyName.CodeBase是否強制將程序集加載到LoadFrom上下文中?設置AssemblyName.CodeBase是否強制將程序集加載到LoadFrom上下文中?

我正在研究一種插件系統。我需要能夠使用Type.GetType等...在我的代碼中的任何地方,我不應該知道該類型是否來自一個插件的DLL或不。

我的插件位於我的應用程序的bin目錄(windows/web)下的一個文件夾中,每個插件位於它自己的文件夾中。

我將探測路徑設置爲Plugins(或bin; bin \ Plugins for web),即使它們在子文件夾中沒有任何區別。

我載入我的插件這樣

pluginInfo.EntryAssemblyName = new AssemblyName(myAssemblyName); 

pluginInfo.EntryAssemblyName.CodeBase = assemblyPath; 

pluginInfo.EntryAssembly = Assembly.Load(pluginInfo.EntryAssemblyName); 

注:PluginInfo僅僅是讓我的插件的狀態的類。

我想知道,因爲我設置了程序集名稱的CodeBase屬性Assembly.Load能夠找到我的程序集,即使它不在探測路徑中,是否意味着程序集會在默認上下文中加載或加載從上下文?

AssemblyResolve事件在進入程序集之後再次引發是否正常?

回答

0

通過使用AssemblyName(string) .ctor 設置AssemblyName.CodeBase財產,你不能確保Assembly.Load(AssemblyName)將加載在默認情況下。它將首先嚐試在默認上下文中加載它,但如果失敗,它將使用代碼庫將其加載到LoadFrom上下文中。有關此主題的更多信息,請參閱Suzanne Cook's blog entry

可以肯定的是,大會將在默認的情況下被加載,設置AssemblyName.CodeBase屬性和一個System.IO.FileLoadException準備。如果對象構造成功(沒有拋出異常),那麼程序集就會被加載到默認的上下文中。

LoadFrom上下文的優點是,如果它們存在於同一路徑上,則可以解析加載程序集的依賴關係。另一方面,只有在GAC上存在AppDomain.BaseDirectoryAppDomain.RelativeSearchPath時,才能解析在默認上下文中加載的程序集。可能會引發AppDomain.AssemblyResolve事件,因爲在這些流行中無法找到加載的程序集的依賴關係。

+0

我的問題是,如果我沒有設置CodeBase屬性,它找不到Assembly,因爲它位於Plugins文件夾的子文件夾中,並且此文件夾不在探測路徑中。是否可以在運行時設置探測路徑? –

+0

@Yann您可以在應用程序的配置文件中使用探測元素。 http://msdn.microsoft.com/en-us/library/823z9h8w.aspx –

+0

問題是,我不知道運行時間之前的文件夾,除非我的插件編輯我不太喜歡的配置文件。 –

相關問題