Zastępujesz pliki .dll podczas działania aplikacji?

18

Mam kilka serwerów gier, które używają określonego pliku .dll do uruchomienia. Czasami muszę zaktualizować serwery gier, ale nie chcę przerywać już uruchomionych gier.

Czy istnieje sposób na zastąpienie pliku .dll (jest on zablokowany przez system Windows), więc kolejne wystąpienia serwerów gry, które używają tego pliku, otwierają nową wersję, a stare nadal używają starej wersji tego pliku .dll, dopóki nie zostaną ponownie uruchomione ?

Czy bezpiecznie jest po prostu odblokować plik za pomocą jednego z narzędzi, które to robią i zastąpić go?


źródło
Być może nie twoja gra. Jednak Chrome robi aktualizację bez przerywania procesu. Niestety jest to specyficzne dla aplikacji. (Idź do %LocalAppData%\Google\Chrome\Applicationi powinieneś zobaczyć foldery, 26.0.1410.64które przechowują biblioteki DLL różnych wersji)
Alvin Wong
W zależności od oprogramowania może być możliwe zainstalowanie i uruchomienie dwóch lub więcej różnych instancji (w różnych lokalizacjach). Nieefektywne, ale być może wykonalne.
Harry Johnston,

Odpowiedzi:

23

Właściwie możesz i zwykle działa bez problemu (choć nie zawsze)

Zmieniasz nazwę pliku bez przenoszenia go i przenosisz nad nim nowy plik. Dzięki temu uchwyty pliku będą prawidłowe i będą działały, dzięki czemu wcześniej istniejące instancje będą nadal mogły poprawnie uzyskiwać dostęp do pliku, a nowe instancje (lub nowe uchwyty) przejdą do nowego pliku.

Oczywiście, jeśli program ponownie otworzy ten sam plik dll i oczekuje, że pozostanie dokładnie taki sam (na przykład, jeśli istnieją zasoby do załadowania z dll i że odniesienia do tych zasobów są wyodrębniane z kodu działającego podczas ładowania dll ), spowoduje to problem, ale to zdecydowanie nie jest norma.

Stephane
źródło
11

Nie. Mimo że biblioteka DLL może być całkowicie zmapowana do pamięci fizycznej podczas działania aplikacji, nie ma na to żadnej gwarancji. Część bibliotek DLL (a nawet plików wykonywalnych) można zmapować do pamięci RAM, podczas gdy inne bity pozostaną na dysku i można je później odczytać.

Zmiana pliku na dysku, gdy Windows ma jego fragmenty zmapowane w pamięci RAM, nie skończyłaby się dobrze. Windows blokuje go z ważnego powodu.

Edycja: Muszę coś wyjaśnić, ponieważ niektórzy ludzie wydają się być winni Windowsowi za to, co w rzeczywistości jest problemem projektowania aplikacji , a nie problemem projektowania systemu operacyjnego.

Można aktualizować biblioteki DLL używane przez aplikacje w systemie Windows bez przerywania procesu, ale aplikacja musi zostać napisana w taki sposób, aby można było zasygnalizować, że rozładuje zestaw, poczekaj na zakończenie aktualizacji, a następnie ponownie załaduj bibliotekę DLL. Nie ma to nic wspólnego z uruchomionym systemem operacyjnym. Jest to problem z projektem aplikacji.

Edycja: zapoznaj się również z odpowiedzią Stephane na możliwe rozwiązanie, które może działać, w zależności od tego, jak Twoja aplikacja reaguje na zmianę biblioteki DLL. Myślę, że zasługuje na aprobatę.

Ryan Ries
źródło
Czy istnieje sposób przeniesienia tego pliku do lokalizacji tymczasowej, aby można go było później usunąć, jednocześnie umieszczając nowy w jego starej lokalizacji (aby serwery, które uruchomią się później, będą korzystać z nowej biblioteki DLL)? A może uchwyt pliku jest powiązany z lokalizacją pliku?
To całkowicie zależy od tego, jak aplikacja jest napisana / jak korzysta z bibliotek DLL. Spójrz na odpowiedź Grega Askewa. Jeśli uchwyt pliku jest otwarty, niewiele możesz z tym zrobić. Możesz siłą zamknąć uchwyt pliku, ale prawie na pewno zawiesisz przynajmniej swoją aplikację, jeśli nie cały system operacyjny.
Ryan Ries
Więc jaki jest ten „dobry powód”? Jak dotąd twoja odpowiedź nie zawiera przekonującego powodu, dla którego Microsoft nie oferuje możliwości wymiany na gorąco.
Konrad Rudolph
2

Nie, nie należy majstrować przy istniejących uchwytach plików.

Jeśli możesz przejąć kontrolę nad ładowaniem zestawu i określić, że jest otwierany za pomocą FileShare.Delete, powinna istnieć możliwość zmiany jego nazwy. Istniejące procesy będą nadal odwoływać się do zespołu o zmienionej nazwie.

/programming/7147577/programmatically-rename-open-file-on-windows .

Greg Askew
źródło
2
Z mojego doświadczenia wynika, że ​​w większości przypadków (cóż, w każdym razie ponad połowę czasu) możesz zmienić nazwę (ale nie usunąć) biblioteki DLL bez majsterkowania przy aplikacji.
Harry Johnston,
@HarryJohnston: Tak, wydaje się, że mogę zmienić nazwę .dll, nawet jeśli jest w użyciu. Chyba zrobię to teraz.
1

Nie, niestety nie jest to możliwe.

Przykro nam, chyba że jest późne wiązanie, co oznacza, że ​​aplikacja używa tej biblioteki DLL, gdy uruchamia część kodu w tej bibliotece, ale nadal nie jest niezawodna.

Danila Ladner
źródło
1

Możesz spojrzeć na działanie hostowanego procesu asp.net i opracować coś podobnego.

Pobiera całą aplikację internetową i przenosi ją do tymczasowej lokalizacji, z której aplikacja jest faktycznie ładowana. Następnie pozostawia proces monitorowania zmian w oryginalnym folderze, po wykryciu uruchamia nowe wystąpienie aplikacji w nowej tymczasowej lokalizacji i rozpoczyna przekierowywanie nowych żądań do tej aplikacji. Stara aplikacja jest następnie zrywana po zakończeniu oczekujących żądań.

(Nitpicking, tak, to uproszczony widok rzeczy, w większości przypadków IIS ustawia w kolejce żądania, aż nowa aplikacja będzie w stanie przejąć kontrolę)

Thomas James
źródło
0

Około dekady temu byłem szczęśliwym użytkownikiem strony http://www.eggcentric.com/ISAPILoader.htm, która na żywo zamieniała dll ISAPI IIS. Pan Egg nadal wspiera swoje rozwiązanie FOSS.

jkellydresser
źródło
0

Instalator NSIS ma jedną opcję Przenieś do temp. Przy ponownym uruchomieniu komputera, system operacyjny zaznacza plik, aby przejść do innej lokalizacji przy następnym uruchomieniu, przy następnym uruchomieniu komputera te oznaczone pliki automatycznie przenoszą się do nowej lokalizacji, którą wcześniej wybrałeś. Krótkie wyszukiwanie w tym sprawi, że będziesz szczęśliwy pod tym względem.

Shashank Kandhawe
źródło
Możesz podać pełną odpowiedź w odpowiedzi, zamiast informować PO, aby szukał rozwiązania. Nie byłoby go tutaj, żeby zapytać, czy już znalazł rozwiązanie. Dzięki.
John aka hot2use,