前言

偶然发现,如果想用如下代码在 .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 为什么会引发“系统找不到指定的文件”异常相关推荐

  1. php 0x80070002,vs2015 系统找不到指定的文件(异常来自HRESULT:0x80070002)问题的解决方法...

    vs2015 创建mvc项目时,弹出错误信息内容(系统找不到指定的文件(异常来自HRESULT:0x80070002)) 弹出窗体如下图所示: 导致整个原因是:未安装NuGet包 解决方法: 1)打开 ...

  2. Cannot run program python: CreateProcess error=2, 系统找不到指定的文件。

    Java调用Python在Eclipse中运行报错:Cannot run program "python": CreateProcess error=2, 系统找不到指定的文件. ...

  3. java.io.IOException: Cannot run program “***.exe“ CreateProcess error=2, 系统找不到指定的文件,java调用可执行程序

    通过java调用命令行 java.io.IOException: Cannot run program ""C:\Users\yzx\Desktop\C4Photosynthesi ...

  4. 问题记录:Start : 由于出现以下错误,无法运行此命令: 系统找不到指定的文件。。

    执行: $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem $ jupyte ...

  5. C# DLL异常System.IO.FileNotFoundException:Could not load file orassembly BouncyCastle.Crypto系统找不到指定的文件

    异常信息:System.IO.FileNotFoundException:"Could not load file or assembly 'BouncyCastle.Crypto, Ver ...

  6. System.ComponentModel.Win32Exception: 系统找不到指定的文件

    问题描述: System.ComponentModel.Win32Exception: 系统找不到指定的文件.    在 System.Diagnostics.Process.StartWithShe ...

  7. win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx‘, ‘系统找不到指定的文件。‘)

    win32ctypes.pywin32.pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件.') 目录 win32ctypes.pywin32.pyw ...

  8. FireDAC 报系统找不到指定的文件错误,解决之道。

    报:[FireDAC][Phys][MySQL]-314. Cannot load vendor library [libmysql.dll or libmysqld.dll]. 系统找不到指定的文件 ...

  9. 使用pytesseract出现错误:“[WinError 2] 系统找不到指定的文件

    使用pytesseract出现错误:"[WinError 2] 系统找不到指定的文件 解决: import pytesseract from PIL import Image pytesse ...

最新文章

  1. IDEA搭建Maven Web(SSM)项目(一)——创建项目
  2. Hyperledger Fabric 核心模块(5)peerer共识
  3. canopen c++程序编写_JAVA、C、C++、Python同样是高级语言,为什么只有C和C++可以编写单片机程序?...
  4. c++之静态成员详细介绍
  5. java lock 信号_java各种锁(ReentrantLock,Semaphore,CountDownLatch)的实现原理
  6. windows xp下Apache2.2.11整合Tomcat6.0.20
  7. makefile函数集锦
  8. springCloud Finchley 实战入门(基于springBoot 2.0.3)【五 Hystrix 服务容错保护】
  9. 西门子plc编程软件step 7 microwin smart下载指南
  10. 【小白】用python写一个单向聊天室
  11. ES3数组和字符串的方法
  12. linux没法上网,LINUX没法上网?
  13. excel多工作表汇总如何完成?
  14. The requested resource is not available.
  15. 定期把电脑的文件备份到服务器,怎么让电脑定期自动备份文件或文件夹(学会这一招,让电脑自动备份你的重要资料)...
  16. 群晖命令行获取root权限
  17. jzxx1033能被5整除且至少有一位数字是5的所有整数的个数
  18. 哈工大版理论力学和濮良贵版《机械设计》、张宇数学二等视频和试卷分享
  19. Thread.yield()详解
  20. UBTC在2019,潮水褪去后的价值凸显

热门文章

  1. origin三元相图_三元相图怎么看怎么画(附R代码示例)
  2. 2022年全球高净值人士净流入前十国家阿联酋居首;京沪跻身全球百万富翁最多城市前十;美中印亿万富翁数量全球前三 | 美通社头条...
  3. 双系统windows+ubuntu18.04的安装和基本配置
  4. 数据挖掘工程师发展方向浅谈
  5. 轻松上手C++的标准模板库的使用
  6. 【网络安全】802.1X技术基础
  7. Kickstart无人值守安装系统(含DHCP超详细原理)
  8. 莫兰指数是怎么分析的???
  9. 苹果在iPhone用户死亡事件后进行了回收USB充电器
  10. opencv练习---识别二维码