运行已安装的应用程序时,Environment.CurrentDirectory会产生意外结果
背景:
我为我的应用程序构建了一个安装程序,所有我的dll和内容文件都被正确地复制到C:\Program Files\MyCompany\MyApp
目录。 当我从Visual Studio运行我的应用程序时,一切都很好。 但是,当我运行我的应用程序的安装版本时,我收到DirectoryNotFoundException
。 问题似乎与Environment.CurrentDirectory
。
我期待Environment.CurrentDirectory
是……
"C:\\Program Files\\MyCompany\\MyApp"
……但实际上……
"C:\\Documents and Settings\\DanThMan"
这里发生了什么? 我该如何解决这个问题?
谢谢。
编辑:
好的,嗯。 如果我运行开始菜单快捷方式,则只会出现此问题。 如果我直接运行MyApp.exe,一切都很好。
编辑2:
我想我现在已经深究了这一点。 在我的安装程序(Visual Studio SetupProject)中,“开始”菜单快捷方式有一个名为WorkingFolder
的属性,该属性“指定将安装快捷方式的目标应用程序的文件夹”。 我不小心将WorkingFolder
设置为“MyCompany”。 它应该是“应用程序文件夹”。 现在我已正确设置它, Environment.CurrentDirectory
再次按预期工作。 感谢你的帮助。
编辑3:
但是,阅读下面的警告,我决定使用以下内容作为Environment.CurrentDirectory
的替代:
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
如果要获取运行可执行文件的目录的路径,则不应依赖于Environment.CurrentDirectory,因为它可以通过多种方式进行更改(shotrtcut设置等)。 请尝试以下选项之一:
System.IO.Path.GetDirectoryName(Application.ExecutablePath);
要么
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
使用Application.StartupPath
而不是Environment.CurrentDirectory
。
我遇到过类似的问题,在没有我意识到的情况下, OpenFileDialog
类的东西无意间改变了CurrentDirectory
。
在您的情况下,听起来您正在启动申请表的过程正在改变您不知道的CurrentDirectory
。
由于您说您的应用程序使用的是WPF,因此您可以使用以下代码而不是Application.StartupPath:
String appPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
启动程序时,除非启动应用程序指定不同的工作目录,否则当前目录通常与启动应用程序的目录相同。 它确实可以在磁盘上的任何位置。
在您的情况下,在两种情况下,启动应用程序都是shell(explorer.exe)。 它在启动程序时指定工作目录,具体取决于启动的上下文。 您已经看到两种不同的情况(在资源管理器中双击文件,然后从开始菜单运行); 在这两种情况下,您还发现了Microsoft认为当前目录最合理的值:用户的主目录和资源管理器中显示的目录(分别)。
Environment.CurrentDirectory包含当前目录,它实际上是当前目录。 价值取决于许多因素。 任何应用程序都可能更改该值。 此值仅与您的应用程序无关。
如果要获取启动目录,请使用Application.StartupPath。