【C#】.net3.5实现子线程修改主线程界面 判断.net环境版本 静默安装.net

前言

写这篇文之前,有些人就要问了,为什么要用这么旧的版本的dotnet这不是找罪受吗,在这里我要声明一下,虽然win7已经不维护了,但是win7还是在市场上占有绝大部分份额的,然而win7自带的版本就是.net3.5,我现在需要做的是一个安装程序,安装程序里面判断.net版本,静默安装所需的版本所以会有一个与用户交互的界面,因为打开了ClickOnce 代码访问安全性,因此就涉及到了使用子线程调用主线程界面导致报错的问题了。


这里有2种解决方法

1、在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;

CheckForIllegalCrossThreadCalls在.net1.x中默认是false,也就是不检查,.net2.0和3.x默认是true

以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true。

换言之,Control.CheckForIllegalCrossThreadCalls——是否检查线程安全,是否允许跨线程调用控件操作

C#的Winform开发中,一般是不推荐使用线程去直接访问UI控件的。
访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。

2、使用Invoke等委托函数

使用Invoke等委托函数,也可以解决这个问题,而且我认为这个是最优解。

话不多说,直接放出核心代码:

子线程修改主线程界面最主要的就是使用Invoke,想了解得深入一点的看这篇文章


this.Invoke(new Action(() =>
            {
                listBox1.Items.Add(str.ToString());
            })); 


判断.net环境版本:

这里用到了cmd命令,先继续了解C#调用cmd、bat命令的看这里


reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" /v "Release"


实现静默安装.net:

微软官方放出来的也是cmd命令,加一个参数就可以实现静默安装了


".net 4.5.1-英文版.exe" /q /norestart
".net 4.5.1-中文语言包.exe" /q /norestart

当然如果你只是想简单的安装.net,那不妨直接使用下面的代码(installerFilePath是安装包的路径)


System.Diagnostics.Process.Start(installerFilePath, " /q /norestart");



本文出自《粉墨记忆》 => 《【C#】.net3.5实现子线程修改主线程界面 判断.net环境版本 静默安装.net
转载时请注明出处及相应链接, 本文地址:https://www.fmxk.ac.cn/?post=15

WRITTEN BY

avatar


发表评论: