.NET字符串[]运算符从ToString()返回不同的内容
我有一个从InstallShield执行的.NET自定义操作(DTF) 在.NET CA中,我正在提取一个MSI属性,其值为“.NET字符串[]运算符从ToString()返回不同的内容,.net,.net,我有一个从InstallShield执行的.NET自定义操作(DTF) 在.NET CA中,我正在提取一个MSI属性,其值为“”[CommonAppDataFolder]abc\def.txt” 该属性的访问方式如下: string val = session["MY_PROPERTY"]; // Microsoft.Deployment.WindowsInstaller.Session 当我将这个变量打印到日志文件时,我得到:C:\ProgramData\abc\def.txt。这就是我所期
”[CommonAppDataFolder]abc\def.txt”
该属性的访问方式如下:
string val = session["MY_PROPERTY"]; // Microsoft.Deployment.WindowsInstaller.Session
当我将这个变量打印到日志文件时,我得到:C:\ProgramData\abc\def.txt
。这就是我所期望的
但是,当我使用[]
操作符逐个字符查看时,我会从未替换的值中获取字符:
[CommonAppDataFolder]…
例如,val[0]
是'['
而不是'C'
这到底是怎么可能的
另外,=
,字符串.compare()
,!=
等都没有给出预期的结果(我可以想象它们在引擎盖下面使用了[]
操作符)
编辑:
我就是这样记录的:
session.Log(“文件名:{0}”,val);
这就是我逐字打印的方式:
for (int i = 0; i < val.Length; i++)
{
session.Log(val[i].ToString());
}
for(int i=0;i
字符串val仍然包含未替换的版本,因此for循环工作正常。会话中的Log()方法使用“val”作为formatstring(而不是文字),在写入结果之前,它会用实际值替换任何占位符 如果您下载了调试符号(在这里发布输出可能不合法),您可以看到这种情况 简而言之,Log()调用Message()并在它所指的msdn页面中调用。在该文档的末尾,它解释了自动发生的替换。在这种情况下,最明显的是:
- 如果遇到[propertyname]形式的子字符串,则该子字符串将替换为属性的值
- 如果找到[%environmentvariable]形式的子字符串,则替换环境变量的值
string formattedVal = session.Format(val)
for (int i = 0; i < formattedVal.Length; i++)
{
session.Log(formattedVal[i].ToString());
}
string formattedVal=session.Format(val)
for(int i=0;i
您能展示这两种情况下的代码吗?这肯定不是内置在字符串中的。请展示更多您的日志记录方式。@jonsket:session.Log(“文件名:{0}”,val);这很难买到。session indexer(MsiGetProperty)涉及本机api调用但这首先要经过一个StringBuilder。那里有很多隔离。堆损坏是一个很长的机会。@HansPassant发生这种情况的一种有趣的原因(见答案)你从哪里得到这些符号的?很吸引人(对我来说)该日志对message@LemonBeagle.我在symbolserver设置中使用了resharpers'goto declaration'。检查输出窗口后,我发现它没有找到符号,而是进行了反编译。