用Visual Studio 2010创建集成.Net Framework3.5 SP1的安装包

由于windows7集成的是.Net Framework3.5SP1,还没有集成.Net Framework4,所以我在给别人做东西的时候还是更倾向于基于3.5 SP1。而又要考虑到目前还仍有不少的XP用户,所以即使是采用3.5 SP1,也需要考虑客户机上是不是安装了.Net Framework。

所以在制作安装包的时候,需要将.Net的安装包也集成进去。而Visual Studio2010默认只包含了.Net 4的安装包,所以在生成集成有3.5SP1的安装包时,遇到了一些麻烦。

首先,想要制作一个带有.Net Framework的安装包,需要如下:

  1. 新建一个安装项目

  2. 查看项目属性,点击“系统必备”按钮

  3. 在弹出的系统必备对话框中,选中“创建用于安装系统必备组件的安装程序”

  4. 在下方的安装位置处,选择“与从我的应用程序相同的位置下载系统必备组件”,则为将必备组件的安装程序集成到安装包中,选择“从组件供应商的网站上下载系统必备组件”,则为不集成到安装包里,而是引导用户在微软网站下载。所以在此选择“与从我的应用程序相同的位置下载系统必备组件”

  5. 若需要.Net Framework3.5SP1,则在必备组件中选择.NET Framework 3.5 SP1,取消选择Microsoft .Net Framework 4(x86和x64)即可。

  6. 若生成项目,可以发现出现一大堆找不到文件的错误。解决的主要思想是:自己将.Net Framework 3.5 SP1的安装文件和简体中文语言包的x86和x64版安装文件拷贝到如下文件夹内:

    1
    C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages

可以看到,默认Packages文件夹下已有DotNetFX35SP1子文件夹,不过其内只有以下几个配置文件:

1
2
3
4
5
6
7
8
9
C:\>tree "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\dotNetFX35SP1" /f
卷 WIN7 的文件夹 PATH 列表
卷序列号为 00000031 BA5C:BB7D
C:\PROGRAM FILES\MICROSOFT SDKS\WINDOWS\V7.0A\BOOTSTRAPPER\PACKAGES\DOTNETFX35SP1
│ product.xml
└─zh-Hans
eula.rtf
package.xml

我们需要下载dotnetfx35.exe(http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=d0e5dea7-ac26-4ad7-b68c-fe5076bba986&DisplayLang=zh-cn)后解压,将解压所得的wcu\dotNetFramework\下的所有文件及目录都拷贝到Packages\DotNetFX35SP1\目录下。

  1. 这时如果马上进行生成安装包的尝试,会发现还剩两个错误:简体中文语言包的x86和x64版两个安装文件没有找到:
1
2
系统必备组件的安装位置未设置为“组件供应商的网站”,并且无法在磁盘上找到项“.NET Framework 3.5 SP1”中的文件“DotNetFX35SP1\DotNetFX35\x64\dotnetfx35langpack_x64zh-CHS.exe”。有关详细信息,请参见帮助。
系统必备组件的安装位置未设置为“组件供应商的网站”,并且无法在磁盘上找到项“.NET Framework 3.5 SP1”中的文件“DotNetFX35SP1\DotNetFX35\x86\dotnetfx35langpack_x86zh-CHS.exe”。有关详细信息,请参见帮助。

首先下载dotnetfx35langpack_x64zh-CHS.exe和dotnetfx35langpack_x86zh-CHS.exe。

注意!虽然提示的错误是找不到DotNetFX35SP1\dotNetFX35\x64\dotnetfx35langpack_x64zh-CHS.exe和DotNetFX35SP1\dotNetFX35\x86\dotnetfx35langpack_x86zh-CHS.exe,但将文件拷贝到这里,你会发现照样是找不到文件的错误!

应该将两个文件分别拷贝到Packages\DotNetFX35SP1\zh-Hans\DotNetFX35\x64和Packages\DotNetFX35SP1\zh-Hans\DotNetFX35\x86下,复制过去之后再生成,成功

原因:微软把语言包独立出来了,如果你查看Packages\DotNetFX35SP1\product.xml,你会发现里面没有DotNetFX35\x86\dotnetfx35langpack_x86zh-CHS.exe这个PackageFile,而在Packages\DotNetFX35SP1\zh-Hans\product.xml里,你可以发现有两个PackageFile是我们需要的。所以,错误信息里提示的缺少文件,其实是PackageFile的Name值,而不是在磁盘上的存储路径。

所以,根本不需要修改product.xml!

最终的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
C:\>tree "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\dotNetFX35SP1" /f
卷 WIN7 的文件夹 PATH 列表
卷序列号为 00000031 BA5C:BB7D
C:\PROGRAM FILES\MICROSOFT SDKS\WINDOWS\V7.0A\BOOTSTRAPPER\PACKAGES\DOTNETFX35SP1
│ dotNetFx35setup.exe
│ product.xml
├─dotNetFX20
│ ASPNET.msp
│ ASPNET_64.msp
│ clr.msp
│ clr_64.msp
│ crt.msp
│ crt_64.msp
│ dw.msp
│ dw_64.msp
│ Netfx20a_x64.msi
│ Netfx20a_x86.msi
│ NetFX_CA.msp
│ NetFX_Core.msp
│ NetFX_Core_64.msp
│ NetFX_Other.msp
│ NetFX_Other_64.msp
│ prexp.msp
│ winforms.msp
│ winforms_64.msp
├─dotNetFX30
│ │ Netfx30a_x64.msi
│ │ Netfx30a_x86.msi
│ │ RGB9RAST_x64.msi
│ │ RGB9RAST_x86.msi
│ │ WCF.msp
│ │ WCF_64.msp
│ │ WCS.msp
│ │ WCS_64.msp
│ │ WF.msp
│ │ WF_32.msp
│ │ WF_64.msp
│ │ WIC_x64_enu.exe
│ │ WIC_x86_enu.exe
│ │ WPF1.msp
│ │ WPF1_64.msp
│ │ WPF2.msp
│ │ WPF2_32.msp
│ │ WPF2_64.msp
│ │ WPF_Other.msp
│ │ WPF_Other_32.msp
│ │ WPF_Other_64.msp
│ │ XPS.msp
│ │ XPSEPSC-amd64-en-US.exe
│ │ XPSEPSC-x86-en-US.exe
│ │
│ ├─x64
│ │ msxml6.msi
│ │
│ └─x86
│ msxml6.msi
├─dotNetFX35
│ ├─ia64
│ │ netfx35_ia64.exe
│ │
│ ├─x64
│ │ netfx35_x64.exe
│ │
│ └─x86
│ netfx35_x86.exe
├─dotNetMSP
│ │ NetFx_20_SP1_ENU_License.rtf
│ │ NetFx_30_SP1_ENU_License.rtf
│ │
│ ├─ia64
│ │ NetFX2.0-KB948609-v6001-ia64.msu
│ │ NetFX3.0-KB948610-v6001-ia64.msu
│ │
│ ├─x64
│ │ NetFX2.0-KB936704-v6000-x64_RTM_en.msu
│ │ NetFX2.0-KB948609-v6001-x64.msu
│ │ NetFX3.0-KB936705-v6000-x64_RTM_en.msu
│ │ NetFX3.0-KB948610-v6001-x64.msu
│ │
│ └─x86
│ NetFX2.0-KB936704-v6000-x86_RTM_en.msu
│ NetFX2.0-KB948609-v6001-x86.msu
│ NetFX3.0-KB936705-v6000-x86_RTM_en.msu
│ NetFX3.0-KB948610-v6001-x86.msu
├─Tools
│ clwireg.exe
│ clwireg_ia64.exe
│ clwireg_x64.exe
└─zh-Hans
│ eula.rtf
│ package.xml
└─DotNetFX35
├─x64
│ dotnetfx35langpack_x64zh-CHS.exe
└─x86
dotnetfx35langpack_x86zh-CHS.exe