当前位置: 代码迷 >> C# >> 解决c#wpf程序带环境安装包体积太大有关问题
  详细解决方案

解决c#wpf程序带环境安装包体积太大有关问题

热度:332   发布时间:2016-04-28 08:23:04.0
解决c#,wpf程序带环境安装包体积太大问题

在.net开发客户端的时候,一定会遇到用户没有安装.net环境的问题,特别是现在win7,win8,win10多系统并用的时间段,很多开发者使用的是4.5的目标环境,用户却是使用win7的系统,这样势必会要安装环境包

可是如果win7的用户已经安装4.5的环境呢?那么用户是否需要连带着环境包一起下载呢?

 

我们前几天也遇见了这种困境,如果加上环境,安装包的体积太大,本身软件才几m,环境竟然高达70M,完全不合理嘛。

后来想到了一个折中的办法,

我们可以在项目中添加一个新的工程名为【PreLoad】,目标的环境选择win7最低的版本,framework 3.5

然后把主程序的入口设置成我们的PreLoad,在程序启动的时候PreLoad来判断用户的电脑安装的最高环境是否符合我们主程序的要求,如果符合,那么直接启动程序,如果不符合,我们在PreLoad中下载目标环境,自动安装。

这样,我们的程序体积就能大大减少。

 

至于为什么不用低版本的framework开发?

那是因为很多酷炫的功能只有高版本的才有,用户可挑剔了。一般客户端的得喜欢用c++,我水平不够顶多就要依赖framework开发wpf了

 

献上判断本机最高framework版本的代码

 

        public static bool IsOverVersion()        {            using (RegistryKey ndpKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full\\"))            {                int releaseKey = Convert.ToInt32(ndpKey.GetValue("Release"));                return CheckVersion(releaseKey);            }        }
private static string CheckFor45DotVersion(int releaseKey)        {            if (releaseKey >= 394271)                return "4.6.1 installed on all other Windows OS versions or later";            if (releaseKey >= 394254)                return "4.6.1 installed on Windows 10 or later";            if (releaseKey >= 393297)                return "4.6 installed on all other Windows OS versions or later";            if (releaseKey >= 393295)                return "4.6 installed with Windows 10 or later";            if (releaseKey >= 379893)                return "4.5.2 or later";            if (releaseKey >= 378758)                return "4.5.1 installed on Windows 8, Windows 7 SP1, or Windows Vista SP2 or later";            if (releaseKey >= 378675)                return "4.5.1 installed with Windows 8.1 or later";            if (releaseKey >= 378389)                return "4.5 or later";            return "No 4.5 or later version detected";        }

  

 

PS:很多人喜欢使用 Environment.Version     来判断系统的版本号,可是经过测试,这样的拿到的数据只是软件本身目标框架的版本,并不是本机的最高版本号,最高的版本号还是要在注册表里面查看。

在代码中已经标明了个个版本在注册表中拿到的版本号码。

 

另外很多同学会问如果我就是需要知道目标框架呢?

那我这里还有一份表格,由Environment.Version 拿到的数据可以通过这个来判断版本

Base 4.0

  • 4.0.30319.1 = .NET 4.0 RTM
  • 4.0.30319.269 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 
  • 4.0.30319.276 = .NET 4.0 on Windows XP SP3 (4.0.3 Runtime update)
  • 4.0.30319.296 = .NET 4.0 on Windows XP SP3, 7 
  • 4.0.30319.544 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 
  • 4.0.30319.1008 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS13-052 GDR security update)
  • 4.0.30319.1022 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-009 GDR security update)
  • 4.0.30319.1026 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-057 GDR security update)
  • 4.0.30319.2034 = .NET 4.0 on Windows XP SP3, 7, 7 SP1 (with MS14-009 LDR security update)

4.5

  • 4.0.30319.17626 = .NET 4.5 RC
  • 4.0.30319.17929 = .NET 4.5 RTM
  • 4.0.30319.18010 = .NET 4.5 on Windows 8
  • 4.0.30319.18052 = .NET 4.5 on Windows 7 SP1 64-bit
  • 4.0.30319.18063 = .NET 4.5 on Windows 7 SP1 64-bit (with MS14-009 security update)

4.5.1

  • 4.0.30319.18408 = .NET 4.5.1 on Windows 7 SP1 64-bit
  • 4.0.30319.18444 = .NET 4.5.1 on Windows 7 SP1 64-bit (with MS14-009 security update)
  • 4.0.30319.34014 = .NET 4.5.1 on Windows 8.1 64-bit

4.5.2

  • 4.0.30319.34209 = .NET 4.5.2 on Windows 7 SP1 64-bit
  • 4.0.30319.34209 = .NET 4.5.2 on Windows 8.1 64-bit

4.6

  • 4.0.30319.42000 = .NET 4.6 on Windows 8.1 64-bit

 

 

 

 

 PSS:最后,感叹一下,离开大公司进入创业公司之后,面对的问题越来越多,解决问题的能力得到了质的飞跃,每一个项目都是公司的命脉,每个人的身上都肩负着重要的责任,不再是大公司的螺丝钉,而是建设的参与者,方向的影响者。

如有疑问欢迎提问,大家共同进步!

 

最后,创业公司招人,前端,PHP,c#,公司地址:广州,有意者欢迎留言私聊。

 

 

个人主页:WWW.bobdong.cn

 

3楼拥剑公子
请教几个问题:,1. win7是自带.net3.5,win8及以上系统默认安装.net3.5和.net4.5,对吗,您有没有测试过,2. PreLoad中调用 .net4.5安装程序需要把 onlinesetup.exe集成进来吧,想由mfc切换wpf。不吝赐教。谢谢
Re: 董小保
@拥剑公子,1、win8已经是4.0了,不过还是建议使用3.5的,因为除了core,.netframework都是向下兼容的。,2、PreLoad中我是直接把网络上的环境安装包下载到本地再启动软件安装的。没有提前打包安装软件。
2楼calvinK
做安装包的时候选择必须要的环境,并设置下载地址不久完了么。为什么要自己写个preload来做安装包可以做到的事情呢
Re: 董小保
@calvinK,因为没有找到好的打包软件呀,所以才迫不得已使用了这种比较笨的方法。
1楼蜗牛往前走
如果系统“被优化”过,既没有4.5也没有3.5,你是不是先让客户安装个.net 3.5,然后系统启动后再去下载个4.5安装呢?,我建议直接写bat批处理文件来代替PreLoad。或者用C++写
Re: 董小保
@蜗牛往前走,其实最好的结局方案是 用c++写,可是由于不想混用,于是就想了一个这么不伦不类的方法了
  相关解决方案