无法在延迟的自定义操作中获取安装位置属性

时间:2013-08-01 08:06:08

标签: .net wix installshield setup-deployment merge-module

我在阅读完链接后编写了这段代码: 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文件运行时找到正确的值。

1 个答案:

答案 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>