2010-03-06 81 views
5

在我的ASP.NET MVC應用程序,我有以下設置:當我加載程序集時會發生什麼?

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;extras"/> 

我曾引用坐落在享有extras文件夾組件和他們完美地工作(使用<%@ Import Namespace="myNameSpace" %>)。

我的問題

  1. 時會發生什麼該行被稱爲?
  2. 程序集在哪裏加載?
  3. 爲什麼我無法用新版本覆蓋位於extras文件夾中包含myNameSpace的程序集? (我得到一個錯誤,說該程序集在另一個程序中「打開」)
  4. 有沒有辦法在不重啓應用程序的情況下用新版本覆蓋程序集?

回答

5

1)導入在運行時實際上沒有做任何事情。這是一個編譯時的便利,只是讓您使用它們的非限定名稱(例如Environment)而不是System.Environment來引用類型。

2)使用常規裝配探測規則加載組件。 CLR在之前檢查各個位置這些專用探測路徑,因此記住這一點非常重要。如果您引用一個強名稱的程序集並希望在專用探測路徑中找到該程序集,那麼首選GAC中具有相同強名稱(名稱,版本,公鑰等)的程序集。這有時會導致意外的行爲,通常是由於您的AssemblyInfo.cs中的程序集版本硬編碼而導致的,並且忘記更新它。

3)加載完成後,如果不卸載AppDomain,則無法卸載程序集。但ASP.NET使用「影子複製」,這意味着程序集在加載之前被複制到臨時路徑。這應該使原始組件解鎖並能夠被覆蓋。關於我的頭頂,我不確定爲什麼你會得到關於鎖定程序集的錯誤。在正常的Windows應用程序中,這將是完全正常的和預期的。但是,ASP.NET的設計使您可以在應用程序運行時覆蓋內容,代碼,程序集等,這會導致#4。

4)在實踐中,沒有。由於程序集無法卸載,因此如果未重新啓動Web應用程序,則無法升級程序集。從技術上講,你可以加載一個程序集的多個版本,但這不會給你想要的結果。任何編譯時引用仍會引用舊程序集,如果您嘗試使用新程序集,會得到各種無效的轉換異常。但正如我在#3中用ASP所說的那樣。NET升級程序集應該像替換文件一樣簡單,並且應該會自動發生。您不必手動重新啓動IIS或工作進程。

以下鏈接可能會引起您的興趣。

How the Runtime Locates Assemblies
Best Practices for Loading Assemblies
Shadow Copying Assemblies
Unloading Assemblies - Suzanne Cook

UPDATE 讀多一點影子複製後,我想你可能會看到鎖定組件的問題在其他文件夾的原因是該ASP.NET可能只爲shadow copying指定「bin」文件夾。

0
  1. 我想這是一樣的在C#using語句,就基本意味着該命名空間中的類,現以夜器頁面中使用。
  2. 該組件將被加載到內存可能是由aspnetwp.exe過程
  3. 如果組件目前正在使用,您將收到此錯誤信息
  4. 重新啓動是我知道這樣做的最安全的方式,你可以使用依賴注入或後期綁定來實現相同的結果。我只是想知道爲什麼你想在應用程序運行時切換程序集?
+0

#4:用更新後的版本替換它。這是可能的,而其運行? – Omar 2010-03-13 02:02:37

+0

如果你使用依賴注入和程序對接口,你可以很容易地做到這一點。 – Burt 2010-03-13 14:15:42

+0

你能否詳細說明? – Omar 2010-03-14 04:35:58

相關問題