windows - Sådan får du MSI Installer til at køre nogle kode om afinstallation af en tjeneste

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med nogle, kan jeg gerne udføre, når tjenesten bliver afinstalleret. Jeg har tilføjet koden til både System.ServiceProcess.ServiceProcessInstaller BeforeUninstall event og

til overstyringsmetoden OnBeforeUninstall, men det fungerede heller ikke.


Når du bruger min InstallShield msi til at afinstallere tjenesten, bliver denne kode ikke udført.


Hvordan kan jeg tvinge tjenesten til at starte kode under afinstallation? Skal jeg bruge en anden begivenhed i min C # -service? Skal jeg ændre noget i mit MSI?


Bemærk:
Mit problem er identisk med følgende
https://community.flexerasoftware.com/showthread.php?149176-MSI-Uninstall-NET-Service-does-not-launch-BeforeUninstall-event[7]


Tak,
sagar

Bedste reference


Du bliver nødt til at være mere eksplicit om alt, hvad du har gjort. For eksempel er der ingen automatiske kald til installatør klasse metoder, medmindre de eksplicit tilføjes til din opsætning som brugerdefinerede handlinger (i dit tilfælde en afinstallation tilpasset handling). Du bør også forklare præcis, hvordan tjenesten blev installeret.


Bemærk, at installatørklasser blev opfundet af Visual Studio-opsætninger, og der er typisk ingen grund til at bruge dem, fordi værktøjer som InstallShield normalt understøtter standard ServiceInstall og ServiceControl-funktionaliteten i Windows Installer. Installer klasser er unødvendige. Disse begivenheder er også Visual Studio-specialer, og det er ikke klart for mig, om InstallShield understøtter dem. Hvis du bruger en afinstallationsmetode til at afinstallere en tjeneste, skal du blot tilføje din 'før' kode til før Base.Uninstall () .


Hvis du vil have kode til at køre, når tjenesten er afinstalleret, er den mere almindelige måde at have en brugerdefineret handling, der kalder din kode, og betingelsen opkaldet REMOVE='ALL' (for afinstallation) eller andre betingelser afhængigt af dit nøjagtige krav . Hvis du for eksempel opgraderer MSI til at opgradere dit eksisterende produkt, vil du stadig køre denne afinstallationskode?

Andre referencer 1


.NET Installer Class : PhilDW har allerede sagt alt, men jeg vil blot tilføje et par ting. Jeg går ud fra, at du bruger System.Configuration.Install.Installer og ServiceProcessInstaller Class (der er en prøve i Installshield-hjælpefilen). Der plejede at være (og jeg tror der stadig) et flag for hver Installshield-komponent kaldet .NET Installer Class. Du kan indstille dette flag til Yes, og derefter tror jeg, at Installshield selv vil sørge for at køre dine installatørklassemetoder (Install, Commit, Rollback, Uninstall - alt efter hvilket jeg implementerer, men jeg har aldrig testet alle scenarier . Jeg bruger ikke denne funktion). [8] [9]


InstallUtil.exe : Running InstallUtil.exe ville faktisk kalde disse metoder. Jeg er ikke sikker på, hvordan Installshield kalder metoderne under emhætten (under installationens udførelse) - de kan faktisk kalde InstallUtil.exe for alt, hvad jeg kender, eller noget mere lavt niveau-API-opkald.


Konklusion : Gå bare til komponentvisning og klik på komponenten, der indeholder din service.exe fil - og angiv det ovennævnte flag. Exe skal være en nøglefil for den pågældende komponent - og den skal være en .NET-samling. Som PhilDW skrev, Jeg ville ikke bruge disse metoder , da de kun skal bruges under serviceudvikling - ikke under implementering . For en ting kan du komme ind i runtime-fejl , når metoderne forsøger at løbe forfejl hele hele opsætningen (og ofte unødigt det), og der er også sandsynlige problemer med rollback og potentielt andre problemer . Kan vi spørge, hvad metoderne rent faktisk gør? Måske sletter du bare nogle logfiler? Der er andre måder at gøre det på - mest markant ved hjælp af tabellen Fjernfil. [10]