我有一个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/

10-13 06:47