【发布时间】:2020-02-29 18:28:06
【问题描述】:
我目前正在开发用于读取和写入 INI(C:\Windows 之外)和 XML 文件的 CustomAction 库。我已经看过this SO question,但建议的答案对我的问题没有帮助。我尝试执行的 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"/>
我的 CustomAction 的 (C#) 实现如下所示:
[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
...
当然,我现在查看了安装日志以获取提示。日志显示: (我猜是 immediate 阶段):
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.
对于我认为是 延迟 阶段(在日志中更下方):
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 之后安装的文件应该在磁盘上可用,以供任何 CustomAction 访问。
有没有其他人观察到类似的行为,可以给我提示我还能做什么?
【问题讨论】:
-
我不禁注意到您传递的文件是一个 INI 文件。难道这个文件位于 IniFile 表而不是 File 表中?因此,您需要安排自定义操作在 WriteIniValues 而不是 InstallFiles 之后执行......
-
INI文件位于文件表中;要安装的文件也全部用热收集 - 使用
HeatDirectory元素。使用 Orca,我什至看不到 IniFile 表。 -
您确定自定义操作延迟运行吗?您可以为此添加您的 WiX 标记以便我们查看吗?
-
我不确定我是否完全理解。除了我的问题顶部的三个 sn-ps 之外,WiX 标记还有更多吗?
标签: wix windows-installer custom-action