2009-07-31 13 views
11

Mamy minimalną wersję 'updater', która sprawdza zdalny adres URL pod kątem aktualizacji, pobiera je i zastępuje pliki na dysku przed uruchomieniem prawdziwej aplikacji. Jeśli jednak chcemy zastąpić EXE EXE, to AFAIK mamy dwie opcje:Najlepsza metoda implementacji oprogramowania samoaktualizującego się

1) Shadow Copying Assemblies przy czym .Net utworzy kopię w tle EXE (i wszelkich przywoływanych złożeń) i załaduje je tak, że nie Zespoły cienia można zastąpić i będą używane, gdy aplikacja zostanie uruchomiona.

2) Wskaż, które pliki zostaną zastąpione i zmień ich nazwy/przenieś na dysk. Wygląda na to, że Windows zezwala na zmianę nazwy/przenoszenie zablokowanych plików, dzięki czemu możemy przenosić pliki i kopiować je w nowych złożeniach. Ponownie, po kolejnym uruchomieniu aplikacji uruchomimy nowe złożenia. To podejście jest wymienione here

Czy ta druga metoda jest zalecaną metodą? Czy są jakieś pułapki w tym podejściu?

Odpowiedz

6

Co z wdrożeniem ClickOnce?

+0

Jest to prawdopodobnie najlepsza opcja, ponieważ powinna pomóc w standaryzacji aktualizacji/obniżenia poziomu bezpieczeństwa wymagane w systemie Windows Vista i przyszłych wersjach systemu Windows –

+0

Na razie nie używamy ClickOnce, ponieważ łatwiej było korzystać z opisanej przeze mnie metody kopiowania plików, a także mamy zmodyfikowany proces aktualizacji bazy danych SQL, która zostanie zainstalowana wraz z aplikacją. ClickOnce to jednak oficjalne rozwiązanie Microsoftu, a my zajmiemy się nim w przyszłości, dlatego wybieram to jako akceptowaną odpowiedź. Dzięki. – redcalx

+1

ClickOnce jest koszmarem, ponieważ jest nieelastyczny, zbyt skomplikowany, wydaje się nie mieć silnej pomocy Microsoft i jest bardzo specyficzny dla scenariuszy wdrożenia na użytkownika. – jpierson

6

Inna opcja: gdy główna aplikacja chce się zaktualizować, uruchamia nowy proces aktualizacji, a następnie zamyka się. Proces odradzania w międzyczasie czeka na zamknięcie głównej aplikacji (proces zniknie), a następnie aktualizuje wszystkie niezbędne pliki (w tym .exe). Następnie po prostu ponownie uruchamia główną aplikację i wychodzi z procesu aktualizacji.

+0

Brzmi rozsądnie – jpierson

+0

@jpierson i działa :). Używam tego podejścia od 2 lat dla mojej własnej aplikacji. –

8

Używam drugiej metody bez żadnych problemów. Tylko upewnij się, że pobrany zestaw został poprawnie pobrany. ;)

Run Update.exe i niech to zrobić:
1. Pobierz nowy update.exe jak update.ex_
2. zmienić nazwę Update.exe do update.bak (można go zmienić, ale nie nadpisać)
3. zmienić nazwę update.ex_ do update.exe
4. restart update.exe

Im robi to bez żadnych problemów w ogóle więc jej przetestowanych i działają w środowisku na żywo w około 400 klientów tak jak mówimy.

+0

Jak zrestartować uruchomiony program? czy istnieje łatwy sposób? – chillitom

+0

@chilitom: process.start (Application.Startupath i "\ myprogram.exe"): koniec – Stefan

+0

+1 za komentarz w kroku 2 – jpierson

1

Sposób, w jaki robią to z naszej in-house aplikacji:

Aplikacja punktów skrót do Updater.

  1. Wyświetlane są powiadomienia o przestojach/komunikaty o ostatecznych terminach.
  2. Aktualizator wykonuje sprawdzenie aktualizacji.
  3. Aktualizacje są pobierane i instalowane.
  4. Uruchomienie aplikacji.
  5. aplikacja wykonuje aktualizację Updater (sprawdza Updater.fp7.gz w folderze/update)

Edit: Ups - brakowało krok 5.

+2

Dobrze przeczytałeś pytanie? Jak aktualizujesz sam aktualizator w swoim scenariuszu? –

3

W projekcie pracowałem, tam gdzie 2 pliki wykonywalne. Nazwijmy je A i B.

Jedynym powodem, dla którego A istniało, było uruchomienie B. Tak więc, kiedy B ("prawdziwa" aplikacja) pobrała aktualizację, była w stanie zastąpić A, jeśli jest to konieczne.

Jeśli aplikacja została wznowiona (przez A), sprawdzić czy B pobrać niektórych plików i zastąpić je, zanim zaczęło B.

+0

Ostatnio natknąłem się na fakt, że uruchomiony plik wykonywalny nie może zostać nadpisany, ale można go zmienić. Sam to wypróbowałem w aplikacji testowej i wykorzystam tę technikę do opracowania własnego komponentu samoregulacji aplikacji. – jpierson

+1

Zajrzyj do Shadow Copying (http://msdn.microsoft.com/en-us/library/ms404279.aspx). Używamy go, aby umożliwić klientom na serwerze terminali aktualizowanie oprogramowania klienckiego, podczas gdy inni użytkownicy uruchamiają aplikację na tym samym komputerze w tym samym czasie. – sloth

0

I w większości się z Stefan's Answer wyjątkiem, że nie może działać, jeśli chcesz prawidłowo radzić sobie z UAC w Windows Vista lub Windows 7, a twoja aplikacja jest poprawnie zainstalowana w folderze Program Files lub wymaga zainstalowania innych zależności, które wymagają podwyższonych uprawnień.

W tym przypadku użytkownik wykonuje instalację/poprawkę opartą na systemie msi lub instaluje usługę systemu Windows, która działa z niezbędnymi zabezpieczeniami do nadpisywania plików w folderze Program Files.

Inną opcją, jeśli twoja aplikacja jest interaktywna, jest robienie tego, co sugeruje Igor Brejc i odrodzenie nowego procesu, który aktualizuje, co daje twojej aplikacji możliwość podpowiadania, by podnieść uprawnienia podczas aktualizacji. Korzystanie z opcji łatki lub usługi systemu Windows, jak wspomniano powyżej, zapewniłoby lepsze wrażenia użytkownika niezależnie od scenariusza (interaktywne/nieinteraktywne).

Powiązane problemy