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?
%LocalAppData%\Google\Chrome\Application
i powinieneś zobaczyć foldery,26.0.1410.64
które przechowują biblioteki DLL różnych wersji)Odpowiedzi:
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.
źródło
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ę.
źródło
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 .
źródło
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.
źródło
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ę)
źródło
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.
źródło
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.
źródło