.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

时间: 2024-07-31 14:32:37

.net VHost的作用的相关文章

RabbitMQ学习和使用

RabbitMQ学习和使用 RabbitMQ介绍 MQ全称Message Queue 消息队列,RabbitMQ是基于AMQP(高级消息队列协议)实现的.消息队列通常用以应用之间相互通信,解决同步问题.MQ是典型的生产者消费者模型,RabbitMQ最常用的三种模式是点对点模式.发布订阅模式.广播模式. RabbitMQ is a message-queueing software called a message broker or queue manager. Simply said; It

Java相关面试题总结

本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Cloud.Hibernate.MyBatis.RabbitMQ.Kafka.Zookeeper.MySQL.Redis.JVM ,如下图所示: [Java基础] 1. JDK 和 JRE 有什么区别?2. == 和 equals 的区别是什么?3. 两个对象的 hashCode() 相同,则 equals

200道面试题(自己在网络上搜集的答案)

原文链接:https://mp.weixin.qq.com/s/KnSUprd6Z7zbpZAVR1OEdw 1. Java 基础 1. JDK 和 JRE 有什么区别? 2. == 和 equals 的区别是什么? 3. 两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗? 4. final 在 java 中有什么作用? 5. java 中的 Math.round(-1.5) 等于多少? 6. String 属于基础的数据类型吗? 7. java 中操作字符

208道面试题,答案

---恢复内容开始--- 一.Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的. JDK是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的 2.== 和 equals 的区别是什么? 答:==是比较两个对象的地址,equals是比较连个对象的内容 3.两个对象的 hashCode()

Java 最常见 200+ 面试题全解析:面试必备

本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Cloud.Hibernate.MyBatis.RabbitMQ.Kafka.Zookeeper.MySQL.Redis.JVM ,如下图所示: Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环

208道Java常见的面试题

一.Java 基础 1.JDK 和 JRE 有什么区别? JRE=JVM+各种基础类库+java类库(String\System) JDK>JRE>JVM JRE:是java运行时环境  JDK:是java开发工具包 2. == 和 equals 的区别是什么? 1.对象类型不同:a:equals():是超类Object中的方法.b:==:是操作符. 2.比较的对象不同:a:equals():用来检测两个对象是否相等,即两个对象的内容是否相等.b:==:用于比较引用和比较基本数据类型时具有不同

RabbitMQ相关

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现. 1.RabbitMQ 的使用场景有哪些? 1.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式 1.2 应用解耦 场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口. 这种做法有一个缺点: 当库存系统出现故障时,订单就会失败.(这样马云将少赚好多好多钱^ ^) 订单系统和库存系

2019年 Java 面试题解析

作者:Zz_maker https://www.cnblogs.com/Zz-maker/p/11193930.html 包含的模块: 本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Cloud.Hibernate.MyBatis.RabbitMQ.Kafka.Zookeeper.MySQL.Redis.JVM如下图所示: 共包含 208 道面试题,本文

菜鸟刷面试题(二、RabbitMQ篇)

目录: rabbitmq 的使用场景有哪些? rabbitmq 有哪些重要的角色? rabbitmq 有哪些重要的组件? rabbitmq 中 vhost 的作用是什么? rabbitmq 的消息是怎么发送的? rabbitmq 怎么保证消息的稳定性? rabbitmq 怎么避免消息丢失? 要保证消息持久化成功的条件有哪些? rabbitmq 持久化有什么缺点? rabbitmq 有几种广播类型? rabbitmq 怎么实现延迟消息队列? rabbitmq 集群有什么用? rabbitmq 节点