在 Visual Studio 调试会话期间如何查找当前目录?

24

如何在Visual Studio调试器下查找.NET应用程序的当前目录?

更新1:明确一点:我不想改变代码或从程序本身获取信息 - 我只想获取有关当前正在调试的应用程序的信息。

在调试一个混合VB.NET和C#的.NET Windows Forms应用程序时,我不确定一个XML文件是从哪个位置读取的。我希望当前目录是应用程序的目录。然而,使用Process Explorer,进程属性显示:

D:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\

(右键单击进程/属性/选项卡 映像/当前目录)。

将鼠标指针悬停在Process Explorer的主视图中的进程上会显示不同的结果(见下面的屏幕截图):

D:\dproj\DTASCall\DTASuperCharge\bin\

哪一个是正确的呢?

单独启动应用程序会在Process Explorer进程属性窗口中显示预期的当前目录:

D:\dproj\DTASCall\DTASuperCharge\bin\


Process Explorer的注释屏幕截图:

Alt text http://www.pil.sdu.dk/1/until2039-12-31/PEdiscrepancy_2009-09-02.png

3个回答

33

在Visual Studio中,在项目的设置中,可以通过“调试”标签页设置“工作目录”。

要在代码或断点的立即窗口中确定当前工作目录,请尝试:

System.IO.Directory.GetCurrentDirectory()

1
对于即时窗口:难道不是“Debug.Print(System.IO.Directory.GetCurrentDirectory())”吗? - Peter Mortensen
2
替代即时窗口:菜单调试/快速监视/<输入表达式>/按重新评估。或者在常规监视窗口的名称列的最后一行输入,然后按回车键。 - Peter Mortensen
4
或者在立即窗口中,您始终可以执行“? System.IO.Directory.GetCurrentDirectory()”来返回已转换的文本。 - Philip Rieck
1
我使用了这个答案,但将其修改为 "? System::IO::Directory::GetCurrentDirectory()" 以调试CLI\C++。 - Alex

4
在你的代码中,调用函数

System.IO.Directory.GetCurrentDirectory()

默认情况下,除非您更改了项目的调试属性,否则当前目录将从项目的bin\Debug目录开始(即.exe运行的位置)。


实际程序未运行是什么意思?在截图时,程序已在断点处停止。 - Peter Mortensen
嗯,我明白你的意思。我对.vshost的理解是错误的 - 我刚刚检查了同样的事情,procexp没有任何问题地跟踪我的当前工作目录。尝试比较System.IO.Directory.GetCurrentDirectory()的输出 - 使用默认项目设置,这应该是您应用程序的bin\Debug目录。如果您要读取的XML文件是项目项,请确保将Build Action属性设置为“Content”,并适当设置Copy to Output Directory属性。也许从应用程序的根目录而不是当前目录读取对您有帮助。 - Richard
1
调试页面上的“工作目录”字段为空。但是在编译页面上,“生成输出路径”字段包含“bin\”。它应该为空吗?此项目由Visual Studio 2003创建,并经历了两次Visual Studio更新。当前应用程序从bin目录而不是bin/Debug目录启动。 - Peter Mortensen
听起来不错。对于默认的C#项目,输出路径将是bin\Debug,工作目录字段为空。 - Richard
初始项目是一个VB.NET项目(我在上面列出了设置)。 - Peter Mortensen

-3

最好的方法是在WinDbg(Windows调试器)中运行应用程序,然后附加到进程并运行!handle命令。每个打开的文件都将有一个关联的句柄。通过转储相应进程的所有句柄,您将看到相应的文件路径。

这里是一个例子:

!handle 0 f process-id

将进程 ID 替换为您的进程 ID 值。您还可以使用进程地址代替进程 ID。如果这不显示文件对象,则文件句柄已关闭。在这种情况下,您需要跟踪句柄。可以使用 !htrace 命令来完成此操作。


Philip Rieck的下面的帖子是正确的答案:“System.IO.Directory.GetCurrentDirectory()”。 - Jeson Martajaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接