我目前正在使用CustomAction库来读写INI(在C:\ Windows外部)和XML文件。我已经查看过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
...
当然,我现在在安装日志中查看了提示。日志显示: (我认为是立即阶段):
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.
我认为应该是 deferred 阶段(在日志中更进一步):
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都可以访问。
有没有其他人观察到类似的行为,可以给我提示其他方法吗?
答案 0 :(得分:0)
摘要 :您可以使用即时模式自定义操作从INI文件中读取值,并设置Windows使用的属性 安装程序在常规安装过程中以内置方式将值写入实际的INI文件中(无需自定义操作即可写入任何内容,仅用于读取)。 Advanced Installer Sample Video(类似方法)。
自定义操作 :有关自定义操作的几件事:
Captain_Planet
是正确的,该文件尚不存在,或者您遇到了咬人问题尝试访问该文件时,该文件位于磁盘上的其他位置。INI :一个简短的摘要(据我所知):
[MYPROPERTY]
%SystemDrive%\Windows
文件夹中的 文件( C:\Windows
)。
XML :XML的读写完全不是MSI的一部分(与INI写作不同)。所有主要工具都支持XML读写,并且每个工具在外观上都有所不同。
如果可以的话,建议不要在此处滚动自己的功能 那里已经有东西了。