我有一个WIX(V3.11.1)安装程序,我在其中基于传递给Custom Action的值创建FileInfo。
传递给“定制操作”的值是正确的,session.CustomActionData["INSTALLFOLDER"]
返回正确的路径,即C:\Program Files(x86)\MyApplication
。
不幸的是,当我创建FileInfo targetDir = new FileInfo(session.CustomActionData["INSTALLFOLDER"])
时,targetDir.FullName
的结果是C:\Windows\Installer\MSIE335.tmp-\C:\Program Files(x86)\MyApplication\
。
我试图找到有关FileInfo构造函数如何工作的任何信息,但没有任何结果。
您有任何想法为什么C:\Windows\Installer\MSIE335.tmp-\
出现在FileInfo中以及如何使用真实路径创建它吗?
我用来检查所有值的代码:
string path = session.CustomActionData["INSTALLFOLDER"];
session.Log(path); //result is C:\Program Files(x86)\MyApplication
FileInfo targetDir = new FileInfo(path);
session.Log(targetDir.FullName); // result is C:\Windows\Installer\MSIE335.tmp-\C:\Program Files(x86)\MyApplication\
最佳答案
我的设置感觉是您的INSTALLFOLDER
中的CustomActionData
值实际上是值[INSTALLFOLDER]
。记录时,该语法将解析为适当的值。这就是为什么看起来不错。但是,FileInfo
实际获得的值是这样的:
FileInfo targetDir = new FileInfo("[INSTALLFOLDER]");
当然哪个是“当前目录中名为“ [INSTALLFOLDER]”的文件”。这与您的第二条日志行匹配。
解决方法是确保您在CustomActionData中传递
INSTALLFOLDER
的值。有几种不同的方法可以执行此操作,具体取决于您如何计划延迟的自定义操作和设置named属性。例如,使用SetProperty
应该是修复它的简便方法。更新:Hawex提供了一个定义自定义操作的代码段。它看起来像:
<Property Id="CustomActionOnInstall" Value="INSTALLFOLDER=[INSTALLFOLDER]" />
<CustomAction Id="CustomActionOnInstall" BinaryKey="CustomActions" Execute="deferred"
Impersonate="no" DllEntry="OnInstall" Return="check" />
<InstallExecuteSequence>
<Custom Action="CustomActionOnInstall" Before="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>
要进行修复,只需将静态(未评估)的
Property
更改为SetProperty
即可,如下所示:<SetProperty Id="CustomActionOnInstall" Value="INSTALLFOLDER=[INSTALLFOLDER]"
Before="CustomActionOnInstall" Sequence="execute" />
关于c# - 在WIX自定义操作中使用System.IO.FileInfo将意外的字符串添加到路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55455799/