最近,在群里讨论的时候看到一个很有趣的需求,所以研究了一下。下面是研究出来来的结果。
有没有想过,想用.NET做一个演示程序或者做个光盘的MENU。但却苦于,机器上没有.NET 而无法运行。
或许你认为这个很简单,做个安装程序不就可以了,但实际上,这样自动运行的程序,不适合制作安装程序, 或者说,他应该不需要安装。
也许你认为这个也容易,用Dot NET 虚拟机不久好了。没错,用这个,确实可以,不过会有几个问题。
第一,会有一个兼容性的问题。毕竟精简了.NET 类库,只有几个少数文件。
第二,版权问题。
实际上,大家可能都没有注意这个问题,但如果自己找,还是有人说的,飞信 用的那个虚拟机,是购买而来的。因此,你用了用了,就算是盗版了。这个问题,在国内,或许没人深究,但在国外就不同了,这也是我写本文的原因之一。
还有,另一种,解决方式,就是用VC++ 写一个引导,不过这对于我们这些不熟悉VC的人,是一个麻烦。
不知道,大家最近有没有关注 SQL2008呢?尝试过的人,一定会发现一个很细节的不同,那就是,安装的引导界面不同了。
实际上,在这个之前,还会有一个东西出来,那就是,提示你 安装 .NET Framework 3.5 SP1 。为什么会这样呢?因为,新的引导程序,就是.NET 做的了。
本文,将会指导你,如何让VS帮助我们生成这样的Loader,在没有安装.NET 的机器上,自动安装.NET Framework, 在已安装的机器上,直接运行程序。
注意: 由于需要手动修改项目文件, 因此操作错误,可能会使项目出现问题。请在对已有的工程修改前,做好备份。
先说一下原理, 做Client程序,应该都会知道ClickOnce,通过它,可以快速制作一个安装程序,来部署项目。在部署的时候,选择依赖,这样在安装的时候,如果 客户端,没有相应的组件,就会自动安装。这个就是Bootstrapper,用于检查程序依赖项,并自动安装的启动程序。我们的任务,就是定这个 Bootstrapper,将它指向的安装程序,对准我们实际要运行的程序,这样就达到了上面的目的。
那么我们开始吧,这里,为了演示,我将新建一个Win Form程序, 当然,你也可以用一个已有的项目,不过,记得要备份哦!
1、新建一个项目,名字为 AutorunDotNet。 这里要说明的是,我选择的是.NET 3.5,实际上,你也可以选择.NET 2.0 的程序。另外,要说的一点是,我用的是VB.NET ,但实际上,我们是修改的项目文件,和语言无关。
2、简单修改一下项目。 (实际上,可以不用做这个。)
3、设置项目依赖。
a.双击解决方案中的“My Project” ,打开项目属性页。
b.选择 “发布” 选项卡, 单击 “系统必备”。
c.在“系统必备”里, 确保选择 “ 创建用于安装系统必备组件的安装程序”, 然后 下发,选择 需要安装的系统必备组件。 最后,在“指定系统必备组件的安装位置” 里,选择 “从与我的应用程序相同的位置下载系统必备组件”, 单击 确定 。(注:你可以不必设置这个,这样,安装程序,会在网络上下载,安装程序。)
恩,准备工作差不多了。下面开始修改项目文件吧。
4、编辑项目
a.卸载项目
右键单击项目, 选择 “卸载项目”
注:如果,VS没有显示, 需要打开 “工具” ——“选项”,找到“项目和解决方案”, 选择 “总是显示解决方案”。
b.编辑项目
右键 单击“AutotrunDotNet”,选择“编辑 AutorunDotNet.vbProj”。
a.将这段内容改成如下样子。
Code
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. -->
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
<GenerateBootstrapper
ApplicationFile="$(TargetFileName)"
ApplicationName="$(AssemblyName)"
ApplicationUrl="$(_DeploymentFormattedApplicationUrl)"
BootstrapperItems="@(BootstrapperPackage)"
OutputPath="$(TargetDir)"
ComponentsLocation="$(BootstrapperComponentsLocation)"
Path="$(GenerateBootstrapperSdkPath)" />
</Target>
b.修改好后,保存。 在右键 单击“AutorunDotNet”项目,选择“重新加载项目”。
6、OK,修改完成。编译一下看看。
如果没有错误,你将会在输出的文件夹下,看到一下内容。
这个Setup.exe,就是我们要的Loader。 2个文件夹里的是.NET 安装程序 和 Windows Installer 3.1 。
补充一点, 这个方法,目前还不能自动生成 Autorun.inf 。
因此只能我们自己手动写一个了,不是很难。( 虽然我很想人让它自动,生成,但没有找到相关资料。)
Autorun.inf
[ autorun ]
open = setup.exe
icon = setup.exe , 0
其他说明
这个,我在VS2008 SP1上测试的, 根据MSDN的说法, 这个最低适用于 VS2005
如果怕影响当前项目,可以新建一个项目,专门用来做这个~
还有这里,简单说明一下 <GenerateBootstrapper > 就是用来生成实Bootstrapper 。
ApplicationFile="$(TargetFileName)" 这个指定要运行的程序名字,这里这个参数,是默认项目输出的名字。
ApplicationName="$(AssemblyName)" 程序的名字,即在执行的时候,提示的。这里是程序集的名字。
OutputPath="$(TargetDir)" 输出位置, 这里默认是项目输出的文件夹
其他的属性,请参考http://msdn.microsoft.com/zh-cn/library/ms164294.aspx
事例代码在这里下载 http://code.msdn.microsoft.com/AutorunDotNET
在这里简述一下,当初在群提出这个问题的情况。(由于实际信息,可能不方便说书,所以,决定,不说!!)
这个公司,给客户做了一个网站的演示程序,用WinForm作的。 之后,要把这个程序刻录到光盘,送给客户。
但因为是.NET 做的, 在没有.NET 的机器上,程序就无法运行。 反之,有因为商业程序,客户不见得会懂得很多开发信息。也不好让客户自己安装.NET 。
所以,需要一个确保的机制。 在没有.NET的机器上自动安装,之后并自动运行程序。
实际上,当时在讨论的时候,说了2点,一是 用 飞信的虚机, 二是写一个VC++的程序。
但这2点 都不符合, 一是,客户是 国外的,对用了带版权的东西,有多说头。 二是, 他们公司里面的没有人懂VC++。
=================
Q&A
=================
Q:错误 1 系统必备的安装位置未设置为“组件供应商的网站”,无法在磁盘上找到项“.NET Framework 3.5 SP1”中的文件“DotNetFX35SP1/dotNetFX20/aspnet.msp”。有关详细信息,请参见“帮助”。
A:VS 2008 SP1 升级后,并没安装.NET 3.5 SP1 完整版的 Bootstrapper,而只是复制了几个文件。 因此,默认是按配置中的信息,从网络上下载的在线安装版本。 你可以按照下面的方法,制作离线的完整版。或者在这里下载完整版的 复制到 Bootstrapper下。
首先, 去官方,下载 .NET 3.5 Sp1 完整版 和 2个中文语言包(x86 和x64)
http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe
然后,找到Bootstrapper的本地位置。
这个位置,默认是Windows SDK安装的位置。
我这里的位置是 C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper
C 盘是我的系统盘, V6.0A 是SDK的版本号, 如果你安装了其他版本, 有可能会使Bootstrapper 更改位置
在这个文件夹下,可以看到 DotNetFX35SP1 文件夹,把.NET 安装程序解压到这里, 如果怕操作失误,可以先备份一下。
1、用Winrar等工具,将dotnetfx35.exe 解压缩。
2、打开 解压缩的文件夹,进入到 wcu/dotNetFramework (用WinRAR查看的时候,有很多… 原因不明)
3、将dotNetFramework 下的所有内容,复制到(之前那个Bootstrapper里的) DotNetFX35SP1 下。
4、进入DotNetFX35SP1,下的zh-CHS 文件夹。
5、新建一个名为 DotNetFX35 文件夹,并进入。
6、新建2个文件夹,名字分别是 “x64”和 “x86”
7、将下载的x64语言包 dotnetfx35langpack_x64zh-CHS.exe 复制到 “x64”文件夹下
8、将下载的x86语言包 dotnetfx35langpack_x86zh-CHS.exe 复制到 “x86”文件夹下
这样就完成了,你的VS应该可以正常的从本地复制 .NET 3.5 的完整安装。
完整版的下载链接在这里,虽然,很想弄成3个文件, 但没有成功。
http://www.mediafire.com/file/oe3kgyz1eis/DotnetFX35SP1.part1.rar
http://www.mediafire.com/file/fxfqb5lxtnd/DotnetFX35SP1.part2.rar
http://www.mediafire.com/file/pu405auktni/DotnetFX35SP1.part3.rar
http://www.mediafire.com/file/2hyammjnr5o/DotnetFX35SP1.part4.rar
将以上文件解压至 Bootstrapper 文件夹下即可。
如果链接出现问题,请回复。
PS.本打算,直接分享一个来的, 结果,看了一下容量, 我晕倒了。 316MB
如果能找到一个好的空间的话, 稍后会上传上来。
在这里说一个题外话,很多人都说.NET 太大了。 实际上,一点点细节没有注意。
.NET 3.5 之后,提供的程序包,里面,实际上包含了 X64 和X86 2个平台的安装程序。另外,由于,Vista 以上的系统内置.NET ,因此,对这个平台的安装,又使用了MSU。所以,最终,的结果是,包含了2类系统的安装程序,每种又有X86和X64平台的安装文件。
PS.刚才瞄了一下,MSU里,居然还有一个安腾的X64。那上面的就。。。
Q:怎样更改引导程序的图标和名称呢?
A:很抱歉,这个生成,图标资源,无法更改。因此,图标只能。。。 以后可能会研究看看,但希望恐怕不大, 因为 VS 所有生成的 安装程序(ClickOnce和MSI) 都是这个图标。但听说ClickOnce ,在.NET 3.5 SP1 有够个重大变革,可以自定义安装界面。不过这个还没有深入研究。如果,放入到光盘上的话,可以通过修改Autorun.inf 更改光盘的显示图标。
[autorun]
open=setup.exe
icon=AutorunDotNet.exe,0
将Icon指定光盘的图标,可以是个ICO文件。
至于,文件名称,这个可以自由更改,没有限制。