原文:C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?

在 .NET 中创建进程时,可以传入 ProcessStartInfo 类的一个新实例。在此类型中,有一个 UseShellExecute 属性。

本文介绍 UseShellExecute 属性的作用,设为 truefalse 时,分别有哪些进程启动行为上的差异。


本质差异

Process.Start 本质上是启动一个新的子进程,不过这个属性的不同,使得启动进程的时候会调用不同的 Windows 的函数。

当然,如果你知道这两个函数的区别,那你自然也就了解此属性设置为 truefalse 的区别了。

效果差异

ShellExecute 的用途是打开程序或者文件或者其他任何能够打开的东西(如网址)。

也就是说,你可以在 Process.Start 的时候传入这些:

  • 一个可执行程序(exe)
  • 一个网址
  • 一个 html / mp4 / jpg / docx / enbx 等各种文件
  • PATH 环境变量中的各种程序

不过,此方法有一些值得注意的地方:

  • 不支持重定向输入和输出
  • 最终启动了哪个进程可能是不确定的,你可能需要注意潜在的安全风险

CreateProcess 则会精确查找路径来执行,不支持各种非可执行程序的打开。但是:

  • 支持重定向输入和输出

如何选择

UseShellExecute 的默认值是 true

如果有以下需求,那么建议设置此值为 false

  • 需要明确执行一个已知的程序
  • 需要重定向输入和输出

如果你有以下需求,那么建议设置此值为 true 或者保持默认:

  • 需要打开文档、媒体、网页文件等
  • 需要打开 Url
  • 需要打开脚本执行
  • 需要打开计算机上环境变量中路径中的程序

参考资料


我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

发布了382 篇原创文章 · 获赞 232 · 访问量 47万+

C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?的更多相关文章

  1. 在windows10中启动VmWare时,只要一启动虚拟机,电脑就会蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)

    在windows10中启动VmWare时,只要一启动虚拟机,电脑就会蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION) 没错就是这个,绿色的死亡按钮 原因: 第一种:windows ...

  2. Eclipse中启动tomcat时内存溢出

    今天在启动自己项目的时候遇到一个永久带(permgen space)内存溢出,查找了很多资料和请教了许多大神,最终才解决问题. 一.什么原因造成了永久带溢出: 1.项目使用了太多的静态变量 2.加载了 ...

  3. eclipse中启动服务时提示端口被占的2种解决方案

    出现类似这样的:port '19001' at localhost are already in use 第一种:在任务管理器中关闭相关eclipse进程,然后重启eclipse.这种方法可能有时候会 ...

  4. Anaconda中启动Python时的错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 553

    今天,在Anaconda prompt启动python遇到了如下错误: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xaf in positi ...

  5. Unity中启动VS时出现"Visual Studio 2010 Shell 无效的许可证数据"的解决办法

    (感觉还是cnblog好一点,刚注册成功赶紧把baidu hi的一篇文章搬过来试试) 一直用着Visual Studio 2013给Unity写代码,安装了SQL Server 2014后,在Unit ...

  6. True 和 False 分别代表数字中的几?形象地记忆

    True 和 False 作为布尔值分别代表的意思是真和假. 灯泡亮起就是 1,灯泡熄灭就是 0.0 就是无状态,所以可以代表灯泡熄灭的状态,而 1 就是有状态的,所以可以代表灯泡亮起的状态. 那么, ...

  7. Eclipse启动Tomcat时,45秒超时解决方案

    在Eclipse中启动Tomcatserver时,常常因为系统初始化项目多,导致出现45秒超时的Tomcatserver启动错误,出现以下的错误. 曾经我们一般通过找到XML配置文件,将相应Timeo ...

  8. Android动态部署五:怎样从插件apk中启动Service

    转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...

  9. Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究

    一个mysql jdbc待解之谜 关于jdbc  url参数 allowMultiQueries 如下的一个普通JDBC示例: String user ="root"; Strin ...

随机推荐

  1. lintcode-828. 字模式

    题目描述: 828.字模式 给定一个模式和一个字符串str,查找str是否遵循相同的模式.这里遵循的意思是一个完整的匹配,在一个字母的模式和一个非空的单词str之间有一个双向连接的模式对应. 样例 给 ...

  2. RNN 权重共享

    之前在几篇博客中说到了权重共享,但都觉得不够全面,这里做个专题,以后有新的理解都在此更新. 1. 减少运算只是锦上添花之前说到权重共享可以减少运算,是的,但这样说好像是可有可无,只是运算量大小的问题, ...

  3. MyBatis(九):Mybatis Java API批量操作(增、删、改、查)

    最近工作中用到了mybatis的Java API方式进行开发,顺便也整理下该功能的用法,接下来会针对基本部分进行学习: 1)Java API处理一对多.多对一的用法: 2)增.删.改.查的用法: 3) ...

  4. 破解magento加密的密码算法

    magento遇到丢掉密码的情况,其实很常见……比如我这记性,还好我比较暴力:-P      先看一段代码:           /**  * Hash a string  *  * @param s ...

  5. IDEA的SonarLint插件报错Unable to create symbol table for

    执行sonarLint 报错: Unable to create symbol table for ***File won't be refreshed because there were erro ...

  6. 原创:【ajax | axios跨域简单请求+复杂请求】自定义header头Token请求Laravel5后台【亲测可用】

    如标题:我想在ajax的header头增加自定义Token进行跨域api认证并调用,api使用laravel5编写,如何实现? 首先,了解下CORS简单请求和复杂请求.  -- CORS简单请求 -- ...

  7. Transaction 那点事儿

    Transaction 那点事儿 https://my.oschina.net/huangyong/blog/160012

  8. json 格式化处理工具

    json 格式化处理工具 用于JSON的快速命令行处理工具,简单无依赖. 我这边列举一些最常用的: 调试 http 请求时打印格式化后的数据 格式化本地或或流中的数据 获取 json 的键值或进行执行 ...

  9. SonarQube + Jenkins代码审查环境安装文档 v1.2

    1. 安装SonarQube 1.1. 下载 下载地址:https://www.sonarqube.org/downloads/ 本次使用安装包为:sonarqube-7.4.zip 需要提前准备jd ...

  10. 使用垃圾桶机制防止rm -rf误删文件

    偶然看到一个比较好用的工具Trash-Cli.一个类似垃圾桶的机制,可以恢复文件.试了一下,感觉还行 (1)下载安装: https://github.com/andreafrancia/trash-c ...