Properties 设置目录的Wix自定义操作使用默认值,而不是以前自定义操作中设置的值

Properties 设置目录的Wix自定义操作使用默认值,而不是以前自定义操作中设置的值,properties,directory,wix,custom-action,Properties,Directory,Wix,Custom Action,我想使用自定义操作设置属性,然后立即使用新设置的属性值更新目录。到目前为止,我有一个自定义操作,该操作使用WMI查找单独产品的安装路径,并将属性设置为该值。当我转过身并使用该属性设置目录时,我得到的是旧的/默认值,而不是新的属性值 上下文: 我的目录结构如下: <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder" Name="pf"> <Direc

我想使用自定义操作设置属性,然后立即使用新设置的属性值更新目录。到目前为止,我有一个自定义操作,该操作使用WMI查找单独产品的安装路径,并将属性设置为该值。当我转过身并使用该属性设置目录时,我得到的是旧的/默认值,而不是新的属性值

上下文:

我的目录结构如下:

<Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="ProgramFilesFolder" Name="pf">
     <Directory Id="CompanyName" Name="$(var.companyName)">
       <Directory Id="FooProductName" Name="$(var.prodName)">
         <Directory Id="INSTALL_DIR">
           <Directory Id="PRODUCT_ROOT">
         </Directory>
         <Directory Id="FOO_DIR" Name="NotInstalled">
           <Directory Id="FOO_BINDIR" Name="bin" />
         </Directory>
       </Directory>
     </Directory>
   </Directory>
</Directory>
<Property Id="FOO_INSTALLLOCATION_CHECK_0" Value="AProductName" />
<Property Id="FOO_INSTALLLOCATION_DIR_0" Value="NotInstalledHere" /> 
<CustomAction Id="FooMoveFooDir" Directory="FOO_DIR" Value="[FOO_INSTALLLOCATION_DIR_0]" />
<CustomAction Id="GetInstallLocation" Return="check" BinaryKey="FooCAInstallLoc" DllEntry="GetInstallLocation" Execute="immediate" />

它将目录FOO_DIR设置为FOO_INSTALLLOCATION_DIR_0的默认值,而不是上一步中自定义操作设置的值。搜索指示如何将目录设置为属性值,以及如何使用c#中的自定义操作设置属性,但没有找到对此的答案。

可能您已经尝试过,但无论如何。不要使用自定义操作直接设置目录Id,而是通过属性设置值

<Property Id="Foo_INSTALLDIR" /> 

<Directory Id="TARGETDIR" Name="SourceDir"> 

          <Directory Id="[Foo_INSTALLDIR]" Name="[Foo_INSTALLDIR]"> 

          </Directory>

</Directory> 

查看我如何使用目录*Id=“[Foo\u INSTALLDIR]”*


检查并让我知道

它让我们大致到达了同一个地方:(在这两种情况下,它都在NotInstalledHere设置一个目录——在一种情况下,ID是'FOO_DIR',在另一种情况下,ID是'NotInstalledHere',最初我想我被你的问题弄糊涂了。现在我想我明白了你的问题,你能试试这个吗?Custom Action=“FooMoveFooDir”Before=“CostFinalize”>/自定义>将自定义操作更改为在costfinalize之前运行?很遗憾,如果在costfinalize之前尝试此操作,则会使目录表移动,并且编译会失败。另一方面,我不得不大幅更改过程,因为目标安装机不必安装WMI Windows Installer提供程序。这是不可能的r非常优雅,但由于我们已经为产品的安装位置编写了注册表项,所以我能够使用注册表搜索设置属性,然后使用自定义操作更新目录值……在下一篇评论中继续……所有这些都让我相信,在更新GetI中的属性时,我可能会断开连接nstallLocation和msiexec在会话数据库中看到的内容。我需要重新查看该代码块,以确保我已将便利字典映射到会话数据库的位置良好。我很想知道是否有其他人尝试过此方法,以及他们是否已证明此方法有效。我的雇主肯定会尝试此方法在未来的几年里,事情的发展将越来越频繁。
(UNKNOWN)     Action ended 11:59:35: CostFinalize. Return value 1.
(SERVER)     MSI (s) (20:4C) [11:59:35:643]: Doing action: GetInstallLocation
(UNKNOWN)     Action 11:59:35: GetInstallLocation.
(UNKNOWN)     Action start 11:59:35: GetInstallLocation.
(SERVER)     MSI (s) (20:98) [11:59:35:665]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI2105.tmp, Entrypoint: GetInstallLocation
(SERVER)     MSI (s) (20:E4) [11:59:35:666]: Generating random cookie.
(SERVER)     MSI (s) (20:E4) [11:59:35:667]: Created Custom Action Server with PID 8872 (0x22A8).
(SERVER)     MSI (s) (20:34) [11:59:35:685]: Running as a service.
(SERVER)     MSI (s) (20:34) [11:59:35:687]: Hello, I'm your 32bit Impersonated custom action server.
(UNKNOWN)     SFXCA: Extracting custom action to temporary directory: C:\Windows\Installer\MSI2105.tmp-\
(UNKNOWN)     SFXCA: Binding to CLR version v4.0.30319
(UNKNOWN)     Calling custom action FOO.BAR.Installer.CustomActions.InstallLocation!FOO.BAR.Installer.CustomActions.InstallLocation.CustomActions.GetInstallLocation
(UNKNOWN)     Starting GetInstallLocation
(SERVER)     MSI (s) (20:34) [11:59:35:813]: Running as a service.
[ ... snip ... ]
(SERVER)     MSI (s) (20:A8) [11:59:40:635]: Running as a service.
(UNKNOWN)     Changing FOO_INSTALLLOCATION_DIR_0's value to 'C:\Program Files (x86)\FOO Company\AProductName\
(UNKNOWN)     FOO_INSTALLLOCATION_DIR_0 = 'C:\Program Files (x86)\FOO Company\AProductName\'
(SERVER)     MSI (s) (20:24) [11:59:40:664]: Running as a service.
[ ... snip ... ]
(SERVER)     MSI (s) (20:24) [11:59:44:420]: Running as a service.
(UNKNOWN)     Action ended 11:59:44: GetInstallLocation. Return value 1.
(SERVER)     MSI (s) (20:4C) [11:59:44:465]: Doing action: FooMoveFooDir
(UNKNOWN)     Action 11:59:44: FooMoveFooDir.
(UNKNOWN)     Action start 11:59:44: FooMoveFooDir.
(SERVER)     MSI (s) (20:4C) [11:59:44:467]: Note: 1: 1314 2: NotInstalledHere
(SERVER)     MSI (s) (20:4C) [11:59:44:467]: Note: 1: 1606 2: NotInstalledHere
(UNKNOWN)     Error 1606. Could not access network location NotInstalledHere. 
<Property Id="Foo_INSTALLDIR" /> 

<Directory Id="TARGETDIR" Name="SourceDir"> 

          <Directory Id="[Foo_INSTALLDIR]" Name="[Foo_INSTALLDIR]"> 

          </Directory>

</Directory>