2010-11-02 72 views
1

我有一個DLL加載並由進程鎖定文件,我想用新版本更新它。我正在尋找一種替代方法來終止進程,在更新dll之前釋放文件鎖定。只要新實例化的程序拿起新的邏輯,現有的實時進程仍然使用舊版本就沒關係。我可以安全地重命名/移動一個進程已經加載的dll嗎?

看來,我可以簡單地重命名/移動DLL和現場過程似乎仍然運作良好。這樣做安全嗎?如果dll的代碼已經加載到進程中,那麼爲什麼仍然需要鎖定dll?

+0

我確信在Windows下這是不可能的。 Unix會讓你在加載時替換一個可執行文件(包括共享庫),但是這樣做是可行的,因爲操作系統在於你(它確實保留了原始文件,但沒有任何鏈接,新版本將通過鏈接顯示)。另一方面,Windows將不允許您打開文件進行寫入。這也是有道理的,因爲在幾乎所有可能的情況下,做這樣的事情一點也不「確定」。 – Damon 2013-06-23 18:42:43

回答

3

移動任何隨機應用程序使用的所有dll並不總是可行的。一些應用程序,如asp.net,使用了影子副本概念,他們實際上覆制了dll並使用副本讓您自由修改原始副本。在asp.net的情況下,如果你修改了原來的asp.net,將會自動使用新的dll關閉一個新的應用程序域,並正常關閉舊的。

如果您所指的應用程序對dll有鎖定,那麼您無法安全地更改它。

+0

如果應用程序在DLL上有一個鎖,那麼您根本無法更改它! – EJP 2010-11-02 06:55:43

+0

Sam - 感謝您強調影子複製的概念,我認爲我的問題更具體,因爲我感興趣的過程不使用影子複製,所以我想了解爲什麼改變它並不安全? – Ying 2010-11-03 02:58:56

+0

EJP - 我測試了我的應用程序使用Process Explorer鎖定dll,但我仍然可以將鎖定的dll移動到別的地方。當我然後複製新版本時,我可以啓動我的應用程序的新實例並驗證它是否使用新版本。即使用這種方法我可以有兩個應用程序實例運行不同版本的基礎DLL。不知道我在這裏想念什麼? – Ying 2010-11-03 03:02:16

0

這取決於你的dll /應用程序。例如,dll可能使用共享內存,或實現進程間通信。新的dll版本可能會以不同的方式實施。所以一旦新實例啓動,內存中就會有兩個相沖突的版本。 所以它在一般情況下並不安全,但在您的特殊情況下它可能沒問題。

相關問題