这个问题可能非常本地化,但我真的需要对我在这里做错了什么提出另一种看法。当在过程的每个阶段,一切似乎都很好和正常时,我怎么能在临时文件的路径中传递非法字符?
我得到这个:
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: 关于如何使用的更多代码?
我正在添加 WiX 标签,因为这涉及 WiX3.7。
基本数据持有类:
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="[TEMPCONFIGDIR]";" />
从使用它的自定义操作中:
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() 上吗?
是的,我已经记录了线路的每一侧,并且在执行时只点击了第一侧。