首页 > 代码库 > .net VHost的作用

.net VHost的作用

宿主进程 [*.vshost.exe] & [*.vshost.exe.config]

问题缘起:

  Release 模式下编译发布WPF项目,会生成[*.vshost.exe] & [*.vshost.exe.config]文件。当需要临时手动修改[*.config]中的一些配置信息时,[*.vshost.exe.config] & [*.exe.config]是否都要修改?[*.vshost.exe] & [*.vshost.exe.config]是否可以删除?

宿主进程 [*.vshost.exe] & [*.vshost.exe.config]

  [*.vshost.exe] 也叫宿主进程,是VS2005/2008/2010中的一项功能,能提高调试性能,支持部分信任调试并支持设计时表达式计算。宿主进程文件的文件名中包含 vshost, 并位于项目的输出文件夹中。

  托管程序是通过[*.vshost.exe]启动的,而[*.vshost.exe]是一个固定的程序,在每次启动调试过程前,VS会把[*.vshost.exe]拷贝到被调试进程的同一目录里面,然后在后台帮你启动[*.vshost.exe]以便节省调试时间,直到你关闭VS或者关闭当前的VS解决方案(.sln文件),VS才会终止[*.vshost.exe].

  [*.vshost.exe]负责创建应用程序域并将调试器和自身关联起来,因为在你调试你的.NET工程的时候,[*.vshost.exe]只启动一次,因此避免了每一次调试.NET可执行文件时准备调试环境的过程,然后[*.vshost.exe]使用AppDomain.ExecuteAssembly函数来执行我们的可执行文件。

宿主进程文件 (.vshost.exe) 由 VS使用,不应通过应用程序直接运行或部署。

提高调试性能

  宿主进程创建一个应用程序域并将调试器与应用程序关联起来。执行这些任务会导致在开始调试和开始运行应用程序之间有很明显的延迟。通过在后台创建应用程序域和关联调试器,并在运行应用程序之间保存应用程序域和调试器状态,宿主进程使性能得到提高。

技术分享

部分信任调试

  在“项目设计器”的安全页中,可将应用程序指定为部分信任应用程序。调试部分信任应用程序需要对应用程序域进行特殊的初始化。此初始化由宿主进程处理。

技术分享

设计时表达式计算

  设计时表达式计算使您可以从“即时”窗口进行代码测试,而不必运行应用程序。宿主进程在设计时表达式计算期间执行此代码。

  这个只会影响到Class Library工程, [*.vshost.exe]将.dll可执行文件加载到应用程序域里面,然后跟Visual Studio交互,获取表达式的值。如果将[*.vshost.exe]禁用,那么你不能在类型库项目中使用设计时表达式计算这个功能。但是你仍然可以使用可执行文件的设计时表达式功能,这是因为Visual Studio通过直接启动你的可执行.exe文件来完成的。

调试与宿主进程

  Visual Studio 宿主进程提高了调试器性能,并启用了新的调试器功能,如部分信任调试和设计时表达式计算。如果需要,您可以禁用宿主进程。

用宿主进程和不用宿主进程进行调试的一些差异

1)    部分信任调试和 Click-Once 安全

部分信任调试需要宿主进程。如果禁用宿主进程,部分信任调试将不工作,即使在“项目属性”的“安全”页上启用了部分信任安全。

2)    设计时表达式计算

设计时表达式始终使用宿主进程。如果在“项目属性”中禁用宿主进程,则禁用了类库项目的设计时表达式计算。对于其他项目类型,不禁用设计时表达式计算。相反,Visual Studio 启动实际可执行文件,并将它用于不用宿主进程的设计时计算。这种差异可能产生不同的结果。

3)    AppDomain.CurrentDomain.FriendlyName 差异

AppDomain.CurrentDomain.FriendlyName 依据是否启用宿主进程返回不同的结果。如果启用宿主进程时调用 AppDomain.CurrentDomain.FriendlyName,它将返回 app_name.vhost.exe。如果禁用宿主进程时调用它,它将返回 app_name.exe。

4)    Assembly.GetCallingAssembly().FullName 差异

Assembly.GetCallingAssembly().FullName 依据是否启用宿主进程返回不同的结果。如果启用宿主进程时调用 Assembly.GetCallingAssembly().FullName,它将返回 mscorlib。如果禁用宿主进程时调用 Assembly.GetCallingAssembly().FullName,它将返回该应用程序名。

禁用宿主进程

1)   项目 属性

2) 去掉图中勾选项即可

技术分享

禁用宿主进程之后将出现下列情况:

1)       开始调试 .NET Framework 应用程序所需的时间增加

2)      设计时表达式计算不可用

3)      部分信任调试不可用

详情参考:vshost.exe调试宿主(VS Debug Host Process)进程详解的分析过程

问题结论:

  基于前面的相关信息,宿主进程[*.vshost.exe] & [*.vshost.exe.config] 只会在调试或设计时相关阶段用到。在Release下编译WPF项目会生成[*.vshost.exe] & [*.vshost.exe.config]也应该是为调试等相关动作备用。发布之后理论上是可以删除的。

测试结果:

      删除宿主进程相关文件, [*.vshost.exe] & [*.vshost.exe.config]. 测试项目功能。没有发现异常。可见宿主进程的相关文件[*.vshost.exe] & [*.vshost.exe.config]在发布之后是可以删除的,不会影响到程序功能。

测试软件环境:
VS2010 + Sql Server2005 + WPF

参考资料列表:
http://blog.csdn.net/donjuan/article/details/3849508

http://topic.csdn.net/u/20080512/10/a1af6fe8-ac18-414a-bee7-aa1b64c98006.html

.net VHost的作用