Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET字符串[]运算符从ToString()返回不同的内容_.net - Fatal编程技术网

.NET字符串[]运算符从ToString()返回不同的内容

.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。这就是我所期

我有一个从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]…
例如,
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'。检查输出窗口后,我发现它没有找到符号,而是进行了反编译。