文号
t72311
阅读
13394
回复
8
收藏
3
.NET编写的程序在NT6.x中免装运行库的方法
2015/06/29
IP:四川
Visual C# / Visual Basic写的程序需要拖一个很大的运行库(3.5有二百多MB,4.x有几十MB),这是Windows XP时代.NET Framework不普及的主要原因,很多几十kb的小程序必须拖这么一个大运行库实在是大煞风景的事情。

好在现在的NT6系统都自带.NET Framework了,不过随着4.0的发布,麻烦又来了:Vista自带.NET Framework 3.0,Win7自带.NET Framework 3.5,需要手动安装.NET Framework 4.x,可是很多人嫌麻烦都不会去装(包括我)。最麻烦的是Win8默认不带.NET Framework 3.5了,而自带的.NET Framework 4.5又不能运行3.5程序,运行3.5程序时需要联网安装.NET Framework 3.5,慢不说还时有出错,相当麻烦。

.NET Framework 2.0/3.0/3.5使用2.0 Runtime,而.NET Framework 4.x使用4.0 Runtime。4.x不能运行3.5程序的主要原因是4.0的运行时不接受2.0程序,但是实际上是能够向下兼容的,不过要动一下手脚。

一、建立一个基于.NET Framework 3.5的工程
.NET Framework 2.0 Runtime最高支持.NET Framework 3.5,因此必须保证工程是基于.NET Framework 3.5的:
捕获1.png
如果已经建立了工程,那么需要改变工程版本,方法如图:
捕获4.png

二、向工程添加App.config文件
方法如图所示,点击项目->添加新项->常规->应用程序配置文件:
捕获2.png

三、添加运行时支持信息
编辑App.config,改为如下内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup uselegacyv2runtimeactivationpolicy="true">
    <supportedruntime version="v2.0.50727">
    <supportedruntime version="v4.0">
  </supportedruntime></supportedruntime></startup>
</configuration>
其中<startup useLegacyV2RuntimeActivationPolicy="true">保证混合组件兼容性(如DirectX),<supportedRuntime version="v2.0.50727" />和<supportedRuntime version="v4.0" />指示程序可以在2.0和4.0运行时中运行。
捕获3.png

四、编译发布运行
目标修改为Release,编译后可在bin\Release目录下看到MyProg.exe和MyProg.exe.config文件,将其放在相同目录下,即可在Win7和Win8中均免运行库。
捕获5.png
在没有安装.NET Framework 3.5的Windows 8中正常运行
Windows 8-2015-06-29-21-25-32.png

五、备份以供其它项目使用
右击工程,选择『在Windows资源管理器中打开文件夹』,把App.config复制到一个不容易忘记的地方保存,以后想写程序的时候就可以直接添加这个文件了。
捕获6.png
捕获7.png
捕获8.png
[ 修改于11年6个月前 - 2015/06/30 00:04:29 ]
acmilan作者
11年6个月前IP:四川
775958
1楼
VS2010编译.NET 3.5的C++/CLR工程还需要装VC2008编译器。。。
而且还不能添加App.config配置文件,虽然手动复制一下就好了。。。
----
VC2008编译器不一定要安装VS2008,还可通过WinSDK7.0安装(但是肯定不会带有ATL和MFC)
引用
评论
11年6个月前IP:北京
775980
2楼
也就是说实际能兼容运行,只是微软在捣鬼?
引用
评论
acmilan作者
11年5个月前IP:四川
779857
3楼
netfx.png
引用
评论
acmilan作者
11年1个月前IP:四川
798216
4楼
更好的方法应该是将4.0.30319放在2.0.50727前面,这样会优先匹配.NET 4.x:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup uselegacyv2runtimeactivationpolicy="true">
        <supportedruntime version="v4.0.30319">
        <supportedruntime version="v2.0.50727">
    </supportedruntime></supportedruntime></startup>
</configuration>

如果不这样做的话,在Win8/8.1/10中运行会将控件显示为Win7样式。
引用
评论
11年0个月前IP:山东
799128
5楼
今天遇到这个问题了,看了一遍,我还是编译俩版本 xp win8 及以上用4.0 win7用3.5吧
引用
评论
11年0个月前IP:辽宁
799187
6楼
感谢分享 get到!
最近正转程序员开始接触C# WinForm  
今天还在研究DeBug和Release的区别。。。
引用
评论
acmilan作者
11年0个月前IP:四川
799465
7楼
支持情况更新
以下系统不再支持新版本的框架
Windows 2000最高2.0 SP2
Windows XP最高3.5 SP1 + 4.0.3
Windows Server 2003(1.1)最高3.5 SP1 + 4.0.3
Windows Vista(3.0)最高3.5 SP1 + 4.6
以下系统可安装4.6.1
Windows 7(3.5.1)
Windows 8(4.5, 3.5.1 optional)
Windows 8.1(4.5.1, 3.5.1 optional)
Windows 10(4.6, 3.5.1 optional)
以下系统自带4.6.1
Windows 10, Version 1511(4.6.1, 3.5.1 optional)
引用
评论
acmilan作者
10年10个月前IP:江西
808794
8楼
更正:
Windows Vista可以安装4.6.1,但是并没有在支持列表中
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的