Process.Start 为什么会引发“系统找不到指定的文件”异常

2023-11-12

目录

前言

深入探究

结论


 

前言

偶然发现,如果想用如下代码在 .NET 6 中打开指定 URL:

Process.Start("https://baidu.com");

会引发异常:

而同样的代码在 .NET Framework 中是可以正常执行的。

难道,.NET 6 下的实现逻辑不一样?

深入探究

通过调用堆栈,我们发现最后调用的是StartWithCreateProcess方法:

对应的 .NET 6 源代码如下:

private bool StartCore(ProcessStartInfo startInfo)
{
    if (!startInfo.UseShellExecute)
    {
        return this.StartWithCreateProcess(startInfo);
    }
    return this.StartWithShellExecuteEx(startInfo);
}

这和 .NET Framework 中的实现逻辑基本一致:

public bool Start()
{
    this.Close();
    ProcessStartInfo processStartInfo = this.StartInfo;
    if (processStartInfo.FileName.Length == 0)
    {
      throw new InvalidOperationException(SR.GetString("FileNameMissing"));
    }
    if (processStartInfo.UseShellExecute)
    {
      return this.StartWithShellExecuteEx(processStartInfo);
    }
    return this.StartWithCreateProcess(processStartInfo);
}

那么问题出在哪呢?

通过 dnspy 调试 .NET Framework 版本的测试程序,我们发现,最后执行的是StartWithShellExecuteEx而不是StartWithCreateProcess方法:

而之所以走不同的逻辑分支,是由processStartInfo.UseShellExecute控制的。

所以,解决方案也很简单,设置UseShellExecute = true:

Process.Start(new ProcessStartInfo("https://baidu.com") { UseShellExecute = true });

结论

造成这样的原因,是因为UseShellExecute在 .NET 6 上默认为 false:

public bool UseShellExecute { get; set; }

而在 .NET Framework 上默认为 true:

[DefaultValue(true)]
[MonitoringDescription("ProcessUseShellExecute")]
[NotifyParentProperty(true)]
public bool UseShellExecute
{
    get
    {
        return this.useShellExecute;
    }
    set
    {
        this.useShellExecute = value;
    }
}

private bool useShellExecute = true;

UseShellExecute = false时,代码会将传入参数作为文件名使用,从而引发“系统找不到指定的文件”异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Process.Start 为什么会引发“系统找不到指定的文件”异常 的相关文章

  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima
  • 适合 .Net 开发人员的 Grails/Roo

    我目前正在学习 Grails 和 Roo 绝大多数培训材料都是针对新开发人员或现有 Java 开发人员 有谁知道使用 Net C ASP Net Asp Net MVC 翻译现有开发经验的任何指南 资源或技巧 你做过很多 ASP MVC 吗
  • 使用另一个 MEF 程序集中的类而不引用它

    我有 2 个 MEF 组件 设其为A成分和B成分 我需要的是能够从组件 A 中的组件 B 访问一个类 而不需要引用它 然后我想手动实例化该类的对象 目前我看到 MEF 允许使用 Import 自动实例化对象 它使用需要引用的接口 我可以使用
  • xmlns 元素的顺序重要吗

    我不知道如何在 google 中搜索此内容 但是 xmlns 元素的问题在 XML 文件中重要吗 我正在 ASP NET VB 中使用 XMLWriter 创建一个 XML 文件 并且尝试匹配我提供的示例
  • Thread.sleep vs Monitor.Wait vs RegisteredWaitHandle?

    以下项目有不同的目标 但我很有趣知道它们如何 暂停 问题 Thread sleep 它会影响系统性能吗 它是否会占用线程的等待时间 关于什么Monitor Wait 他们 等待 的方式有何不同 他们的等待会占用一个线程吗 关于什么Regis
  • COM多线程支持

    第一次使用COM我有这个 COM dll 比如 ABCServer dll 我创建了一个 RCW 并在我的项目中添加了对它的引用 现在 我的应用程序创建了多个线程 每个线程从 COM dll 创建某些类并使用它们 但是 当其他线程正在处理
  • 如何在 TeamCity 的 .NET 项目中包含解决方案目录之外的依赖项

    我的解决方案目录之外有类库 因此我在 sln 文件 SomeDependency csproj 中有这样的引用 在 VS 中一切正常 但在尝试构建我的解决方案时 TeamCity 失败了 我猜它复制了所有解决方案目录 因此关系不再存在 这是
  • C# Winform - 当用手指在触摸屏上移动到控件末尾时如何防止移动整个窗口

    我正在开发用于触摸屏的全屏 winform 应用程序 当我在表单上有任何控件时 例如listbox webBrowserControl 它具有可见的滚动条 有要滚动的内容 当我用手指移动到控件的末尾时 完整的表单向上 向下移动取决于移动方向
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 我的 C# .NET 团队是否应该迁移到 Windows Presentation Foundation? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • ListView onScroll 事件

    我正在编写一个简单的 C 应用程序 我需要 Listview 上的 onScroll 事件 所以我创建了ListviewEx类继承原来的ListView 我找到了如何从 WinAPI 检测滚动消息 并修改了 WndProc 方法 现在我有这
  • SqlConnection - 是远程连接还是本地连接?

    如果我有 SqlConnection 对象 如何确定它是本地连接 localhost 或 127 0 0 1 还是远程连接 本地区域的其他计算机 使用连接询问 SQL 语句 SELECT SERVERNAME 然后验证这是否与客户端计算机的
  • 如何使用 RSA-SHA1 算法对 xml 元素进行签名?

    我需要使用 RSA SHA1 算法签署 并最终验证 XML 文档的节点之一 w3 org 链接 https www w3 org TR xmlsec algorithms RSA SHA1 网址 http www w3 org 2000 0
  • .NET 中安全身份的本地化

    我想在 NET 中实现一个用于服务 客户端通信的命名管道 并遇到了这段代码 http code msdn microsoft com windowsdesktop CSNamedPipeCommunication 33b2485c view
  • 如何使用 DataTable.Load(DataReader) 重新加载 DataGridView 而不出现重复记录

    任何人都可以帮助我如何避免重复输出DataGridView 这是图像变更前 https i stack imgur com CyKwY png和图像添加 编辑或删除后 https i stack imgur com Bvu0u png 这是
  • 从 WCF REST 获取错误详细信息

    我有一个由 Net WCF 客户端使用的 REST 服务 遇到错误时 REST 服务会返回 HTTP 400 错误请求 响应正文包含 JSON 序列化详细信息 如果我使用 Fiddler Javascript 或直接从 C 执行请求 我可以
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c

随机推荐

  • GPT垂直领域相关模型 现有的开源领域大模型

    对于ToC端来说 广大群众的口味已经被ChatGPT给养叼了 市场基本上被ChatGPT吃的干干净净 虽然国内大厂在紧追不舍 但目前绝大多数都还在实行内测机制 大概率是不会广泛开放的 毕竟 各大厂还是主盯ToB ToG市场的 从华为在WAI
  • excel 中使用vlookup函数

    vlookup函数使用方法 https zhuanlan zhihu com p 29161495 使用函数后不显示只显示公式处理办法 第二点 将函数所在单元格的格式改为常规或数值格式 并点击F2或者点击一下编辑栏 再点击Enter即可 h
  • 微软又赢麻了!联合 Meta 发布免费商业应用的开源 AI 模型 Llama 2

    整理 屠敏 出品 CSDN ID CSDNnews 昔日的竞争对手 今日的合作盟友 忽如一夜春风来 开源大模型迎来新局面 今天是 OSS AI 胜利的一天 随着 Meta 最新发布一个新的开源 AI 模型 Llama 2 网上盛赞的声音不绝
  • 10月5日 大数据专题

    10月5日 大数据专题 中秋国庆双节盛典 大数据 大数据 big data IT行业术语 是指无法在一定时间范围内用常规软件工具进行捕捉 管理和处理的数据集合 是需要新处理模式才能具有更强的决策力 洞察发现力和流程优化能力的海量 高增长率和
  • 笔记整理nodeJS

    nodeJS 学习方法 掌握思想 编程思想很重要 语言只是工具 不仅仅只是记住了API 查资料的方式 API文档 1 搭建服务器 2 mongodb 用 注册和登录增删改查新闻 bootstrap 3 api server 注册和登录增删改
  • CSS学习(三)CSS优先级和盒子模型

    优先级的介绍 特性 不同选择器具有不同的优先级 优先级高的选择器样式会覆盖优先级低选择器样式 优先级公式 继承 lt 通配符选择器 lt 标签选择器 lt 类选择器 lt id选择器 lt 行内样式 lt important 注意点 1 i
  • Anaconda的安装

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 若身在泥潭 心也在泥潭 则满眼望去均是泥潭 若身在泥潭 而心系鲲鹏 则能见九万里天地 文章目录 Anac
  • Bootstrap Navbar

    Bootstrap Navbar 导航栏 是Bootstrap框架中一个重要的组件 用于创建响应式的导航菜单 适用于各种屏幕大小和设备 导航栏通常位于网页的顶部 为用户提供导航和链接到不同页面或功能 以下是Bootstrap Navbar的
  • 第十二届蓝桥杯国赛试题及解析

    第一题 选择题严禁使用程序验证设s HiLanQiao 运行以下哪个选项代码可以输出 LanQiao 子串 A A print s 7 B print s 6 11 C print s1 7 01 D print s 7 1 第二题 选择题
  • eclipse配置tomcat

    eclipse环境下如何配置tomcat 打开Eclipse 单击 Window 菜单 选择下方的 Preferences 单击 Server 选项 选择下方的 Runtime Environments 点击 Add 添加Tomcat 点击
  • unityShader之固定渲染管线

    固定渲染管线功能较单一 能实现的效果不多 基本快要被淘汰了 老式的机器上还能用一用 附上几个脚本示例简单说明一下 shader likang king01 properties Color MainColor color 0 0 0 1 固
  • 【C#学习笔记】指针使用

    using System namespace ConsoleApplication2 class Program static void Main string args int a 5 unsafe int pa a Console Wr
  • 浅谈边缘计算

    一 概念 定义 1 维基百科对边缘计算的定义如下 边缘计算是一种优化云计算系统的方法 在边缘执行分析和知识生成减少受控系统和数据中心之间的通信带宽 2 OpenStack基金会对边缘计算的定义如下 边缘计算是为应用开发者和服务提供商在网络的
  • 【LeetCode102】二叉树的层序遍历

    题目描述 首刷自解 vector
  • 【Vue 常用属性】

    Vue 常用属性 vue常用的属性有 数据属性 方法 计算属性 监听属性 数据属性 组件的data 选项是一个函数 Vue 会在创建新组件实例的过程中调用此函数 它应该返回一个对象 然后Vue 会通过响应性系统将其包裹起来 并以 data
  • JDK8特性--Stream(求和,过滤,排序)

    Stream简介 Java 8 API添加了一个新的抽象称为流Stream 可以让你以一种声明的方式处理数据 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象 元素流在管道
  • Modern OpenGL---09 纹理(纹理单元可贴多个纹理)

    对之前画的矩形基础上贴上纹理 在片段着色器中 声明一个采样器 表示纹理位置 每个纹理位置叫做纹理单元 比如 0 1等 当只有一个纹理事时 纹理单元默认为0 当有一个以上的纹理时 则需要通过uniform从外部设置每个纹理单元的值 需要注意的
  • Makefile实例,利用Makefile给多文件、多目录C源码建立工程

    0 前言 粉丝留言 想知道如何使用Makefile给多个文件和多级目录建立一个工程 必须安排 关于Makefile的入门参考文章 可以先看这篇文章 Makefile入门教程 为了让大家有个更加直观的感受 一口君将之前写的一个小项目 本篇在该
  • Jenkins系列:2、Jenkins构建流水线

    Jenkins系列 2 Jenkins构建流水线 文章目录 Jenkins系列 2 Jenkins构建流水线 1 前言 2 创建自由项目 2 1 创建简单示例 2 2 构建触发器 构建环境 构建 构建后操作简介 3 最后 1 前言 上一节我
  • Process.Start 为什么会引发“系统找不到指定的文件”异常

    目录 前言 深入探究 结论 前言 偶然发现 如果想用如下代码在 NET 6 中打开指定 URL Process Start https baidu com 会引发异常 而同样的代码在 NET Framework 中是可以正常执行的 难道 N