当前位置: 首页 > news >正文

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

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

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


本文内容

    • 本质差异
    • 效果差异
    • 如何选择

本质差异

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

  • UseShellExecute = true
    • 调用的是 ShellExecute
  • UseShellExecute = false
    • 调用的是 CreateProcess

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

效果差异

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

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

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

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

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

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

  • 支持重定向输入和输出

如何选择

UseShellExecute 的默认值是 true

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

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

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

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

参考资料

  • c# - When do we need to set UseShellExecute to True? - Stack Overflow

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

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

知识共享许可协议

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

相关文章:

  • WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
  • 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)
  • 如何在 MSBuild 的项目文件 csproj 中获取绝对路径
  • C# 跨设备前后端开发探索
  • MSBuild 如何编写带条件的属性、集合和任务 Condition?
  • WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码
  • 如何快速自定义 Visual Studio 中部分功能的快捷键
  • C# 8.0 如何在项目中开启可空引用类型的支持
  • C# 8.0 可空引用类型中的各项警告/错误的含义和示例代码
  • C# 可空引用类型 NullableReferenceTypes 更强制的约束:将警告改为错误 WarningsAsErrors
  • ClearType 的原理:Windows 上文本的亚像素控制
  • 使用 7-Zip 的命令行版本来压缩和解压文件
  • 在项目文件 csproj 中或者 MSBuild 的 Target 中使用 % 引用集合中每一项的属性
  • MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
  • WPF 获取元素(Visual)相对于屏幕设备的缩放比例,可用于清晰显示图片
  • [PHP内核探索]PHP中的哈希表
  • 2017-08-04 前端日报
  • gitlab-ci配置详解(一)
  • IOS评论框不贴底(ios12新bug)
  • JavaScript设计模式之工厂模式
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • python学习笔记-类对象的信息
  • React-生命周期杂记
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • use Google search engine
  • 测试如何在敏捷团队中工作?
  • 构建工具 - 收藏集 - 掘金
  • 前端工程化(Gulp、Webpack)-webpack
  • 微服务核心架构梳理
  • 一个JAVA程序员成长之路分享
  • 在Mac OS X上安装 Ruby运行环境
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #100天计划# 2013年9月29日
  • #QT项目实战(天气预报)
  • #宝哥教你#查看jquery绑定的事件函数
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (20050108)又读《平凡的世界》
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (k8s中)docker netty OOM问题记录
  • (Matlab)使用竞争神经网络实现数据聚类
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (全注解开发)学习Spring-MVC的第三天
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (轉)JSON.stringify 语法实例讲解
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 的程序集加载上下文
  • .net 使用ajax控件后如何调用前端脚本
  • .net6 webapi log4net完整配置使用流程
  • .NET使用存储过程实现对数据库的增删改查
  • ??eclipse的安装配置问题!??