3

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'ます。

これは世界でどのように可能ですか?

また==、、、、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 に答える