3

この質問はかなりローカライズされている可能性がありますが、ここで何が間違っているかについて別の意見が必要です。プロセスのすべての段階で、すべて正常に動作しているように見える場合、一時ファイルへのパスに不正な文字を渡すにはどうすればよいですか?

私はこれを得ています:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentException: Illegal characters in path.

これを渡すとき:

"C:\Documents and Settings\<username>\Local Settings\Temp\1\tmp1E0.tmp"

これに:

XmlDocument doc = new XmlDocument();
doc.Load(<above string>);

ファイルは指定された場所に存在します(実行中に確認しました)が、System.IO.File.Existsそうではないと考えています。明らかなものは何も見えません。それを回避するために何かできることはありますか?

リクエストに応じて利用可能なその他のコード:

REQ1: あなたのパスはどのように宣言されていますか?

try
{
    session.TempConfigDir = System.IO.Path.GetTempFileName();
    //All work done with the temp file happens within the Form
    Form currentform = new WelcomeDialog(session);
    DialogResult dr = currentform.ShowDialog();
}
finally
{
    File.Delete(session.TempConfigDir);
}

セッション変数はさまざまな場所に渡されますが、変更されません。

REQ2: 実際に使ってい<username>ますか?

いいえ、編集しました。有効な Windows ユーザー名です。

REQ3: デバッグから得られるものは何ですか?

これは実際にはインストーラー内で発生しています (物理的にデバッグするのは少し難しいです) が、上記の文字列はログから取得できるものの例であり、もちろん有効なユーザー名が含まれています。

REQ4: 使用方法に関するコードを追加してください。

これには WiX3.7 が関係するため、WiX タグを追加します。

基本データ保持クラス:

public class SessionState
{
    //<other properties>
    public string TempConfigDir { get; set; }

    public SessionState()
    {
        //Setting of properties
    }
}

フォーム内から:

//StringBuilder for arguments
installerargs.Append("\" TEMPCONFIGDIR=\"");
installerargs.Append(m_Session.TempConfigDir);
//...
Process p = Process.Start("msiexec", installerargs.ToString());
p.WaitForExit();

追加: フォームから欠落している部分:

//It's grabbing the web.config from an existing install
//and copying it over the temp file, not changing its location or name.
File.Copy(m_Session.INSTALLDIR + DIR_WEB_CONFIG, m_Session.TempConfigDir, true);

WiX3.7 の MSI 内から:

<Property Id="TEMPCONFIGDIR" Value="UNSET" />

...

<Custom Action="CA_InstallUICA.SetProp" After="StartServices">NOT Installed</Custom>
<Custom Action="CA_InstallUICA" After="CA_InstallUICA.SetProp">NOT Installed</Custom>

...

<CustomAction Id="CA_InstallUICA.SetProp" Property="CA_InstallUICA" Value="rcswebdir=[MCWSVDIR];webdir=[WEBAPPVDIR];installtype=notransaction;targetdir=[INSTALLDIR];interaction=[INTERACTION];tempconfigdir=&quot;[TEMPCONFIGDIR]&quot;;" />

それを使用するカスタム アクション内から:

wz.AutoSettings.TempConfigLocation = session.CustomActionData["tempconfigdir"];
//Where I get the above string passed out
session.Log(wz.AutoSettings.TempConfigLocation);
//The rest of the code that uses it is above and where the exception is thrown

REQ5: TempConfigDir 変数を something.xml に変更しますか?

いいえ、指定された正確な名前/ディレクトリ (を含む) に xml ファイルをコピーします.tmp

REQ6: 本当に .Load() で起こっているのですか?

はい、行の両側をログに記録し、実行時に最初の行のみをヒットしました。

4

1 に答える 1

2

この行は疑わしいようです:

<CustomAction Id="CA_InstallUICA.SetProp" Property="CA_InstallUICA" Value="rcswebdir=[MCWSVDIR];webdir=[WEBAPPVDIR];installtype=notransaction;targetdir=[INSTALLDIR];interaction=[INTERACTION];tempconfigdir=&quot;[TEMPCONFIGDIR]&quot;;" />

パスを引用している部分は、引用符を二重にしている可能性が高いため、例外が発生します。

tempconfigdir=&quot;[TEMPCONFIGDIR]&quot;

&quote;実際のパスを提供するためにラッピングを削除します。

tempconfigdir=[TEMPCONFIGDIR]
于 2013-07-17T14:30:30.533 に答える