カスタム アクションを使用してプロパティを設定し、すぐに新しく設定したプロパティの値を使用してディレクトリを更新したいと考えています。これまでのところ、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" />
GetInstallLocation は、WMI を使用して、FOO_INSTALLLOCATION_CHECK_0 の値を含むインストール済み製品を検索し、FOO_INSTALLLOCATION_DIR_0 をその値に設定します。これを達成することは、以下のロギング スニペットで証明されています。
<InstallExecuteSequence> に次のものがあります
<Custom Action="FooMoveFooDir" After="CostFinalize">1</Custom>
<Custom Action="GetInstallLocation" Before="FooMoveFooDir">1</Custom>
ロギングは次のようになります (WiLogUtil から):
(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.
ディレクトリ FOO_DIR を、直前のステップでカスタム アクションによって設定された値ではなく、FOO_INSTALLLOCATION_DIR_0 のデフォルト値に設定しています。検索は、ディレクトリをプロパティ値に設定する方法と、C# でカスタム アクションを使用してプロパティを設定する方法を示していますが、これに対する答えは見つかりませんでした。