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

原文: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/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。


walter lv

博客专家

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

私信
关注

原文地址:https://www.cnblogs.com/lonelyxmas/p/12051998.html

时间: 2024-10-09 12:17:00

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

解决在Fragment中启动Activity时传递请求码的问题

解决在Fragment中启动Activity时传递请求码的问题: 首先需要指出的是Fragment有startActivityForResult方法,而Activity中也有startActivityForResult方法:两者的区别是: Fragment中的startActivityForResult方法: FragmentActivity中的startActivityForResult方法: 从官方的解释中可以看出Fragment中的startActivityForResult方法是调用的是

关于Android Studio中启动模拟器时,报VT-x is disabled in BIOS错误的解决办法

有时候在Android Studio中启动一个模拟器去运行程序的时候,会出现下面的错误提示:"Intel HAXM is required to run this AVD,VT-x is disabled in BIOS". 接下来我来说说解决的办法: 1. 首先在SDK Manager中检查是否安装Download Intel x86 Emulator Accelerator (HAXM installer),如果没有安装,则在SDK Manager中下载安装Download Int

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

(感觉还是cnblog好一点,刚注册成功赶紧把baidu hi的一篇文章搬过来试试) 一直用着Visual Studio 2013给Unity写代码,安装了SQL Server 2014后,在Unity启动VS的时候,会出现"Visual Studio 2010 Shell 无效的许可证数据"的提示,然后就变启动MonoDevelop了.如图. 解决办法: 修改注册表 HKEY_CLASSES_ROOT下找到"VisualStudio.DTE.10.0"项 把它改成

linux系统中启动MYSQL时出现错误:touch: 无法创建"/var/lock/subsys/mysql": 设备上没有空间

df -h      #查看下空间满了吗 df -li     #查看下inode(文件索引节点)是不是满了            #inodes 占用100%的话,就删除/tmp下的文件 cd /tmp find /tmp -type f -exec rm {} \;        #如果使用rm *,有可能因为文件数量太多而出现Argument list too long错误 find /home -type f -size 0 -exec rm {} \;        #0字节的文件也会

linux中关于进程那些事

进程(Process)是系统进行资源分配和调度的基本单位,一个进程是一个程序的运行实例.而在Linux中,可以使用一个进程来创建另外一个进程.进程和程序是有本质区别的:进程是一个程序的一次执行过程,同时也是资源分配的最小单元.程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念:而进程是一个动态的概念,它是程序执行的过程,包括了动态创建.调度和消亡的整个过程.Linux操作系统包括三种不同类型的用户进程,每种类型的进程都有自己的特点和属性.(1) 交互进程--由shell启动的

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

在Eclipse中启动Tomcatserver时,常常因为系统初始化项目多,导致出现45秒超时的Tomcatserver启动错误,出现以下的错误. 曾经我们一般通过找到XML配置文件,将相应Timeout为45的值,改动为觉得足够大来解决这个问题. 可是有时候这样非常麻烦,有时候根本就在配置文件里找不到Timeout的属性值,所以这里有一种能够高速的解决方法. 解决方法: 1.双击Servers视图中的相应的Server,打开Server的属性界面.例如以下图: 2.在上图的Timeouts->

Android动态部署五:如何从插件apk中启动Service

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:如何从插件apk中启动Activity(一) Android动态部署四:如何从插

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

转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/DynamicDeploymentApk Android动态部署一:Google原生Split APK浅析 Android动态部署二:APK安装及AndroidManifest.xml解析流程分析 Android动态部署三:怎样从插件apk中启动Activity(一) Android动态部署四:怎样从插

elcipse中启动tomcat,不能访问localhost解决办法

错误详情:在eclipse中启动tomcat,然后网页中输入127.0.0.1:8080之后显示404的错误 在tomcat根目录的bin文件夹下启动startup.bat后访问localhost没有错误,问题原因:eclipse把tomcat的配置文件都复制到自己的一个文件夹下,找到项目位置进入文件夹目录.metadata\.plugins\org.eclipse.wst.server.core,复制的配置文件存放在该文件夹下,,当eclipse中启动tomcat时,启动的是复制之后的配置文件