2013-07-02 166 views
1

我們正在開發一個Web應用程序,它擁有大量的插件DLL文件。現在如何避免使用BuildManager.AddReferencedAssembly

,我們能夠載入我們需要的所有組件,但我們使用BuildManager.AddReferencedAssembly,而這樣做。我猜 - 這會導致一個小問題。

的問題是,我們需要更新這些DLL文件,無需重新啓動應用程序,但同時應用程序運行這些DLL文件被鎖定。

我們沒有使用這些dll文件的bin文件夾。我們使用的是2個不同的文件夾(第一個 - 〜/插件 - 由我們複製文件,第二個 - 〜/ PTEMP - 文件夾用於複製位於plugins文件夾下的文件,然後加載應用程序就像在bin文件夾中的)

正如您在應用程序正在運行時所瞭解的那樣,您可以覆蓋bin文件夾中的文件,這意味着可以在應用程序運行時覆蓋項目程序集。

經過一番研究,我發現,它可以通過在appdomainsetup使用私人文件夾的東西,但無法弄清楚如何。 (我們不希望再創建一個應用程序域,我們希望這些文件位於PTEMP文件附加到主域)

對不起我的英語不好,但是如果可以的話,請幫助我們。

順便說一句,這些dll文件中的一部分包含一些mvc區域。

我們正在使用.NET 4.5,4的mvc

如果有必要,我可以張貼一些代碼。

+0

順便說,我想通了,上的文件的鎖定可通過AppDomain.CurrentDomain.AppendPrivatePath(pluginsTempPath)引起;線。任何方式,我們不能覆蓋這些DLL文件在臨時插件文件夾中,我們需要。現在,無需重新啓動應用程序就可以更新dll。 – zokkan

+0

(評論問題超過12個月後):開始考慮將插件加載到他們自己的AppDomains中 –

+0

將插件加載到他們自己的應用程序域中是可能的,但是當數據在應用程序域之間傳遞時,您將產生序列化/反序列化成本。而不是「本地執行某些事情」的情況,它將變得更像是「調用遠程服務」。 – John

回答

-2

看來,要做到這一點的最好辦法是重新啓動應用程序

+0

我想是的。因爲這些文件也被mvc本身使用。 – zokkan

+0

這並不真正回答他的問題。 – John

0

下面是我們正在做的:

var shadowCopyDirectories = AppDomain.CurrentDomain.SetupInformation.ShadowCopyDirectories; 
     var newShadowCopyDirectories = shadowCopyDirectories 
           + System.IO.Path.PathSeparator 
           + HostingEnvironment.MapPath("~/App_Data/DynamicAssemblies/"); 
#pragma warning disable 618 
     // Disabled compiler warning 
     AppDomain.CurrentDomain.SetShadowCopyPath(newShadowCopyDirectories); 
#pragma warning restore 618 

Basicly使組件的影子複製指定目錄臨時ASP.NET這意味着這些程序集不會被鎖定。試圖找到這樣做的非過時的方式,但經過30分鐘搜索後,我空了,沒有時間進一步搜索。

你仍然無法避免重新啓動應用程序,原因是:

1)不能從當前運行的應用程序,這意味着你會被留下的垃圾在內存中,可以面對一個卸載「老」組件那種DLL地獄由已經加載同一程序集的兩個版本(A EX類型從大會1起源,而B型從集B起源)

2)您需要一種方法來告訴BuildManager重新編譯所有

但最終你可能會更好地啓用影子複製,因爲當再循環時g,第二個工作進程可能會產生,而第一個工作進程會等待,直到第二個進程準備就緒,在這種情況下,您將無法更新這些「動態」程序集,直到完全停止應用程序池。