2012-10-19 46 views
3

我有一個從InstallShield執行的.NET自定義操作(DTF)。.NET String []運算符從ToString()返回不同的東西

在.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'

這是怎麼可能的呢?

此外,==string.compare()!=,等等都沒有給預期的結果(我想像這些使用[]操作引擎蓋下面)。

編輯:

這是我如何登錄: session.Log("File name: {0}", val);

這是我如何打印字符一個字符:

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

你能顯示了兩種情況的代碼? –

+0

這絕對不是內置於'string'中的。請更多地展示你如何登錄。 –

+0

@JonSkeet:session.Log(「文件名:{0}」,val); – jglouie

回答

5

字符串VAL確實還包含未被取消的版本,所以for循環工作正常。
會話中的Log()方法使用'val'作爲格式字符串(而不是文字),在寫入結果之前用實際值替換任何佔位符。

如果你下載了調試符號(輸出可能不合法在這裏發佈),你可以看到發生這種情況。

總之Log()調用Message()和那個調用MsiProcessMessage()在那個msdn頁面中是指MsiFormatRecord()。在該文件的末尾,它解釋了自動發生的替換。最值得注意的是這種情況:

  • 如果遇到形式將[PropertyName]的一個子,它是由屬性的值替換。
  • 如果找到[%environmentvariable]形式的子字符串,則會替換環境變量的值。

嘗試下面的代碼,讓您預期的結果

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

你從哪裏得到符號? – jglouie

+0

令人着迷的(對我來說)日誌對@LemonBeagle的消息 – jglouie

+0

做了一些修改。我使用符號服務器設置的resharpers'goto聲明'。檢查輸出窗口我現在看到它沒有找到符號,而是做了反編譯。 – Eddy

相關問題