2011-06-06 10 views
6

Mam Instalatora Windows dla mojej aplikacji. Pakiet aplikacji zawiera również klasę Instalatora, w której wykonywane są niektóre czynności, inne są wykonywane w Akcje niestandardowe.Problemy dotyczące instalowania aplikacji za pomocą Instalatora Windows

Instalator instaluje inną aplikację z akcji niestandardowych podczas instalacji. Chcę wiedzieć, czy ta aplikacja już istnieje w tej samej wersji Nie chcę instalować ani dostarczać Messagebox asknig do ponownego zainstalowania Y/N.

Jeśli moja aplikacja jest już zainstalowana i ponownie klikam ten sam instalator, otrzymuję opcje "Napraw" i "Usuń". Ale jeśli instalator jest nowo zbudowany, pojawia się okno dialogowe z informacją "Inna wersja jest już zainstalowana ... usuń za pomocą Dodaj usuwanie programów ..". Nie mogę więc zaktualizować istniejącej wersji bez jej odinstalowania. Jak mogę zaktualizować istniejącą wersję?

Każda pomoc lub wskazówki dla tych 2 zapytań są bardzo cenne. Spojrzałem na sieć, ale nie mogłem uzyskać odpowiedzi na pytanie. Jeśli możesz mi pomóc, to byłoby naprawdę świetnie.

KOD

prouct.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Product xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
ProductCode="My.Bootstrapper.ABC"> 

<!-- Create Package, Product Manifest http://msdn.microsoft.com/en-us/library/ee335702.aspx 
    Schema Reference : http://msdn.microsoft.com/en-us/library/ms229223.aspx 
    --> 

<PackageFiles> 
    <PackageFile Name="XYZ.exe"/> 
</PackageFiles> 

<InstallChecks> 
    <!-- If its installed, it will be in Uninstall. DisplayName will be XYZ2.1_rc22 
    Can still get values of DisplayVersion (2.1_rc22) & UninstallString from this key 
    --> 
    <RegistryCheck 
     Property="IS_XYZ_INSTALLED" 
     Key="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\XYZ" 
     Value="DisplayName"/> 
    </InstallChecks> 

    <Commands> 
    <Command PackageFile="XYZ.exe" Arguments="/Install"> 
    <InstallConditions> 
     <BypassIf Property="IS_XYZ_INSTALLED" 
      Compare="ValueEqualTo" Value="XYZ2.1_rc22"/> // tHIS IS THE DISPLAYNAME, THAT I SEE IN REGISTY 
     <FailIf Property="AdminUser" 
      Compare="ValueNotEqualTo" Value="True" 
      String="NotAnAdmin"/> 
    </InstallConditions> 

    <ExitCodes> 
     <ExitCode Value="0" Result="Success"/> 
     <ExitCode Value="1641" Result="SuccessReboot"/> 
     <ExitCode Value="3010" Result="SuccessReboot"/> 
     <DefaultExitCode Result="Fail" String="GeneralFailure"/> 
    </ExitCodes> 
    </Command> 
</Commands> 

</Product> 

package.xml

<?xml version="1.0" encoding="utf-8" ?> 
<Package xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper" 
    Name="DisplayName" Culture="Culture"> 

<!--Check for XYZversion 2.1_rc22 --> 
<Strings> 
    <String Name="DisplayName">Install My XYZ</String> 
    <String Name="Culture">en</String> 
    <String Name="NotAnAdmin">Administrator permissions are required to install XYZ.Contact your 
       administrator.</String> 
    <String Name="GeneralFailure">A general error has occurred while installing this 
      package.</String> 
    </Strings> 
</Package> 

UPDATE: chcę zainstalować XYZ, jeśli nie jest zainstalowany na alerady PC. W przypadku kodu Above nie jest instalowany jako Wymaganie wstępne. W polu Wymaganie wstępne zaznaczam swoją aplikację (wraz z Instalatorem Windows 3.1 & .NET3.5) i wybrałem opcję "Pobierz prereq z tej samej lokalizacji co moja aplikacja". W projekcie Build of setup otrzymuję 3 foldery w moim Rel (dla winIns, Net & moja aplikacja jest instalowana jako preq, np. XYZ). Obecnie XYZ nie jest zainstalowany na moim komputerze, więc klucz nie zostanie znaleziony. Kiedy instaluję instalator, instaluje on aplikację, ale nie aplikację wstępną, np. XYZ.exe. Gdzie się mylę?

Dzięki.

+0

W jaki sposób instaluje się drugą aplikację w Akcji niestandardowej, czy jest to kolejny MSI? – Jodrell

+0

@Jodrell, druga aplikacja to plik instalatora systemu Windows. W Akcji niestandardowej dodałem ten plik w opcji Instaluj. W związku z tym jest on wykonywany podczas procesu instalacji, a plik exe instaluje inną aplikację – Tvd

Odpowiedz

0
  1. Można sprawdzić wersję plików wykonywalnych z wykorzystaniem GetFileVersionInfo i VerQueryValue funkcje WinAPI (nie musi być .Net odpowiedniki).

  2. Możesz zmienić ProductCode przy każdym generowaniu pakietu MSI. Aktualizacje muszą zawierać bieżącą wersję, tj. Musisz umożliwić aktualizację między tą samą wersją pakietu, bez zmiany ProductVersion.

    Mimo to chciałbym polecić po Cosmin's recommendation.


Aktualizacja: odpowiadając na komentarz.

<Upgrade Id="Your-Upgrade-GUID"> 
    <UpgradeVersion Minimum="$(var.ProductVersion)" 
        IncludeMinimum="no" 
        OnlyDetect="yes" 
        Language="1033" 
        Property="NEWPRODUCTFOUND" /> 
    <!-- NEWPRODUCTFOUND property is set if a newer product version 
     is installed. It is used to prevent downgrades. --> 

    <UpgradeVersion Minimum="1.0.0" 
        IncludeMinimum="yes" 
        Maximum="$(var.ProductVersion)" 
        IncludeMaximum="yes" 
        Language="1033" 
        Property="UPGRADEFOUND" /> 
    <!-- UPGRADEFOUND property is set if older product version is installed 
     or the same as the value of ProductVersion variable --> 
</Upgrade> 

Używamy powyższego kodu do wykonywania aktualizacji nawet pomiędzy tą samą wersją aplikacji. ProductVersion to zmienna preprocesora WiX, która zawiera bieżącą wersję produktu. PackageCode jest generowany automatycznie dla każdej kompilacji, używając * jako wartości w pliku .wsx.

Kluczem do jego działania jest atrybut IncludeMaximum="yes" w drugim elemencie UpgradeVersion oraz fakt, że każdy wygenerowany pakiet ma unikatową PackageCode.

+0

@Alexey, jak mogę obsłużyć aktualizację mojej aplikacji. Czy muszę również zmienić kod produktu lub wersję do aktualizacji? A jeśli jest to uaktualnienie, to zainstalowana ścieżka powinna automatycznie wyświetlać się bez możliwości zmiany. Jak zdobyć to w instalatorze? Mam również klasę Installer. – Tvd

+0

@ Tvd, zaktualizowałem odpowiedź, dostarczając fragment kodu WiX, który umożliwia uaktualnienie obecnej wersji instalacji bez aktualizacji wersji produktu. –

+0

@alexey, Dzięki. Ale używam Instalatora Windows przy użyciu narzędzia SEtu i wdrożenia przy użyciu VS 2008. Jak to zrobić z projektem instalacji i wdrażania. Jak polecasz sugestię Cosminsa, możesz rzucić okiem na kod i moje komentarze dodane pod odpowiedz Cosmin. LUB Jak sobie z tym poradzić z instalatorem MSI Instalatora i instalacji systemu Windows. Naprawdę doceniam. – Tvd

3

Instalator instaluje inną aplikację z akcji niestandardowych podczas instalacji . Chcę się dowiedzieć, czy ta aplikacja już istnieje z tą samą wersją , której nie chcę instalować, ani dostarczać Messagebox asknig do Zainstaluj ponownie Y/N.

Zamiast niestandardowego działania należy użyć warunku wstępnego. Jeśli korzystasz z projektu konfiguracji programu Visual Studio, być może pomoże to: Adding Custom prerequsites to visual studio setup project

Jeśli używasz innego narzędzia do tworzenia konfiguracji, powinieneś sprawdzić, czy spełnia on wymagania wstępne.

Jeśli moja aplikacja jest już zainstalowany, i kliknij tę samą instalator ponownie, otrzymuję „Napraw” i „Usuń” opcji. Ale jeśli instalator jest nowo zbudowany, pojawia się okno dialogowe z informacją: "Inna wersja jest już zainstalowana ... usunąć za pomocą Dodaj Usuń Programy ..".Dlatego nie mogę zaktualizować istniejącej wersji bez odinstalowania go. Jak mogę zaktualizować istniejącą wersję ?

Dzieje się tak, ponieważ zmodyfikowano pakiet bez zwiększania ProductVersion i modyfikowania ProductCode. Jeśli chcesz automatyczne uaktualnienie, musisz je zmodyfikować.

Jednakże, jeśli tylko testujesz i nie chcesz zwiększać ProductVersion, musisz ręcznie odinstalować stary pakiet przed zainstalowaniem nowego. Tak działają aktualizacje Instalatora Windows.

+0

@Cosmin, nie mogę zrozumieć, jak używać/konfigurować manifest bootstrap z moją aplikacją. Używam Instalatora Windows. Moja nazwa aplikacji to "ABS.exe", a inna aplikacja, którą instaluję, to "XYZ.exe", która jest niestandardowo zbudowana przeze mnie. System może mieć oryginalną pełną wersję. Nazwa pliku exe mojej zbudowanej aplikacji jest taka sama jak oryginalna pełna nazwa pliku exe. Rozpoznaję moją wbudowaną wersję, identyfikując nazwy plików i folderów z zainstalowanej ścieżki. Dzięki temu kompleksowi nie mogę zrozumieć, jak używać niestandardowych Prerequsites. Czy możesz mi pomóc? Myślę, że jestem zagubiony we wszystkich tysiącach. – Tvd

+0

@Cosmin, REG "Inna wersja jest już zainstalowana ...". Czy tak jest, aby sobie z tym poradzić? Mam na myśli, czy mogę podać wiadomość niestandardową zamiast tego komunikatu systemowego. Czy można to załatwić, jeśli tak, Jak sobie z tym poradzić? – Tvd

+0

Zakładam, że twoja druga aplikacja ma inny instalator. W takim przypadku można dodać drugi instalator jako warunek wstępny. Jeśli używasz pojedynczego pakietu dla obu aplikacji, dlaczego i jak instalujesz go z niestandardowej akcji? Jeśli chodzi o wiadomość, nie można jej zmienić ani obsłużyć. Możesz zwiększyć wersję i zmienić kod produktu lub ręcznie odinstalować starą wersję. –

Powiązane problemy