3

我有一个从 InstallShield 执行的 .NET 自定义操作 (DTF)。

在 .NET CA 中,我正在提取一个值为"[CommonAppDataFolder]abc\def.txt".

该属性的访问方式如下:

string val = session["MY_PROPERTY"]; // Microsoft.Deployment.WindowsInstaller.Session

当我将此变量打印到日志文件时,我得到:C:\ProgramData\abc\def.txt. 这是我所期望的。

但是,当我使用[]运算符逐个字符查看时,我会从未替换的值中获取字符: [CommonAppDataFolder]...例如,val[0]is'['而不是'C'.

这怎么可能?

此外,==, string.compare(),!=等都没有给出预期的结果(我想这些使用[]引擎盖下的运算符)。

编辑:

这就是我记录的方式: session.Log("File name: {0}", val);

这就是我逐字符打印的方式:

for (int i = 0; i < val.Length; i++) 
{ 
    session.Log(val[i].ToString());
}
4

1 回答 1

5

字符串 val 仍然包含未替换的版本,因此 for 循环可以正常工作。
会话中的 Log() 方法使用 'val' 作为格式字符串(而不是文字),它在写入结果之前将任何占位符替换为实际值。

如果您下载调试符号(输出可能在此处发布不合法),您会看到这种情况。

简而言之, Log() 调用 Message() 并在该 msdn 页面中调用MsiProcessMessage()它指的是MsiFormatRecord()。在该文档的末尾,它解释了自动发生的替换。在这种情况下最值得注意的是:

  • 如果遇到 [propertyname] 形式的子字符串,则将其替换为属性的值。
  • 如果找到 [%environmentvariable] 形式的子字符串,则替换环境变量的值。

尝试以下代码以获得您的预期结果

string formattedVal = session.Format(val)
for (int i = 0; i < formattedVal.Length; i++)  
{  
    session.Log(formattedVal[i].ToString()); 
} 
于 2012-10-19T23:01:37.190 回答