我在设置TARGETDIR路径时遇到问题。我使用dark.exe
对正在运行的MSI文件进行反向工程并阅读我在此主题上可以找到的任何帖子,但我似乎无法将TARGETDIR设置为指向路径ProgramFiles\Manufacturer\Product
。下面是我的WXS文件的提取,导致我的应用程序由于某种原因安装到我的D驱动器的根目录:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*"
Name="FBL - Some App"
Language="1033"
Version="1.0.0.0"
Manufacturer="Foo & Bar Limited"
UpgradeCode="780286c6-e064-4402-80d8-dd2c68b56c04">
<Package InstallerVersion="200"
Compressed="yes"
InstallScope="perMachine"
Comments="Performs some operation that is important" />
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<Media Id="1" Cabinet="App.1.0.0.cab" EmbedCab="yes" />
<CustomAction Id="setTARGETDIR"
Property="TARGETDIR"
Value="[ProgramFilesFolder][Manufacturer]\[ProductName]"
Execute="firstSequence"
Return="check" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Component Id="C__App.exe"
Guid="{074586E9-A675-2734-A4CD-1CE520922A41}">
<File Id="F__App.exe"
Name="App.exe"
KeyPath="yes"
Assembly=".net"
AssemblyManifest="F__App.exe"
AssemblyApplication="F__App.exe"
DiskId="1"
Source="D:\SomePath\bin\Debug\App.exe" />
</Component>
</Directory>
<Feature Id="DefaultFeature" ConfigurableDirectory="TARGETDIR" Level="1">
<ComponentRef Id="C__App.exe" Primary="yes" />
</Feature>
<Icon Id="favicon.ico" SourceFile="d:\SomePath\favicon.ico" />
<Property Id="ARPPRODUCTICON" Value="favicon.ico" />
<UI />
<InstallExecuteSequence>
<Custom Action="setTARGETDIR" Before="CostFinalize" />
</InstallExecuteSequence>
</Product>
</Wix>
我确信我遗漏了一些简单的东西,但我找不到任何有关该怎么做的更多信息。
答案 0 :(得分:5)
需要进行以下修改:
<CustomAction Id="SetTARGETDIR"
Directory="TARGETDIR"
Value="[ProgramFilesFolder][Manufacturer]\[ProductName]"
Return="check" />
和
<InstallExecuteSequence>
<Custom Action="SetTARGETDIR" After="InstallValidate" />
</InstallExecuteSequence>
说明:使用Directory属性而不是属性(它是类型35自定义操作)并在执行序列中的InstallValidate
之后安排此操作 - 即检查目录是否具有写入权限并真正设置。
(感谢来自WiX用户组的Narina Chandra Sekhar对此的回答。)
答案 1 :(得分:2)
这很奇怪......我遇到了同样的问题,但你的答案并不适合我。我只需要这个:
<Product>
<SetProperty Id='TARGETDIR' Value='[ProgramFilesFolder][Manufacturer]\[ProductName]\' Before='FindRelatedProducts' />
...
</Product>
但是我再次认为我的安装程序中的其他内容可能已经从属性中设置了TARGETDIR目录;我正在处理一些遗留的东西。
编辑:实际上,这是一个坏主意。很多时候,内置的一些自定义操作可以在安装过程的不同部分调用,因此最好添加自定义操作来设置属性。
这对我有用:
<Product>
<CustomAction Id='SetTARGETDIR' Property='TARGETDIR' Value='[ProgramFilesFolder][Manufacturer]\[ProductName]\'/>
...
</Product>
<InstallUISequence>
<Custom Action='SetTARGETDIR' Sequence='1'/>
...
</InstallUISequence>
<AdminUISequence>
<Custom Action='SetTARGETDIR' Sequence='1'/>
...
</AdminUISequence>
答案 2 :(得分:0)
没有什么对我有用,所以我所做的是使用命令行运行msi来设置安装目录的属性。默认情况下,我的程序将安装到驱动器C,但有时我希望它安装到D驱动器,所以这就是我做的:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="XServer">
</Directory>
</Directory>
</Directory>
这是命令行:
XServer.msi / L * v log.log APPLICATIONROOTDIRECTORY =“D:\ Program Files(x86)\ XServer”
答案 3 :(得分:0)
这实际上对我有用。 CostFinalize
操作是定义TARGETDIR
目录的位置。
<SetProperty Id="TARGETDIR" Value="[ROOTDRIVE]MyCompany" Sequence="first" Before="CostFinalize">NOT Installed AND NOT TARGETDIR</SetProperty>
答案 4 :(得分:0)
我尝试通过自定义操作更改安装目录(因为我需要代码来找出带有代码的路径 - 长话短说),什么为我解决了这个问题 - 我必须将自定义操作安排为:
>After="CostInitialize"