Process.Start 为什么会引发“系统找不到指定的文件”异常
前言
偶然发现,如果想用如下代码在 .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
时,代码会将传入参数作为文件名使用,从而引发“系统找不到指定的文件”异常。
添加微信号【MyIO666】,邀你加入技术交流群
Process.Start 为什么会引发“系统找不到指定的文件”异常相关推荐
- php 0x80070002,vs2015 系统找不到指定的文件(异常来自HRESULT:0x80070002)问题的解决方法...
vs2015 创建mvc项目时,弹出错误信息内容(系统找不到指定的文件(异常来自HRESULT:0x80070002)) 弹出窗体如下图所示: 导致整个原因是:未安装NuGet包 解决方法: 1)打开 ...
- Cannot run program python: CreateProcess error=2, 系统找不到指定的文件。
Java调用Python在Eclipse中运行报错:Cannot run program "python": CreateProcess error=2, 系统找不到指定的文件. ...
- java.io.IOException: Cannot run program “***.exe“ CreateProcess error=2, 系统找不到指定的文件,java调用可执行程序
通过java调用命令行 java.io.IOException: Cannot run program ""C:\Users\yzx\Desktop\C4Photosynthesi ...
- 问题记录:Start : 由于出现以下错误,无法运行此命令: 系统找不到指定的文件。。
执行: $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem $ jupyte ...
- C# DLL异常System.IO.FileNotFoundException:Could not load file orassembly BouncyCastle.Crypto系统找不到指定的文件
异常信息:System.IO.FileNotFoundException:"Could not load file or assembly 'BouncyCastle.Crypto, Ver ...
- System.ComponentModel.Win32Exception: 系统找不到指定的文件
问题描述: System.ComponentModel.Win32Exception: 系统找不到指定的文件. 在 System.Diagnostics.Process.StartWithShe ...
- win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx‘, ‘系统找不到指定的文件。‘)
win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件.') 目录 win32ctypes.pywin32.pyw ...
- FireDAC 报系统找不到指定的文件错误,解决之道。
报:[FireDAC][Phys][MySQL]-314. Cannot load vendor library [libmysql.dll or libmysqld.dll]. 系统找不到指定的文件 ...
- 使用pytesseract出现错误:“[WinError 2] 系统找不到指定的文件
使用pytesseract出现错误:"[WinError 2] 系统找不到指定的文件 解决: import pytesseract from PIL import Image pytesse ...
最新文章
- IDEA搭建Maven Web(SSM)项目(一)——创建项目
- Hyperledger Fabric 核心模块(5)peerer共识
- canopen c++程序编写_JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写单片机程序?...
- c++之静态成员详细介绍
- java lock 信号_java各种锁(ReentrantLock,Semaphore,CountDownLatch)的实现原理
- windows xp下Apache2.2.11整合Tomcat6.0.20
- makefile函数集锦
- springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】
- 西门子plc编程软件step 7 microwin smart下载指南
- 【小白】用python写一个单向聊天室
- ES3数组和字符串的方法
- linux没法上网,LINUX没法上网?
- excel多工作表汇总如何完成?
- The requested resource is not available.
- 定期把电脑的文件备份到服务器,怎么让电脑定期自动备份文件或文件夹(学会这一招,让电脑自动备份你的重要资料)...
- 群晖命令行获取root权限
- jzxx1033能被5整除且至少有一位数字是5的所有整数的个数
- 哈工大版理论力学和濮良贵版《机械设计》、张宇数学二等视频和试卷分享
- Thread.yield()详解
- UBTC在2019,潮水褪去后的价值凸显
热门文章
- origin三元相图_三元相图怎么看怎么画(附R代码示例)
- 2022年全球高净值人士净流入前十国家阿联酋居首;京沪跻身全球百万富翁最多城市前十;美中印亿万富翁数量全球前三 | 美通社头条...
- 双系统windows+ubuntu18.04的安装和基本配置
- 数据挖掘工程师发展方向浅谈
- 轻松上手C++的标准模板库的使用
- 【网络安全】802.1X技术基础
- Kickstart无人值守安装系统(含DHCP超详细原理)
- 莫兰指数是怎么分析的???
- 苹果在iPhone用户死亡事件后进行了回收USB充电器
- opencv练习---识别二维码