由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—— ...
随机推荐
- 【Raspberry Pi / 树莓派】小小工控机担起大大责任
CM4 Nano是一款基于Raspberry Pi / 树莓派 Compute Module 4(简称CM4),由EDATEC面向工业应用设计的嵌入式计算机, 充分利用CM4在结构上灵活性解决CPU, ...
- 使用一个文件集中管理你的 Nuget 依赖版本号
在 .net 7 以前,项目对于 nuget 依赖项的版本依赖散落与解决方案的各个角落.这导致升级维护和查看的时候都比较麻烦.在 .net 7 中,你可以使用一个文件来集中管理你的 Nuget 依赖版 ...
- GPS地图生成01之概述
图片来源: Author: Tang Email: jianbo.tang@csu.edu.cn
- 转码服务serverless探索
背景 公司目前主要聚焦于视频这个领域,利用视频为媒体.文旅.会议等行业进行赋能. 既然聚焦于视频领域,那么视频转码则是绕不开的话题. 为了降低成本,以及保证产品的核心能力,公司自建了一套转码系统. 转 ...
- 云原生数据库TDSQL-C 容灾的实践和探索
云原生数据库TDSQL-C作为腾讯云架构平台部核心数据库产品之一,致力于为云上ToB用户和公司自研业务提供集高性能.低成本.大存储.低延迟.秒级扩缩容.极速回档.Serverless化七大特性于一体的 ...
- Deer_GF之框架介绍
介绍一下Deer_GameFramework_Wolong,这个框架是我自己这几年经验及自己摸索出来缝合出来一套包含优秀库及开发工具可以直接上手快速开发游戏的框架. 缝合东西包括游戏框架G ...
- C++实现链队列相关操作代码
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- VS2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误
.net 6.0的项目,vs2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误,同样的项目在wi ...
- redis底层数据结构之跳表(skiplist)
跳表(跳跃表, skiplist) 跳跃表(skiplist)是用于有序元素序列快速搜索查找的数据结构,跳表是一个随机化的数据结构,实质是一种可以进行二分查找的.具有层次结构的有序链表 跳表在原有的有 ...
- Centos 7.9 部署Kubernetes集群 (基于containerd 运行时)
前言 当Kubernetes社区宣布1.20版本之后会逐步弃用 dockershim ,当时也有很多自媒体在宣 传Kubernetes弃用Docker.其实,我觉得这是一种误导,也许仅仅是为了蹭热度. ...