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

前言

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

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

会引发异常:

17ccfde3b584932502331182cb367960.png

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

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

深入探究

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

a8bc7b2511cddd3105425a53f0db41c2.png

对应的 .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方法:

9bfdd3f5a23389a6a479997e01fce8b5.png

而之所以走不同的逻辑分支,是由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时,代码会将传入参数作为文件名使用,从而引发“系统找不到指定的文件”异常。

添加微信号【MyIO666】,邀你加入技术交流群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM 类型的生命周期学习

Java虚拟机通过装载、连接和初始化一个JAVA类型,使该类型可以被正在运行的JAVA程序所使用,其中,装载就是把二进制形式的JAVA类型读入JAVA虚拟机中;而连接就是把这种读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去…

js对象数组中的某属性值 拼接成字符串

var arr[{id: "600", pId: null, name: "图形的变化"},{id: "630", pId: "600", name: "投影与视图"},{id: "631", pId: "630", name: "投影"},{id: "632", pId: "630",…

898A. Rounding#数的舍入

题目出处&#xff1a;http://codeforces.com/problemset/problem/898/A 题目大意&#xff1a;找一个数最近的整十的数 #include<iostream> using namespace std; int main(){int a,b;cin>>a;ba;while(1){if(a%100){cout<<a<<endl;return 0;}if(b%100){…

开店星简直就是国内优秀的开源商城系统天花板

一、场景 1、大学生毕业设计做商城系统背景 好家伙、又到开学季节了&#xff0c;师妹让我帮忙给指导大四的项目&#xff0c;作为毕业设计和为后面找工作积累项目经验&#xff0c;要搞一个买卖二手闲置品的商城小程序和PC端商城、希望能够快速学习、接入、修改部分功能&#xff…

【CASS精品教程】CASS9.1土方量的计算方法汇总

CASS9.1中,计算土方量的方法有:DTM法土方计算、断面法进行土方量计算、方格网法土方计算、等高线法土方计算、区域土方量平衡等。本文以案例的形式,详细讲解土方量的计算过程。 文章目录 一、DTM法土方计算二、断面法进行土方量计算三、方格网法土方计算四、等高线法土方计算…

html标签缺省(自带)样式大全

html标签默认样式整理 作者&#xff1a;佚名 来源&#xff1a;互联网 时间&#xff1a;07-30 16:54:48 文为大家整理了html标签默认样式属性及浏览器默认样式等等&#xff0c;喜欢css布局的朋友们可以学下&#xff0c;希望对大家有所帮助html, address,blockquote,body, dd, …

VS2019 禁止Web项目停止调试后自动关闭浏览器(在浏览器窗口关闭时停止调试程序,在调试停止时关闭浏览器)

很多文章都说要修改以下两处与“编辑并继续”有关的选项&#xff1a; “编辑并继续”是一种省时的功能&#xff0c;使你能够在程序处于中断模式时更改源代码。 通过选择执行命令&#xff08;如 "继续" 或 "单步执行"&#xff09;继续执行程序时&#xff0c…

iOS - block变量捕获原理

block对变量的捕获 1&#xff1a;可以捕获不可以修改变量 局部变量2&#xff1a;可以捕获且可以修改变量 全局变量静态变量__block修饰的局部变量原理分析&#xff1a; 1. 局部变量为什么可以被捕获确不能修改 int a 10; void (^blcok)() [^{NSLog("%d",a); } copy…

Shell 更好看的回显

#!/bin/shsource /etc/init.d/functionsaction "hello" /bin/true转载于:https://blog.51cto.com/itech/1768218

【ArcGIS风暴】ArcGIS中等高线高程标注/注记(打断/消隐)方法案例汇总

本文以案例的形式,图文并茂详细讲解在ArcGIS 10.6中,等高线高程标注、注记的方法。 文章目录 一、属性标注二、Maplex工具标注1. 使用Maplex标注引擎2. 标注转换为注记3. 要素轮廓线掩膜4. 使用掩膜选项进行绘制参考阅读: 【CASS精品教程】CASS9.1等高线的绘制完整案例教程 …

Blazor University (35)表单 —— 编写自定义验证

原文链接&#xff1a;https://blazor-university.com/forms/writing-custom-validation/编写自定义验证源代码[1]请注意&#xff0c;与有关 EditContext、FieldIdentifiers 和 FieldState[2] 的部分一样&#xff0c;这是一个高级主题。如前所述&#xff0c;FieldState 类保存表…

HTML 元素内部添加预加载

CSS&#xff1a; /*元素内部加载loading*/.innerLoading {height: 100%;width: 100%;display: flex;justify-content: center;align-items: center;}.innerLoading * {text-align: center;color: #737782cc;fill: #73777A;font-size: 1em !important;font-family: SimSun,SimHe…

Windows下怎样安装Tomcat

Tomcat 是开源的WEB应用容器&#xff0c;所以受到各位程序员和公司的亲赖。在这里给大家介绍一下如何在Windows环境下安装Tomcat绿色版本&#xff0c;希望能够对大家有帮助。 1.首先去Tomcat官网下载Tomcat软件&#xff0c;在百度中搜索Tomcat,进入英文网址http://tomcat.apach…

智能识别云服务端平台之神【合合信息TextIn】

一、前言 众所周知&#xff0c;随着互联网和人工智能的发展&#xff0c;我们非常多的场景需要用到智能“识别”功能&#xff0c;比如人脸识别、通用文字识别、表格识别、办公文档识别、身份证、名片、营业执照等国内外卡证文字识别等等&#xff0c;同时识别与理解面临的全球性技…

【ArcGIS微课1000例】0015:ArcGIS如何创建/自定义快捷键?

为了提高工作效率,强大的ArcGIS提供了很多快捷键,如访问 ArcMap 菜单命令、窗口操纵、刷新或暂停地图绘制、通过拖放进行移动或复制等等。本文在ArcGIS已有快捷键的基础之上,为了提高工作效率,讲解如何定制个性化的快捷键。 参考阅读:【ArcGIS风暴】ArcGIS快捷键大全 文章…

Bresenham 算法

1965 年&#xff0c;Bresenham 为数字绘图仪开发了一种绘制直线的算法&#xff0c;该算法同样使用于光栅扫描显示器&#xff0c;被称为 Bresenham 算法。 原理 算法的目标是选择表示直线的最佳光栅位置。Bresenhan 算法在主位移方向上每次递增一个单位。另一个方向的增量为 0…

Python高级特性——迭代(Iteration)

Python高级特性——迭代&#xff08;Iteration&#xff09; 1、给定一个集合list或者tuple&#xff0c;可以通过for …… in ……的语法来实现循环遍历&#xff0c;这个循环我们就叫做迭代 迭代list&#xff1a; >>> m [haha,hehe,heihei,gaga] >>> for li …

ML.NET 更新

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;5分钟)ML.NET是一款面向.NET开发人员的开源&#xff0c;跨平台机器学习框架&#xff0c;可以将自定义机器学习集成到.NET应用中。我们很开心地向您介绍我们在过去几个月中所做的工作。ML.NET:https://dotnet.microsof…

Andriod之提示java.lang.SecurityException: getDataNetworkTypeForSubscriber导致程序奔溃

1、问题 修改targetSdkVersion 33 适配Android13后4G网络环境被其它app拉起来提示这个异常 2、原因 我们定位到代码在这行函数 telephonyManager.getNetworkType()Android11 的权限有关,由于缺少该权限导致无法访问接口而提示安全异常 3、解决办法 方法1:我们直接申请RE…

js-权威指南学习笔记7

第七章 数组 1、数组直接量的语法允许有可选的结尾的逗号&#xff0c;所以[ , , ]只有两个元素而非三个。 2、调用构造函数Array&#xff08;&#xff09;创建数组时&#xff0c;传入一个参数时表示指定数组的长度。 3、所有的索引都是属性名&#xff0c;但只有在0~2^32-2之间的…