В настоящее время я работаю над библиотекой CustomAction для чтения и записи файлов INI (за пределами C: \ Windows) и XML. Я уже посмотрел этот вопрос , но предложенные ответы не помогли с моей проблемой. CustomAction (для чтения значения из файла INI), который я пытаюсь выполнить, определен как
<CustomAction Id="MyCustomAction"
Execute="deferred"
Impersonate="no"
Return="ignore"
BinaryKey="MyCALibrary.CA.dll"
DllEntry="MyCustomActionEntry" />
и запланирован как
<InstallExecuteSequence>
<Custom Action="MyCustomAction" After="InstallFiles">
<![CDATA[NOT Installed AND NOT PATCH]]>
</Custom>
</InstallExecuteSequence>
Поскольку это действие с отсрочкой, он получаетданные через свойство:
<Property Id="MyCustomAction"
Value="File=[INSTALLDIR]cfg\MyConfig.ini;Section=MyConfig;Key=MyKey"/>
Реализация (C #) моего CustomAction выглядит следующим образом:
[CustomAction]
public static ActionResult MyCustomActionEntry(Session session)
{
try
{
session.Log("Begin MyCustomActionEntry");
CustomActionData data = session.CustomActionData;
session.Log($"Data: '{data}'.");
string fileName = data["File"];
string sectionName = data["Section"];
string keyName = data["Key"];
// ... check if all properties are set
// ... removed for brevity
session.Log($"- Parametrization: (File={fileName}; Section={sectionName}; Key={keyName}.");
if(File.Exists(fileName))
{
session.Log("File found on disk.");
}
else
{
session.Log("File NOT found on disk.");
}
// ... actual INI Access - F A I L S
}
catch(Exception ex)
{
//... handle any errors
}
}
Используя Orca, я вижу, что CustomAction, скорее всего, запланирован правильно -Таблица InstallExecuteSequence
показывает:
...
InstallFiles 4000
...
MyCustomAction 4001
...
Конечно, я сейчас посмотрел журнал установки для подсказок. Журнал показывает: (в том, что я предполагаю, немедленная фаза):
Action ended <time>: InstallFiles. Return value 1.
MSI (s) (F8:98) <time>: Doing action: MyCustomAction
Action start <time>: MyCustomAction.
Action ended <time>: MyCustomAction. Return value 1.
Для того, что я думаю, будет отложенная фаза (далее вlog):
MSI (s) (F8:98) <time>: Executing op: FileCopy(SourceName=qjlzmwkb.ini|MyConfig.ini,SourceCabKey=<key>,DestName=MyConfig.ini,...,InstallMode=58982400,...)
MSI (s) (F8:98) <time>: File: C:\tmp\MyApp\cfg\MyConfig.ini; To be installed; Won't patch; No existing file
MSI (s) (F8:98) <time>: Source for file '<key>' is compressed
...
Begin MyCustomActionEntry
...
Data: 'File=C:\tmp\MyApp\cfg\MyConfig.ini;Section=MyConfig;Key=MyKey'.
...
- Parametrization: (File=C:\tmp\MyApp\cfg\MyConfig.ini; Section=MyConfig; Key=MyKey).
...
File NOT found on disk.
После завершения установки файл находится именно там, где я его ожидаю - месте, указанном в настраиваемом действии.
Я предполагаю, что установленные файлы должны быть доступны на диске после InstallFiles
на этапе отложенной фазы выполнения для доступа любых пользовательских действий. Кто-нибудь еще наблюдал подобное поведение и может подсказать, что еще делать?