Wix: запись файла в настраиваемом действии
У меня проблема с wix и управляемыми настраиваемыми действиями: в своем настраиваемом действии я создаю файл и сохраняю его по пути INSTALLLOCATION. Кажется, что это работает, не исключение не выбрасывается. Но после установки, только что созданный файл не существует в INSTALLLOCATION.
WiX-файл:
<CustomAction Id="SetInstallPath" Property="CreateTimeStamp" Value="[INSTALLLOCATION]"
Execute="immediate"/>
<CustomAction Id="CreateTimeStamp" BinaryKey="SetupActions.dll"
DllEntry="CreateTimeStampFile" Execute="deferred" Return="check"/>
<InstallExecuteSequence>
<Custom Action="SetInstallPath" Before="InstallFinalize"/>
<Custom Action="CreateTimeStamp" Before="InstallFinalize"/>
</InstallExecuteSequence>
Пользовательские-Action-Methode:
...
var keys = new string[session.CustomActionData.Keys.Count];
session.CustomActionData.Keys.CopyTo(keys, 0);
var cad = keys[0];
var filepath = cad + "myfile.xml";
File.Create(filepath);
...
Есть идеи?
Отредактировано: после сообщения от Скотта Беттжера y отредактировал содержимое файла wix.
2 ответа
Решение
Я не думаю, что ваша конфигурация правильная. Вот некоторые из проблем:
- Вы не должны использовать частные свойства в InstallExecuteSequence (CREATE_TIME_STAMP лучше, чем CreateTimeStamp, потому что это открытое свойство).
- Вы устанавливаете свойство CreateTimeStamp и читаете CustomActionData внутри своего настраиваемого действия. Необходимо установить для свойства CustomActionData путь INSTALLLOCATION.
- Так как пользовательское действие создает файл в папке установки, оно должно запускаться как отложенное, а для атрибута Impersonate должно быть установлено значение "no". Таким образом, у него будет достаточно прав для создания файла.
Попробуйте внести эти изменения и посмотреть, если проблема не устранена.
Я считаю, что ваши пользовательские действия должны находиться между InstallInitialize и InstallFinalize. Попробуй это:
<InstallExecuteSequence>
<Custom Action="SetInstallPath" After="InstallInitialize"/>
<Custom Action="CreateTimeStamp" Before="InstallFinalize"/>
</InstallExecuteSequence>