如何在下一次升级中从应用程序中完全卸载服务,这不是主要升级



我正在尝试卸载具有多个组件但无法卸载的已安装服务。 任何人都可以帮我卸载标签吗?我做了很多搜索,但无法成功运行任何东西。

只是放置服务控制标签并删除所有组件有效?我试过了,但没有奏效。如何处理组件和依赖项?需要逻辑和语法帮助。

下面是我在以前版本中安装服务的代码。请让我知道我必须添加的标签才能删除它。

<Directory Id="dirxxx" Name="oldname">
<!-- oldname service-->
<Component Id="cmpOldNameService" Guid="bbb"
SharedDllRefCount="no" KeyPath="no" NeverOverwrite="no" Permanent="no" Transitive="no"
Win64="no" Location="either">
<RemoveFile Id="ccc" On="uninstall" Name="z.dll"/>
<File Id="ccc" KeyPath="no" Source="$(var.xSource)OldNameServicea.dll"/>
<File Id="ddd" KeyPath="no" Source="$(var.xSource)OldNameServiceb.dll"/>
<File Id="eee" KeyPath="no" Source="$(var.xSource)OldNameServicec.dll"/>
<File Id="fff" KeyPath="no" Source="$(var.xSource)OldNameServiced.dll"/>
<File Id="ggg" KeyPath="no" Source="$(var.xSource)OldNameServicee.dll"/>
<File Id="hhh" KeyPath="no" Source="$(var.xSource)OldNameServicef.dll"/>
<File Id="iii" KeyPath="yes" Source="$(var.xSource)OldNameServiceg.exe"/>
<File Id="jjj" KeyPath="no" Source="$(var.xSource)OldNameServiceh.dll"/>
<File Id="kkk" KeyPath="no" Source="$(var.xSource)OldNameServicei.dll"/>
<ServiceInstall Id="OldNameService" DisplayName="OldName Service" Name="NewName"
ErrorControl="normal" Start="auto" Type="ownProcess" Vital="yes" Description="OldName Service">
<ServiceConfig DelayedAutoStart="yes" OnInstall="yes" OnReinstall="yes"/>
</ServiceInstall>
<ServiceControl Id="OldNameServiceControl" Name="NewName"
Start="install" Stop="uninstall" Remove="uninstall" Wait="no"/>
</Component>
<Component Id="lll" Guid="mmm" NeverOverwrite="yes">
<File Id="nnn" KeyPath="yes" Source="$(var.xSource)OldNameServiceOldName.exe.config"/>
<util:XmlFile Id="UpdateOldNamelogFileName"
File="[#nnn]"
Action="setValue"
ElementPath="/configuration/appSettings/add[[]@key='logFile'[]]/@value"
Value="[ooo]oldname_YYYYMM.log" />
</Component>

<!--Recovery-Interval needs to be added in both cases new install as well as upgrades-->     

<Component Id="qqq" Guid="r-r-r-r-r" NeverOverwrite="yes">
<Condition><![CDATA[INSTALDIR <> "" AND NOT REMOVE AND POSTV1 = ""]]></Condition>
<CreateFolder /> 
<util:XmlConfig Id="RecoveryInterval" Action="create" ElementPath="config/settings" File="[INSTALDIR]oldnameOldNameService.exe.config" Node="element" On="install" Name="add" Sequence="1">
<util:XmlConfig Id="RecoveryInterval2" ElementId="RecoveryInterval" Name="key" Value="Recovery-Interval" File="[INSTALDIR]oldnameOldNameService.exe.config" />
<util:XmlConfig Id="RecoveryInterval3" ElementId="RecoveryInterval" Name="value" Value="3600" File="[INSTALDIR]oldnameOldNameService.exe.config" />
</util:XmlConfig>
</Component>
<!-- Analytics-->
<Component Id="eee" Guid="f-f-f-f-f" NeverOverwrite="yes">
<Condition><![CDATA[(INSTALDIR <> "") AND NOT REMOVE]]></Condition>
<CreateFolder />                          
<!-- Analytics-->
<util:XmlConfig Id="EnableAnalytics" Action="create" ElementPath="config/settings" File="[INSTALDIR]oldnameOldNameService.exe.config" Node="element" On="install" Name="add" VerifyPath="/config/settings/add[[]@key='EnableAnalytics'[]]">
<util:XmlConfig Id="EnableAnalytics2" ElementId="EnableAnalytics" Name="key" Value="VEnableAnalytics" File="[INSTALDIR]oldnameOldNameService.exe.config" />
<util:XmlConfig Id="EnableAnalytics3" ElementId="EnableAnalytics" Name="value" Value="1" File="[INSTALDIR]oldnameOldNameService.exe.config" />
</util:XmlConfig>
<util:XmlConfig Id="AnalyticsTrackingId" Action="create" ElementPath="config/settings" File="[INSTALDIR]oldnameOldNameService.exe.config" Node="element" On="install" Name="add" VerifyPath="/config/settings/add[[]@key='AnalyticsTrackingId'[]]">
<util:XmlConfig Id="AnalyticsTrackingId2" ElementId="AnalyticsTrackingId" Name="key" Value="AnalyticsTrackingId" File="[INSTALDIR]oldnameOldNameService.exe.config" />
<util:XmlConfig Id="AnalyticsTrackingId3" ElementId="AnalyticsTrackingId" Name="value" Value="YwByAE3eVweXAAcAVwBasBUAAgAMsB0AAwAbzz==" File="[INSTALDIR]oldnameOldNameService.exe.config" />
</util:XmlConfig>
</Component>
<!-- Added to handle upgrade scenario for assembly binding redirect for Newtonsoft.json -->
<Component Id="cmpNewtonsoftVersionUpgrade" Guid="{a-60CA-d-w-f}" NeverOverwrite="yes">
<Condition><![CDATA[(INSTALDIR <> "") AND NOT REMOVE]]></Condition>
<CreateFolder/>
<util:XmlConfig Id="AddRuntimeElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="element" Name="runtime" On="install"
ElementPath="configuration"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/assemblyIdentity[[]@name='Newtonsoft.Json'[]]"
Sequence="1" />
<util:XmlConfig Id="AddAssemblyBindingElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="element" Name="assemblyBinding" On="install"  ElementPath="configuration/runtime"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/assemblyIdentity[[]@name='Newtonsoft.Json'[]]"
Sequence="2"/>
<util:XmlConfig Id="AddDependentAssemblyElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="element" Name="dependentAssembly" On="install"
ElementPath="configuration/runtime/assemblyBinding"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/assemblyIdentity[[]@name='Newtonsoft.Json'[]]"
Sequence="3"/>
<util:XmlConfig Id="AddAssemblyIdentityElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="element" Name="assemblyIdentity" On="install"
ElementPath="configuration/runtime/assemblyBinding/dependentAssembly"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/assemblyIdentity[[]@name='Newtonsoft.Json'[]]"
Sequence="4">
<util:XmlConfig Id="AddNameKey"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddAssemblyIdentityElement" Name="name" Value="Newtonsoft.Json" />
<util:XmlConfig Id="AddPublicKeyToken"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddAssemblyIdentityElement" Name="publicKeyToken" Value="30ad4fe6b2a6aeed" />
<util:XmlConfig Id="AddCulture"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddAssemblyIdentityElement" Name="culture" Value="neutral" />
<util:XmlConfig Id="AddXmlnsOnAssemblyIdentity"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddAssemblyIdentityElement" Name="xmlns" Value="urn:schemas-microsoft-com:asm.v1" />
</util:XmlConfig>
<util:XmlConfig Id="DeleteBindingRedirectElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="delete" Node="element" Name="bindingRedirect" On="install"
ElementPath="configuration/runtime/assemblyBinding/dependentAssembly[[]assemblyIdentity[[]@name='Newtonsoft.Json'[]][]]"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect[[]@oldVersion='0.0.0.0-6.0.0.0'[]]"
Sequence="5" />
<util:XmlConfig Id="DeleteBindingRedirectElementoldserviceOnv4"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="delete" Node="element" Name="bindingRedirect" On="install"
ElementPath="configuration/runtime/assemblyBinding/dependentAssembly[[]assemblyIdentity[[]@name='Newtonsoft.Json'[]][]]"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect[[]@oldVersion='0.0.0.0-8.0.0.0'[]]"
Sequence="6" />
<util:XmlConfig Id="AddBindingRedirectElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="element" Name="bindingRedirect" On="install"
ElementPath="configuration/runtime/assemblyBinding/dependentAssembly[[]assemblyIdentity[[]@name='Newtonsoft.Json'[]][]]"
VerifyPath="/configuration/runtime/assemblyBinding/dependentAssembly/bindingRedirect[[]@oldVersion='0.0.0.0-9.0.0.0'[]]"
Sequence="7">
<util:XmlConfig Id="AddOldVersionKey"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddBindingRedirectElement" Name="oldVersion" Value="0.0.0.0-9.0.0.0" />
<util:XmlConfig Id="AddNewVersionKeyS3Uploader"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddBindingRedirectElement" Name="newVersion" Value="9.0.0.0" />
<util:XmlConfig Id="AddXmlnsOnBindingRedirectS3Uploader"
File="[INSTALDIR]oldnameOldNameService.exe.config"
ElementId="AddBindingRedirectElement" Name="xmlns" Value="urn:schemas-microsoft-com:asm.v1" />
</util:XmlConfig>
<util:XmlConfig Id="AddNameSpaceToyElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="value" Name="xmlns" Value="urn:schemas-microsoft-com:asm.v1" On="install"
ElementPath="/configuration/runtime/assemblyBinding"
Sequence="8" />
<util:XmlConfig Id="AddNameSpaceToDependentAssemblyElement"
File="[INSTALDIR]oldnameOldNameService.exe.config"
Action="create" Node="value" Name="xmlns" Value="urn:schemas-microsoft-com:asm.v1" On="install"
ElementPath="/configuration/runtime/assemblyBinding/dependentAssembly[[]assemblyIdentity[[]@name='Newtonsoft.Json'[]][]]"
Sequence="9" />
</Component>
</Directory> 

1 个组件的示例试用:

<Component Id="cmpoldNameService" Guid="9-kj-4509-ko-B4F7700AFDCE"
SharedDllRefCount="no" KeyPath="no" NeverOverwrite="no" Permanent="no" Transitive="yes"
Win64="no" Location="either">
<Condition>FALSE</Condition>
<RemoveFolder Id="diytg" On="uninstall"/>
<RemoveFile Id="ghgj" On="uninstall" Name="a.dll"/>
<RemoveFile Id="uiu" On="uninstall" Name="b.dll"/>
<RemoveFile Id="hujhjn" On="uninstall" Name="c.dll"/>
<RemoveFile Id="okl" On="uninstall" Name="d.dll"/>
<RemoveFile Id="bbb" On="uninstall" Name="e.dll"/>
<RemoveFile Id="bbbb" On="uninstall" Name="f.dll"/>
<RemoveFile Id="kkkl" On="uninstall" Name="g.dll"/>
<RemoveFile Id="mmmm" On="uninstall" Name="h.dll"/>
<RemoveFile Id="nnn" On="uninstall" Name="i.exe"/>
<RemoveFile Id="bboo" On="uninstall" Name="j.dll"/>
<RemoveFile Id="ttt" On="uninstall" Name="k.dll"/>
<ServiceControl Id="OldNameServiceControl" Name="OldName"
Start="install" Stop="both" Remove="both" Wait="yes"/>
</Component>

MSI 次要升级无法正式删除组件或功能。 解决方法 (Hack( 是保留原始组件,但为它们提供一个零字节文件,并将 Revaluate 属性(MSI 中的传递位(设置为 true,并为其提供一个始终计算结果为 false 的条件。 这样,Windows 安装程序将此组件转换为未安装,并且服务将停止并删除。

您必须保留这个 0 字节的假组件,直到您进行下一次重大升级。 然后可以将其删除。

老实说,次要升级非常挑剔,如果您还不知道这些规则,最好始终进行重大升级,直到您这样做为止。 如果你允许,小的升级可能会把你推到一个角落里。

最新更新