由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—— ...
随机推荐
- 郁金香 注入DLL代码 与MFC窗口DLL文件 开源
10/10号更新 DLL注入器注入DLL卡死 问题 新增打开控制台 将阳光输出到控制台中 注入DLL代码 1 #include <stdio.h> 2 #include<Window ...
- 【JavaScript】JS引擎中执行上下文如何顺序执行代码
首先我们知道JavaScript引擎包括一个调用栈和堆,调用栈是代码实际执行的地方,使用执行上下文(执行环境)来完成:堆是非结构化的内存池,存储了应用程序所需要的所有对象. 执行上下文是什么? 执行上 ...
- UOJ NOI Round #6
总结 \(\text{Day1}\) 只打了 \(T1\),想正解无果以致于没时间打暴力 \(\text{T1}\) 考虑到最后一个面基者要么落在点上,要么落在边上 所以可以枚举点和边,统计最久的落在 ...
- vue2和vue3区别
1. vue2和vue3双向数据绑定原理发生了改变 vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的.vue3 ...
- vue-element-admin 怎么改后端 可以调跳过登录并且发送接口请求
1.找到根目录的 vue.config.js 添加 proxy 内容 注释掉mock 2.清空 .env.development 里的 VUE_APP_BASE_API 路径 3.user.js 方 ...
- 【3】java之string类
String 是一个字符串类型的类,使用双引号定义的内容都是字符串,但是 String 本身是一个类,使用上会有一些特殊. 一. String类对象的两种实例化方式 1.1 直接赋值 public c ...
- java学习日记20230227-java学习方法/转义字符/注释
Java学习方法 学习java基本原理和基本语法 快速入门(基本程序 CRUD) 研究技术的注意事项,使用细节,使用规范,如何优化 JAVA转义字符 \t : 一个制表位,实现对齐的功能 \n:换行符 ...
- mybatis动态标签——foreach批量添加和删除
<!-- [foreach标签] collection:设置要循环的数组或集合 item:用一个字符串表示数组或集合中的每一个数据 separator:设置每次循环的数据之间的分隔符 open: ...
- 自己使用Git规范流程-记录
配置目录 建立仓库 1.点击"New project" 2.点击"Create blank project" 3.输入仓库名称,点击创建 4.仓库创建完成,个人 ...
- 2.6 EmpController
package com.hy.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.H ...