由Restart()想到的
Application.Restart Method (System.Windows.Forms) | Microsoft Docs
目录
Restart
当我们在.net Framework中使用它时,并没有什么特殊之处,是可以正常运行的,然而如果在.net core3.0时,则会抛出InvalidOperation异常。
Application.Restart();

为什么同样一个方法在会出现这样的区别呢?
探索
我们先看一下异常信息:
Process was not started by this object, so requested information cannot be determined.
此对象未启动进程,因此无法确定请求的信息。
由此我们可以大致推断:此异常是和进程启动有关。而关于进程的代码,在Restart方法中一共由两处:
if (string.Equals(str + "\\ieexec.exe", currentProcess.MainModule.FileName, StringComparison.OrdinalIgnoreCase))
{
flag = true;
ExitInternal();
string text = AppDomain.CurrentDomain.GetData("APP_LAUNCH_URL") as string;
if (text != null)
{
Process.Start(currentProcess.MainModule.FileName, text);
}
}
ProcessStartInfo startInfo = Process.GetCurrentProcess().StartInfo;
startInfo.FileName = ExecutablePath;
if (stringBuilder.Length > 0)
{
startInfo.Arguments = stringBuilder.ToString();
}
ExitInternal();
Process.Start(startInfo);
第一处代码主要是为了执行ieexec.exe,所以我们不用重点分析。
IEexec.exe应用程序是.NET Framework附带程序,存在于多个系统白名单内。可以将IEExec.exe应用程序用作主机,以运行使用URL启动的其他托管应用程序。
接下来我们看第二处代码关于进程的部分:
ProcessStartInfo startInfo = Process.GetCurrentProcess().StartInfo;
Process.Start(startInfo);
当我执行时,果然在Process.GetCurrentProcess().StartInfo出现了InvalidOperation异常,至此我们将异常范围缩小到了StartInfo属性。
.net core 3.0版
public static Process GetCurrentProcess()
{
throw null;
}
public ProcessStartInfo StartInfo
{
get
{
throw null;
}
set
{
}
}
.net Framework版
public static Process GetCurrentProcess()
{
return new Process(".", isRemoteMachine: false, Microsoft.Win32.NativeMethods.GetCurrentProcessId(), null);
}
public ProcessStartInfo StartInfo
{
get
{
if (startInfo == null)
{
startInfo = new ProcessStartInfo(this);
}
return startInfo;
}
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
startInfo = value;
}
}
结论
至此我们得出结论:在.net core3.0中,一则由于GetCurrentProcess()返回为null,二则StartInfo的get并未进行实例化,所以当后面调用StartInfo属性时无论如何都会抛出异常。
启示
.net core3.0是.net core框架中支持桌面程序的第一个大版本,存在一定的问题是正常的。但是作为一个程序员,应该以稳定性为重,不要只贪图新技术带来的快感。最后将一句老子的格言送给正在阅读的你:
我有三宝,持而守之。一曰慈、二曰俭、三曰不敢为天下先。慈固能勇;俭固能广;不敢为天下先,固能成器长。
由Restart()想到的的更多相关文章
- centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!
centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多! 一.手动安装 1.下载(官网) cd /soft wget http://www.clam ...
- 由安装两块网卡的linux系统中引起网络不通想到的
由安装两块网卡的linux系统中引起网络不通想到的 一天,小王突然急匆匆的来找我,他说:"我在机子上刚装的redhat怎么老也ping不通服务器,我网卡的驱动都安装了,ping 自己的两块网 ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- OpenGL ES 3.0: 图元重启(Primitive restart)
[TOC] 背景概述 在OpenGL绘制图形时,可能需要绘制多个并不相连的图形.这样的情况下这几个图形没法被当做一个图形来处理.也就需要多次调用 DrawArrays 或 DrawElements. ...
- 由css reset想到的深入理解margin及em的含义
由css reset想到的深入理解margin及em的含义 原文地址:http://www.ymblog.net/content_189.html 经常看到这样语句,*{ margin:0px;pad ...
- 关于点击Invalidate Caches/Restart禁止插件后,重新加载--Android Studio
1:47:27 Plugin Error Problems found loading plugins: Plugin "Google Analytics Uploader" wa ...
- 处理Assetbundle依赖关系时想到的一道题
在处理unit3d的assetbundle依赖关系的时候,想到了一道有趣的题目: 给定一堆数据,例如{A = {1, 3, 4}, B = {3, 4}, C = {5, 6}, D = {6, 7, ...
- 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)
1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...
- Tomcat重启脚本restart.sh停止脚本stop.sh
Tomcat重启脚本restart.sh停止脚本stop.sh Tomcat本身提供了 startup.sh(启动)shutdown.sh(关闭)脚本,我们在部署中经常会出现死进程形象,无法杀掉进程需 ...
- 由ASP.NET所谓前台调用后台、后台调用前台想到HTTP——实践篇(二)
在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP——理论篇中描述了一下ASP.NET新手的三个问题及相关的HTTP协议内容,在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP—— ...
随机推荐
- K8S发布应用步骤详解
前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤. 1.从代码仓库下载代码,比如GitLab: 2.接着是进行打包,比如使用Maven: 3.编写Dockerfile文件,把步骤2产生 ...
- GitHub 入门 与 2023年2月18日10:29:02
用 GitHub 有一段时间了,之前一直用来做 Hexo 的服务器,直到前阵子搞 GitHub Action 因为命令不熟,把 GitHub 上的源码强制拉到本地把本地的 Hexo 搞崩了,博客源码都 ...
- CRT 与 exCRT
感觉网上很多写的都不是很清楚啊 awa. CRT 就是解这个方程 \(\begin{cases}x\equiv r_1 \pmod {m_1}\\ x\equiv r_2 \pmod {m_2} \\ ...
- Mybatis 实体类驼峰命名与数据库字段之间映射
数据库的命名规则和 Java 的命名规则不一致,导致实体类与数据库字段不能完美映射. 一.可以在 mapper.xml 中通过 resultMap 来解决: <resultMap id=&quo ...
- Android:Activity
什么是 Activity 简单来说 Activity 类似于一个 Web 的页面,表示拥有整个屏幕的界面.电子邮件应用可能有一个显示新电子邮件列表的 Activity.一个用于撰写电子邮件的 Acti ...
- 用C++ 弹奏武侠音乐:沧海一声笑
前言: 参照网路代码,用编程语言来弹奏一首音乐,搞点轻松的 原文:点击此处 完整代码: 以下为Visual Stuido 2022测试可用,控制台程序.运行之后,会自动弹奏沧海一声笑,并且出现歌词.主 ...
- AirTest
1.环境 直接安装AirTest IDE 就可以了 2.连接手机 打开开发者模式,允许Usb调试,手机在电脑界面显示出来即可 3.Airtest辅助窗 4.Poco辅助窗 新建一个air文件 在poc ...
- LeetCode-911 在线选举
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/online-election 题目描述 给你两个整数数组 persons 和 times .在选 ...
- Mybatis plus 查询
1.子查询 // 管理主管查询 Integer manageSupervisor = query.getManageSupervisor(); if (manageSupervisor != null ...
- 一个厂区宿舍管理后台密码爆破 - selenium版
title: 某厂区宿舍管理后台密码爆破-selenium测试 author: 杨晓东 permalink: 某厂区宿舍管理后台密码爆破-selenium测试 date: 2021-10-02 11: ...