我正在开发一些具有自动更新功能的应用程序。实施的想法很简单如下:
- 有一些“启动”应用程序安装到“Program Files / whatever / ...”。这是应用程序,旨在由用户启动
- 每次执行“starter”应用程序时,它会检查服务器是否有更新并将其下载到“%APPDATA%/ some / ...”。然后它从该文件夹启动一些应用程序。
上面的方法是在我的开发机器上运行(运行Vista)和在XP下的其他一些机器上,但是在一些不同的机器(运行Windows 7)下它无法正常工作。当“starter”执行真正的应用程序时,它会崩溃并出现一些未知问题(Signature = System.UnauthorizedAccess)。当从%APPDATA%/ some /文件夹手动执行真正的应用程序时,一切正常。我试图在ProcessStartInfo中设置相同的工作目录,因此“starter”也会在该文件夹中执行真正的应用程序,但这对我没有帮助。
如何诊断和/或解决该问题?
更新
有关如何从启动器运行主进程的更多详细信息:
private static readonly string _ROOT = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp");
...
private static void Run()
{
string startPath = Path.Combine(_ROOT, "MyApp.exe");
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = startPath;
startInfo.WorkingDirectory = _ROOT;
Process.Start(startPath);
}
这肯定会启动正确的进程,因为可以看到应用程序窗口,但Windows可能会拒绝某些磁盘或网络操作,并且启动进程崩溃。
的更新
跟踪显示工作目录不正确,并且在我的代码中指向了不正确的Process.Start(string)方法调用。正确的一行:
Process.Start(startInfo);
答案 0 :(得分:2)
Windows 7更改了部分应用数据位置和权限。确保您使用.Net中Environment
类的“SpecialFolders”枚举,而不是系统中的环境变量。
我也可能尝试使用像ClickOnce或其他预先构建的更新系统,而不是自己动手。这比第一眼看上去更难做到,而你现在遇到的这个问题只是其中一个原因。
答案 1 :(得分:2)
至于你的问题,我给出了崩溃来自丢失的资源或依赖或其权限问题的可能性。您是否尝试使用管理员权限运行应用程序?通常,自Xp以来每个版本的Windows都受到越来越多的限制,尤其是.net运行时。您是否依赖第三方库或DLL?
对于诊断问题,假设您无法访问远程计算机上的调试器,最好的办法是充分利用System.Diagnostics.Trace。您可以从app.config配置跟踪,并使跟踪重定向到本地文件足够简单。还要确保检查事件查看器是否存在任何应用程序级别异常。
随着时间和足够的跟踪声明,您应该足够快地找到问题。
启用跟踪就像在app.config中添加以下内容一样简单。
<system.diagnostics>
<trace autoflush="true" indentsize="3">
<listeners>
<add name="fileOutListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Path.to\File\debug.log" />
</listeners>
</trace>
</system.diagnostics>
然后在整个代码中添加:
System.Diagnostics.Trace.Writeline(System.DateTime.ToString() + " :: I am currently at XX location doing YY");