在卸载日志中找不到 WiX 属性
WiX property not found in uninstall log
属性 UI 的更改从卸载日志中消失。
如果我使用默认 属性 值安装我的应用程序,然后 运行 卸载 属性 会出现在卸载日志中。
如果我在卸载时从 UI 更改 属性 值,它不会出现在日志中。
这就是卸载后apppool和webapp留在IIS中,默认值不是这样的原因。
<Property Id="WEB_APP_NAME" Value="WebApp" Secure="yes" />
这就是 属性 的样子。
这是我从 UI 控件
添加值的地方
<Control Id="PoolNameEdit"
Type="Edit"
X="100"
Y="45"
Width="160"
Height="17"
Property="WEB_APP_NAME"
Text="{80}"
Indirect="no" />
这就是我的使用方式
<!-- Define the directory structure -->
<Fragment>
<!--Directory elemens hierarchy always starts with Id="TARGETDIR" Name="SourceDir"-->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WEB_APP_FOLDER_LOC" Name="WebInstaller">
<Directory Id="WEBFOLDER" Name ="[WEB_APP_NAME]" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<!--Concatenate user input for folderpath-->
<SetDirectory Id="WEBFOLDER"
Value="[WEB_APP_FOLDER_LOC][WEB_APP_NAME]"
Sequence="both" />
<!--Create new folder-->
<DirectoryRef Id="WEBFOLDER">
<Component Id="cmp_WebDir"
Guid="{E0CE5051-1419-4997-949F-020BC814ECDA}"
KeyPath="yes">
<CreateFolder />
</Component>
</DirectoryRef>
<!--Components-->
<ComponentGroup Id="ProductComponents" Directory="WEBFOLDER">
<!--Client config-->
<Component Id="cmpWebConfig"
Guid="{1C84DF1F-2EA4-46E6-8125-C6FD410AFED9}"
KeyPath="yes">
<Condition>INCLUDECONFIGFILE="1"</Condition>
<File Source="Configuration\Web.config" />
</Component>
<!--Application pool-->
<Component Id="cmpAppPool"
Guid="{00D6ABB1-734F-4788-ADB8-12A30056C513}"
KeyPath="yes">
<iis:WebAppPool Id="MyAppPool"
Name="[WEB_APP_NAME]"
ManagedRuntimeVersion="v4.0"
ManagedPipelineMode="integrated"
Identity="applicationPoolIdentity" />
</Component>
<!--Website-->
<Component Id="cmpMyWebsite"
Guid="{ECD42015-C067-44F3-94D9-5E713BCB586D}"
KeyPath="yes">
<iis:WebSite Id="website_MyWebsite"
Description="[WEB_APP_NAME]"
Directory="WEBFOLDER"
ConfigureIfExists="no">
<iis:WebApplication Id="webapplication_MyWebsite"
Name="[WEB_APP_NAME]"
WebAppPool="MyAppPool" />
<iis:WebAddress Id="webaddress_MyWebsite"
Port="[WEB_APP_PORT]" />
</iis:WebSite>
</Component>
我原以为在 UI 中更改 WEB_APP_NAME 后,卸载程序能够找到它,从而从 IIS 中删除 appool 和 webapp。
Property(S): VirtualMemory = 3353
Property(S): UpgradeCode = {A4F9CA9E-4135-4D6F-AF58-FADA49E265DA}
Property(S): ConfigureIIs7Exec = **********
Property(S): StartIIS7ConfigTransaction = **********
Property(S): RollbackIIS7ConfigTransaction = **********
Property(S): CommitIIS7ConfigTransaction = **********
Property(S): WriteIIS7ConfigChanges = **********
Property(S): NETFRAMEWORK45 = #461808
Property(S): WEBFOLDER= C:\inetpub\WebApp\
Property(S): WEB_APP_FOLDER_LOC = C:\inetpub\
Property(S): WEB_APP_NAME = WebApp
Property(S): WEB_APP_PORT = 8080
Property(S): WEB_APP_USERNAME = ******
Property(S): WEB_APP_DOMAIN_NAME = ******
Property(S): WEB_APP_SQLSERVER_NAME = ******
Property(S): INCLUDECONFIGFILE = 1
这是默认卸载日志的样子,如果我将 WEB_APP_NAME 更改为其他内容,在上面可以看到的卸载日志中找不到 WEB_APP_NAME?
感谢任何可以解决此问题的想法!
这里要理解的关键是 Windows 安装程序不保存 属性 值。用户输入的值(通过 UI 或通过命令行参数)在修复、升级或卸载期间将不可用。您可能会想,它在卸载期间可用,这是一个简单的要求,但这就是 windows 安装程序的工作方式。绕过这个最简单的解决方案是读取 属性 然后将其写入注册表。在 repair/uninstall/upgrade 期间执行注册表搜索并根据注册表中的内容使用值。
至于为什么在卸载时保留默认值,那是因为initial/default值被添加到MSI Property table。在卸载期间,属性 table 也会使用相同的值。
Note: Please prevent the properties from being changeable during uninstall at least. I think you should only accept changes during
fresh install? Or major upgrade? Otherwise the resolved directory name does not match the installed one (same problem you originally had).
Persist Properties:当您允许在设置 GUI 中或通过命令行。否则,当解析为目录或应用程序名称时,属性将为空白 - 或者您在设置中使用它们的任何容量。保留 MSI 属性不是内置 Windows 安装程序功能(只有少数系统属性会自动保留)。通常是 MSI 反模式,但事实就是如此。
"Remember Pattern" 示例:对于常规的 PUBLIC 属性(大写属性),您可以使用 Rob Mensching's remember pattern to save and retrieve property values for repair, modify, uninstall and other maintenance operations. There is a small sample of this property persistence pattern in use here: (记住正在使用的模式)。
Installation Modes: 设置时有多种安装模式需要检查:fresh install
, repair
, modify
, self-repair
, uninstall
, major upgrade uninstall
, patching
、rollback
、resume suspended
(重启和其他原因)等...我至少会测试前 6 种类型 - 确保分辨率正常工作。
属性 UI 的更改从卸载日志中消失。
如果我使用默认 属性 值安装我的应用程序,然后 运行 卸载 属性 会出现在卸载日志中。
如果我在卸载时从 UI 更改 属性 值,它不会出现在日志中。
这就是卸载后apppool和webapp留在IIS中,默认值不是这样的原因。
<Property Id="WEB_APP_NAME" Value="WebApp" Secure="yes" />
这就是 属性 的样子。
这是我从 UI 控件
添加值的地方 <Control Id="PoolNameEdit"
Type="Edit"
X="100"
Y="45"
Width="160"
Height="17"
Property="WEB_APP_NAME"
Text="{80}"
Indirect="no" />
这就是我的使用方式
<!-- Define the directory structure -->
<Fragment>
<!--Directory elemens hierarchy always starts with Id="TARGETDIR" Name="SourceDir"-->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="WEB_APP_FOLDER_LOC" Name="WebInstaller">
<Directory Id="WEBFOLDER" Name ="[WEB_APP_NAME]" />
</Directory>
</Directory>
</Fragment>
<Fragment>
<!--Concatenate user input for folderpath-->
<SetDirectory Id="WEBFOLDER"
Value="[WEB_APP_FOLDER_LOC][WEB_APP_NAME]"
Sequence="both" />
<!--Create new folder-->
<DirectoryRef Id="WEBFOLDER">
<Component Id="cmp_WebDir"
Guid="{E0CE5051-1419-4997-949F-020BC814ECDA}"
KeyPath="yes">
<CreateFolder />
</Component>
</DirectoryRef>
<!--Components-->
<ComponentGroup Id="ProductComponents" Directory="WEBFOLDER">
<!--Client config-->
<Component Id="cmpWebConfig"
Guid="{1C84DF1F-2EA4-46E6-8125-C6FD410AFED9}"
KeyPath="yes">
<Condition>INCLUDECONFIGFILE="1"</Condition>
<File Source="Configuration\Web.config" />
</Component>
<!--Application pool-->
<Component Id="cmpAppPool"
Guid="{00D6ABB1-734F-4788-ADB8-12A30056C513}"
KeyPath="yes">
<iis:WebAppPool Id="MyAppPool"
Name="[WEB_APP_NAME]"
ManagedRuntimeVersion="v4.0"
ManagedPipelineMode="integrated"
Identity="applicationPoolIdentity" />
</Component>
<!--Website-->
<Component Id="cmpMyWebsite"
Guid="{ECD42015-C067-44F3-94D9-5E713BCB586D}"
KeyPath="yes">
<iis:WebSite Id="website_MyWebsite"
Description="[WEB_APP_NAME]"
Directory="WEBFOLDER"
ConfigureIfExists="no">
<iis:WebApplication Id="webapplication_MyWebsite"
Name="[WEB_APP_NAME]"
WebAppPool="MyAppPool" />
<iis:WebAddress Id="webaddress_MyWebsite"
Port="[WEB_APP_PORT]" />
</iis:WebSite>
</Component>
我原以为在 UI 中更改 WEB_APP_NAME 后,卸载程序能够找到它,从而从 IIS 中删除 appool 和 webapp。
Property(S): VirtualMemory = 3353
Property(S): UpgradeCode = {A4F9CA9E-4135-4D6F-AF58-FADA49E265DA}
Property(S): ConfigureIIs7Exec = **********
Property(S): StartIIS7ConfigTransaction = **********
Property(S): RollbackIIS7ConfigTransaction = **********
Property(S): CommitIIS7ConfigTransaction = **********
Property(S): WriteIIS7ConfigChanges = **********
Property(S): NETFRAMEWORK45 = #461808
Property(S): WEBFOLDER= C:\inetpub\WebApp\
Property(S): WEB_APP_FOLDER_LOC = C:\inetpub\
Property(S): WEB_APP_NAME = WebApp
Property(S): WEB_APP_PORT = 8080
Property(S): WEB_APP_USERNAME = ******
Property(S): WEB_APP_DOMAIN_NAME = ******
Property(S): WEB_APP_SQLSERVER_NAME = ******
Property(S): INCLUDECONFIGFILE = 1
这是默认卸载日志的样子,如果我将 WEB_APP_NAME 更改为其他内容,在上面可以看到的卸载日志中找不到 WEB_APP_NAME?
感谢任何可以解决此问题的想法!
这里要理解的关键是 Windows 安装程序不保存 属性 值。用户输入的值(通过 UI 或通过命令行参数)在修复、升级或卸载期间将不可用。您可能会想,它在卸载期间可用,这是一个简单的要求,但这就是 windows 安装程序的工作方式。绕过这个最简单的解决方案是读取 属性 然后将其写入注册表。在 repair/uninstall/upgrade 期间执行注册表搜索并根据注册表中的内容使用值。
至于为什么在卸载时保留默认值,那是因为initial/default值被添加到MSI Property table。在卸载期间,属性 table 也会使用相同的值。
Note: Please prevent the properties from being changeable during uninstall at least. I think you should only accept changes during fresh install? Or major upgrade? Otherwise the resolved directory name does not match the installed one (same problem you originally had).
Persist Properties:当您允许在设置 GUI 中或通过命令行。否则,当解析为目录或应用程序名称时,属性将为空白 - 或者您在设置中使用它们的任何容量。保留 MSI 属性不是内置 Windows 安装程序功能(只有少数系统属性会自动保留)。通常是 MSI 反模式,但事实就是如此。
"Remember Pattern" 示例:对于常规的 PUBLIC 属性(大写属性),您可以使用 Rob Mensching's remember pattern to save and retrieve property values for repair, modify, uninstall and other maintenance operations. There is a small sample of this property persistence pattern in use here:
Installation Modes: 设置时有多种安装模式需要检查:fresh install
, repair
, modify
, self-repair
, uninstall
, major upgrade uninstall
, patching
、rollback
、resume suspended
(重启和其他原因)等...我至少会测试前 6 种类型 - 确保分辨率正常工作。