我在阅读完链接后编写了这段代码: http://blogs.technet.com/b/alexshev/archive/2008/03/25/property-does-not-exist-or-empty-when-accessed-from-deferred-custom-action.aspx
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Module Id="MergeModule1" Language="1033" Version="1.0.0.0">
<Package Id="cffa568e-1bf0-4eb3-bee3-eb5801a0bbd0" Manufacturer="Microsoft" InstallerVersion="200" />
<Binary Id="myCustomActionsDLL" SourceFile="CustomAction1.CA.dll" />
<CustomAction Id="SetProperty" Execute="immediate"
Property="CA_myCustomAction"
Value="InstallDir=[PRIMARYFOLDER];SourceDir=[SourceDir]" />
<CustomAction
Id="CA_myCustomAction"
BinaryKey="myCustomActionsDLL"
DllEntry="CustomAction1"
Execute="deferred" Impersonate="no"
Return="check" />
<InstallExecuteSequence>
<Custom Action="SetProperty" Before="InstallInitialize">Not Installed</Custom>
<Custom Action="CA_myCustomAction" Before="InstallFinalize">Not Installed</Custom>
</InstallExecuteSequence>
<!--<InstallUISequence>
<Custom Action="CA_myCustomAction" After="CostFinalize"></Custom>
</InstallUISequence>-->
</Module>
</Wix>
代替InstallDir - PRIMARYFOLDER
,我尝试过--InstallLOCATION,InstallDir,TargetDir但是我无法获得为ProgramFiles(x86)下的应用程序指定的安装文件夹。
SourceDir
的值将在MSI文件运行时找到正确的值。
答案 0 :(得分:4)
您的故障排除应始终从生成和阅读详细日志开始。一次可能存在几个问题,需要同时修复。
首先,您的Type 51设置属性自定义操作是在InstallInitialize之前安排的。该属性不是安全的自定义属性,因此不会传递到事务中。请尝试在InstallInitialize之后安排它。
其次是你在合并模块中并且合并模块模块化(附加GUID)几乎所有标识符。如果你看看ORCA中的构建合并模块,你会发现它不是在寻找INSTALLDIR,它正在寻找INSTALLDIR.GUID。
如果你真的必须使用INSTALLDIR,你想要定义一个没有值的名为INSTALLDIR的属性,并使用SuppressModularization属性来阻止GUID。我通常采用的方法是定义一个MergeRedirectFolder目录并使用它。然后,当我将合并模块添加到InstallShield时,我将模块关联到INSTALLDIR,然后传递性质接管。
可能还有其他问题,但如果不查看最终的MSI并阅读日志,很难看到。
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Module Id="MergeModule2" Language="1033" Version="1.0.0.0">
<Package Id="c4acbfbc-a0e8-4d52-b516-bee471a76e8a" Manufacturer="" InstallerVersion="200" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="MergeRedirectFolder"/>
</Directory>
<Binary Id="myCustomActionsDLL" SourceFile="CustomAction1.CA.dll" />
<CustomAction Id="SetProperty" Execute="immediate"
Property="CA_myCustomAction"
Value="InstallDir=[MergeRedirectFolder];SourceDir=[SourceDir]" />
<CustomAction Id="CA_myCustomAction"
BinaryKey="myCustomActionsDLL"
DllEntry="CustomAction1"
Execute="deferred" Impersonate="no"
Return="check" />
<InstallExecuteSequence>
<Custom Action="SetProperty" After="InstallInitialize">Not Installed</Custom>
<Custom Action="CA_myCustomAction" Before="InstallFinalize">Not Installed</Custom>
</InstallExecuteSequence>
</Module>
</Wix>