【记录】宿主进程 [*.vshost.exe] & [*.vshost.exe.config]

来源:互联网 发布:软件设计师模拟题 编辑:程序博客网 时间:2024/06/07 21:13

感慨很多问题 在MSDN 中都有深入的解答,可惜小菜没学会看。。

博客来源:

http://www.cnblogs.com/know-life-death/archive/2011/07/04/2097841.html


问题缘起:

  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调试宿主(VSDebug 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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做事做不快心急怎么办 焦虑症不想上班怎么办 总是忘事应该怎么办 vary渲染太黑怎么办 su一直未响应怎么办 草图大师版本低打不开怎么办 重要纸上滴上油了怎么办 水拓画颜料滴太多怎么办 微信语音撤不回怎么办 kido手表关机了怎么办 玩具店不想开了怎么办 幼儿不拉粑粑怎么办 幼儿拉绿色粑粑怎么办 幼儿拉青粑粑怎么办 小孩龋齿牙疼怎么办 宝宝刷牙不张嘴怎么办 宝宝爱吃棒棒糖怎么办 孩子不刷牙洗脸怎么办 宝宝害怕拉大便怎么办 狗狗不喜欢刷牙怎么办 10小孩不刷牙怎么办 孩子做事磨叽怎么办 一岁半宝宝不愿意刷牙怎么办 两岁半宝宝不愿意刷牙怎么办 小孩牙齿长蛀牙怎么办 2周岁宝宝龋齿怎么办 小孩刷牙吞牙膏怎么办 孩子12不肯刷牙怎么办 小孩牙齿空了怎么办 孩子掉了牙不长怎么办 小朋友不敢看牙医怎么办 小孩不喜欢洗脸刷牙怎么办 宝宝洗澡老是哭怎么办 孩子越来越怕打针怎么办 16孩子不爱洗澡怎么办 死手系统出问题怎么办 死手系统地震怎么办 唱歌掌握不好气息怎么办 被绣花针扎了怎么办 2岁宝宝好动怎么办 ppt打印直接出来怎么办