2009-11-04 19 views
6

Mam aplikację o złożonych wymaganiach konfiguracyjnych. Jestem zaznajomiony z niektórymi narzędziami do tworzenia programów instalacyjnych takich jak Wix, projekt Visual Studio Setup, Inno-setup i narzędzia innych firm. W przypadku tej konkretnej aplikacji postanowiłem jednak napisać program instalacyjny od zera w języku C#, nie używając żadnego z tych narzędzi. Niektóre z argumentacji wyrażone przez Joel mają zastosowanie tutaj, z wyjątkiem chcę to zrobić w C# zamiast MFC.Jak utworzyć samodzielny, samodzielny program instalacyjny napisany w języku C#?

W każdym razie, moje pytanie brzmi: w jaki sposób mam utworzyć plik wykonywalny .NET, który może zawierać zestaw plików wyodrębnionych w czasie wykonywania? W tym przypadku exe jest programem instalacyjnym, a pliki są plikami programów, które trzeba zainstalować. Poza tym, jak sprawić, aby program był całkowicie niezależny, tzn. Mimo że korzystam z zewnętrznych złożeń (zarówno własnych, jak i zewnętrznych), chcę je spakować razem w pojedynczy plik EXE (w macierzystym świecie C/C++ to było realizowane poprzez łączenie statyczne).

UPDATE

To podejście Dostałem pracę tak daleko, co będę trzymać, chyba że ktoś sugeruje coś lepszego:

  • Utworzono oczywisty plik XML zawierający listę wszystkich pliki i struktura folderów obejmująca aplikację instalowaną przez mój program instalacyjny. Dodałem ten plik do projektu VS dla programu instalacyjnego.
  • Napisałem narzędzie w C# (zipfiles.exe), które pobiera plik XML i tworzy plik zip zawierający wszystkie pliki. To narzędzie korzysta z niesamowitej biblioteki DotNetZip, aby utworzyć zip.
  • Dodano działanie poprzedzające kompilację do mojego projektu programu instalacyjnego, który uruchamia narzędzie zip z manifestem XML i wysyła plik zip (Files.zip) do folderu projektu.
  • Dodano Files.zip jako zasób osadzony w moim projekcie programu instalacyjnego.
  • Mój program instalacyjny przy starcie pobiera wbudowany ZIP i rozpina go do celu zainstalowania folder aplikacji (znowu przy użyciu DotNetZip)
  • dodał działanie pokompilacyjnych do mojego projektu programu instalacyjnego, który używa narzędzia ILMerge na pakiet all zewnętrznych złożeń, które używa w exe.

Mam teraz projekt VS dla mojego programu instalacyjnego, który buduje samodzielny plik exe z wszystkimi plikami potrzebnymi do zainstalowania w nim osadzonego. Kiedy zmienia się lista plików instalowanej aplikacji, po prostu aktualizuję plik XML i odbudowuję.

Teraz mogę skupić się na pozostałej części mojej logiki instalacji!

+2

pisanie "nic" w MFC jest całkowicie szalone! –

+2

Czekaj, tylko dlatego, że Joel to zrobił, nie wyklucza, że ​​jest szalony. Założył firmę programistyczną na Manhattanie, która nie jest również bankiem inwestycyjnym. To szalone! – JasonTrue

+0

Cóż, były inne czasy ... Próbuję zrobić to samo, z wyjątkiem używania bardziej nowoczesnego języka C# – DSO

Odpowiedz

0

Instalacja może nie być zbyt trudna (zakładając, że framework .NET jest już zainstalowany), ale należy również rozważyć wycofanie w przypadku awarii i deinstalacji instalacji. Z tego powodu instalacje MSI są tak skomplikowane. Sam musisz sobie z tym poradzić ...

+0

Tak, rozumiem to. Nie jest to trudne pisanie prostego mechanizmu zatwierdzania/przywracania. Robię to również w .NET 2.0, co będzie minimalnym warunkiem wstępnym do uruchomienia instalacji. Moim pierwszym problemem jest ustalenie, jak spakować wszystko (ustawić pliki programów, pliki programów i zasoby) w jeden plik exe, a także poprawnie zarządzać rejestracją w programach dodawania/usuwania, aby wskazać model exe. – DSO

0

WIX to standard tworzenia MSI. Nauka IMO jest nieco skomplikowana i frustrująca, ale warto. Zaplanuj spędzanie jednego dnia, aby uruchomić podstawowy instalator. Jest to narzędzie, z którego korzysta Microsoft i wiele innych firm.

+0

TS już wspomniał, że użył WIXa –

2

Możesz użyć Inno-Setup jako głównego kontenera dla twojego instalatora. W Inno-Setup możesz uruchamiać i czekać na własne aplikacje, które instalują lub konfigurują określone części aplikacji.

+0

Może to działać jako bardziej elastyczna alternatywa dla iexpress ...używanie inno setup jako pakietu do rozpakowania i uruchomienia programu instalacyjnego. Zbadam dalej, dzięki – DSO

1

Zrobiliśmy to dla aplikacji, którą aktualizujemy co tydzień o nowe dane.

Stworzyliśmy dwie aplikacje. Pierwszy został użyty do owinięcia instalacji. Polegało to na zebraniu plików do rozprowadzania, a następnie skompresowaniu ich do archiwum zip. Użyliśmy ChilkatZip do utworzenia archiwum, które samo wyodrębni, a następnie uruchomi drugą aplikację, która obsługuje proces instalacji na komputerze klienta.

Nasze potrzeby były jednak dość proste, ale pozwoliło nam usunąć zależność od Installshield, która powodowała wewnętrzne problemy z pomocą techniczną.

3

Po prostu utwórz standardowy projekt instalacji Visual Studio zawierający tylko jeden kod: custom install action.

Jest to właściwie standardowy pakiet .NET dll, w którym można uruchomić dowolny kod wymagany do zainstalowania i odinstalowania aplikacji.

Istnieje z dokładnie tych powodów, o których wspomniałeś, np. Kiedy aplikacja. wymaga bardziej złożonych czynności instalacyjnych i deinstalacyjnych, które zapewnia standardowy instalator.

+0

To pozwala tylko pisać niestandardowe akcje MSI w .NET. Nie zapewnia kontroli nad całym procesem instalacji (okna dialogowe interfejsu, logika przepływu pracy itp.). – DSO

+2

W rzeczywistości daje * pełną * kontrolę nad procesem instalacji. tj. tworzyć własne okna dialogowe ustawień interfejsu użytkownika, konfigurować bazy danych SQL, pisać do rejestru, instalować/uruchamiać usługi. Użyłem tego sam dla złożonych konfiguracji. Cała instalacja jest tylko jedną niestandardową akcją. W rzeczywistości robisz to od zera, ale zgodnie z wytycznymi instalacji systemu Windows, tzn. Dostajesz Dodaj/Usuń programy itp. Za darmo. – Ash

+0

Hmm .. nie wiedziałem, że możesz rzucić okna dialogowe interfejsu użytkownika w akcji niestandardowej. Ale wciąż jest to akcja niestandardowa wywoływana w określonym momencie w konfiguracji przez silnik MSI. Nie masz kontroli nad tym, co dzieje się przed lub po. – DSO

2

Cóż, jest powód, dla którego systemy instalacyjne, takie jak InnoSetup, są aktywne od lat - napisanie instalatora nie jest łatwym zadaniem. Mówisz, że chcesz mieć całkowitą kontrolę nad procesem, który możesz powiedzieć, pisząc instalator od zera.

To prawda, oczywiście, ale to nie jest dobry powód do pisania to wszystko samemu - można również to osiągnąć przez nie pisząc to wszystko od zera, ale przy użyciu na przykład możliwości skryptowe Inno Skonfiguruj, aby utworzyć własny interfejs użytkownika i konfigurację, a jednocześnie nadal korzystać z dobrze przetestowanych funkcji Inno Setup.

Myślę, że czas poświęcony na stworzenie instalatora od podstaw byłby lepiej zainwestowany w sprawdzanie różnych istniejących systemów, ocenianie, który z nich zapewnia najlepsze wsparcie dla wszystkich wymaganych zadań konfiguracyjnych, a następnie dostosowywanie go, aby konfiguracja dopasowana była do Twoich potrzeb.

+2

Nie chcę pisać całej mojej logiki instalacji w języku skryptowym, który mało kto zna, a nawet gdybym się tego nauczył, zapomnę. Moim celem jest zrobienie tego w języku C#, które każdy może odebrać i utrzymać, a którego nie zapomnę. – DSO

+1

Również pisząc swoją logikę instalacji w języku C#, uzyskujesz lepsze możliwości testowania (VS). – DSO

0

Jak korzystać z SharpSetup? Pozwala mieszać kod C# (w tym GUI instalatora w WinForm), WiX (do tworzenia podstawowych ustawień, takich jak pliki, wpisy rejestru, skróty) i kod C++ (w przypadku .NET Framework nie jest jeszcze zainstalowany). Proces budowania łączy wszystkie te części razem, a kończy się samodzielnym instalatorem pojedynczego pliku, który działa na każdym nowoczesnym systemie Windows (od wersji W2K).

Nota prawna: Jestem autorem SharpSetup.

Powiązane problemy