vshost.exe文件的目的是什么?

496
当我在C#中创建和编译“Hello, World!”应用程序时,除了主exe文件(例如HelloWorld.exe)外,在Debug文件夹中还有三个文件。
  1. HelloWorld.vshost.exe
  2. HelloWorld.pdb
  3. HelloWorld.vshost.exe.manifest
这些文件的作用是什么?
6个回答

419

vshost.exe功能是在Visual Studio 2005中引入的(回答您的评论)。

它的主要目的是使调试启动更快 - 基本上已经有一个运行框架的进程,只需在您想要加载应用程序时准备好就可以了。

请参阅此MSDN文章此博客文章以获取更多信息。


29
当我在调试器中运行 Console.Write(System.AppDomain.CurrentDomain.FriendlyName) 时,为什么会得到 app.vshost.exe,而直接从 exe 运行则得到 app.exe 的输出?这是否就是原因? - Milen
@Milen,http://msdn.microsoft.com/en-us/library/ms242202.aspx提到了使用和不使用主机进程时AppDomain.CurrentDomain.FriendlyName的不同结果。 - Thomson
2
如果为了调试目的而存在 vschost 和 .pdb 文件,那么在我编译 Release 版本时为什么还要包含它们呢? - John Smith
2
我猜他们在Visual Studio 2017中将其删除了。 - Felipe Pessoto

177
  • .exe - 普通的可执行文件

  • .vshost.exe - 一个特殊版本的可执行文件,用于辅助调试;有关详细信息,请参见MSDN

  • .pdb - 包含调试符号的程序数据库Program Data Base

  • .vshost.exe.manifest - 一种配置文件,主要包含对库的依赖项


65

vshost.exe文件是Visual Studio的可执行文件(Visual Studio宿主可执行文件)。这个可执行文件链接到Visual Studio并且可以提高调试效率。

当您将应用程序分发给其他人时,不需要使用vshost.exe或.pdb(调试数据库)文件。


我记得在VS2003中我们没有这样的可执行文件(但我们有断点)。你能详细说明一下吗? - Mehrdad Afshari
1
此外,清单是关于应用程序的元数据,通常也会链接到可执行文件中。.pdb文件是便携式调试数据库,包含有关已编译可执行文件的调试信息,例如可执行文件中哪个点对应于代码中的哪一行。 - Joey
3
VS托管进程仅用于改善调试 - 但它并不会启用调试功能。 - Daniel Brückner

25

此外,您可以关闭在Release构建配置中创建vshost文件的选项,并将其启用于Debug

步骤

  • 项目属性 > 调试 > 配置(Release)> 禁用 Visual Studio 托管进程
  • 项目属性 > 调试 > 配置(Debug)> 启用 Visual Studio 托管进程

VS2010截图

参考资料

  1. MSDN:如何禁用托管进程
  2. MSDN:托管进程 (vshost.exe)

摘自MSDN:如何禁用托管进程

当启用托管进程时,对某些 API 的调用可能会受到影响。在这种情况下,需要禁用托管进程以返回正确的结果。

要禁用托管进程:

  1. 在 Visual Studio 中打开可执行项目。不生成可执行文件的项目(例如类库或服务项目)没有此选项。
  2. 项目菜单上,单击属性
  3. 单击调试选项卡。
  4. 清除启用 Visual Studio 托管进程复选框。

当禁用托管过程时,会导致一些调试功能不可用或性能下降。有关更多信息,请参阅调试和托管过程

通常情况下,禁用托管过程会导致以下问题:

  • 启动调试 .NET Framework 应用程序所需时间增加。
  • 设计时表达式求值不可用。
  • 部分信任调试不可用。

11

我不确定,但我认为它是一种调试优化。然而,通常我会关闭它(请参见项目的调试属性),并且我没有注意到任何减速或调试方面的限制。


“Guard”是什么?这里的一个答案中提到了用户吗?还是其他什么东西?您能否更新您的答案(例如使用直接链接,因为用户名随时可能更改)? - Peter Mortensen
我认为这是对另一个答案的引用,但这是在09年,如果我记不清细节,请原谅我。 - Brian Rasmussen

2

这似乎是一个长时间运行的框架进程,用于调试(以减少加载时间?)。我发现当你从调试器两次启动应用程序时,通常会使用相同的vshost.exe进程。它只会首先卸载所有用户加载的DLL。如果你在托管进程中尝试API钩子,它会做一些奇怪的事情。


1
当我的项目有一些代码要进行P/Invoke时,持久进程也会导致异常(访问冲突)。在我禁用主机进程后,问题消失了。 - Thomson

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