代码改变世界

让 .NET 程序 Autorun

2008-09-02 09:24  G yc {Son of VB.NET}  阅读(6960)  评论(42编辑  收藏  举报

最近,在群里讨论的时候看到一个很有趣的需求,所以研究了一下。下面是研究出来来的结果。

 

有没有想过,想用.NET做一个演示程序或者做个光盘的MENU。但却苦于,机器上没有.NET 而无法运行。

或许你认为这个很简单,做个安装程序不就可以了,但实际上,这样自动运行的程序,不适合制作安装程序, 或者说,他应该不需要安装。

也许你认为这个也容易,用Dot NET 虚拟机不久好了。没错,用这个,确实可以,不过会有几个问题。

第一,会有一个兼容性的问题。毕竟精简了.NET 类库,只有几个少数文件。
第二,版权问题。

实际上,大家可能都没有注意这个问题,但如果自己找,还是有人说的,飞信 用的那个虚拟机,是购买而来的。因此,你用了用了,就算是盗版了。这个问题,在国内,或许没人深究,但在国外就不同了,这也是我写本文的原因之一。

还有,另一种,解决方式,就是用VC++ 写一个引导,不过这对于我们这些不熟悉VC的人,是一个麻烦。

 

不知道,大家最近有没有关注 SQL2008呢?尝试过的人,一定会发现一个很细节的不同,那就是,安装的引导界面不同了。

SQL2008

实际上,在这个之前,还会有一个东西出来,那就是,提示你 安装 .NET Framework 3.5 SP1 。为什么会这样呢?因为,新的引导程序,就是.NET 做的了。

 

clip_image002

 

本文,将会指导你,如何让VS帮助我们生成这样的Loader,在没有安装.NET 的机器上,自动安装.NET Framework, 在已安装的机器上,直接运行程序。

注意: 由于需要手动修改项目文件, 因此操作错误,可能会使项目出现问题。请在对已有的工程修改前,做好备份。

先说一下原理, 做Client程序,应该都会知道ClickOnce,通过它,可以快速制作一个安装程序,来部署项目。在部署的时候,选择依赖,这样在安装的时候,如果客户端,没有相应的组件,就会自动安装。这个就是Bootstrapper,用于检查程序依赖项,并自动安装的启动程序。我们的任务,就是定这个Bootstrapper,将它指向的安装程序,对准我们实际要运行的程序,这样就达到了上面的目的。

那么我们开始吧,这里,为了演示,我将新建一个Win Form程序, 当然,你也可以用一个已有的项目,不过,记得要备份哦!


1、新建一个项目,名字为 AutorunDotNet。 这里要说明的是,我选择的是.NET 3.5,实际上,你也可以选择.NET 2.0 的程序。另外,要说的一点是,我用的是VB.NET ,但实际上,我们是修改的项目文件,和语言无关。

           clip_image003
2、简单修改一下项目。 (实际上,可以不用做这个。)

           clip_image001[12]

3、设置项目依赖。

a.双击解决方案中的“My Project” ,打开项目属性页。

      clip_image005

b.选择 “发布” 选项卡, 单击 “系统必备”。

       clip_image006

c.在“系统必备”里, 确保选择 “ 创建用于安装系统必备组件的安装程序”, 然后 下发,选择 需要安装的系统必备组件。 最后,在“指定系统必备组件的安装位置” 里,选择 “从与我的应用程序相同的位置下载系统必备组件”, 单击 确定 。(注:你可以不必设置这个,这样,安装程序,会在网络上下载,安装程序。)

       clip_image007

 

 

恩,准备工作差不多了。下面开始修改项目文件吧。

 

4、编辑项目

a.卸载项目
       右键单击项目, 选择 “卸载项目”
            clip_image008 
         注:如果,VS没有显示, 需要打开 “工具” ——“选项”,找到“项目和解决方案”, 选择 “总是显示解决方案”。

            clip_image009

b.编辑项目

         右键 单击“AutotrunDotNet”,选择“编辑 AutorunDotNet.vbProj”。
                clip_image010 

 

5、在开的项目文件里,找到以下内容。(默认在项目结尾)
    clip_image011

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”项目,选择“重新加载项目”。

 

clip_image010[1]

 

6、OK,修改完成。编译一下看看。

 

如果没有错误,你将会在输出的文件夹下,看到一下内容。

 

   clip_image012

 

这个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下。

 

  下面是官方的方法。

   

  更新包数据

1、打开 [Program Files]\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1 文件夹。
2、在“记事本”中编辑 Product.xml 文件。


将下面的内容粘贴到 < PackageFiles > 元素中:
< PackageFile Name="TOOLS\clwireg.exe" />
< PackageFile Name="TOOLS\clwireg_x64.exe" />
< PackageFile Name="TOOLS\clwireg_ia64.exe" />

下载并提取核心安装文件

1、导航到以下 URL:http://go.microsoft.com/fwlink?LinkID=118080
2、将 dotNetFx35.exe 文件下载到本地磁盘上。

3、打开“命令提示符”窗口,然后更改到下载 dotNetFx35.exe 的目录。

4、在命令提示符下键入:

dotNetFx35.exe /x:。

5、这可将 Framework 文件提取至当前目录下的一个名为 “WCU” 的文件夹中。
复制 WCU\dotNetFramework 文件夹的内容并将其粘贴到 %Program Files%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1 文件夹中(在 x64 操作系统上为 %ProgramFiles(x86)%\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\DotNetFx35SP1)。注意:请不要复制 WCU\dotNetFramework 文件夹自身。WCU 文件夹下应包括 5 个文件夹,现在每个文件夹应显示在 DotNetFx35SP1 文件夹中。文件夹结构应类似下面这样:


DotNetFx35SP1(文件夹)

dotNetFX20(文件夹)
dotNetFX30(文件夹)
dotNetFX35(文件夹)
dotNetMSP(文件夹)
TOOLS(文件夹)
en(一些其他本地化文件夹)
dotNetFx35setup.exe(文件)

 

现在可以删除在步骤 2 和步骤 4 中下载和提取的文件和文件夹。 

 
下载语言包支持文件

 

1、有关下载位置,请参考下表。

2、导航至所提供的 URL,出现提示后,下载到表中所指示的 dotNetFx35SP1 文件夹的子目录中。注意:必须对 x86 和 x64 文件各执行一次该操作,即使您的包无需支持 x64 也是如此。

简体中文、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118146" ,目标:zh-CHS\DotNetFX35\x86)
简体中文、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118151" ,目标:zh-CHS\DotNetFX35\x64)
繁体中文、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118087" ,目标:zh-CHT\DotNetFX35\x86)
繁体中文、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118050" ,目标:zh-CHT\DotNetFX35\x64)
英语:N/A
法语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118148" ,目标:fr\DotNetFX35\x86)
法语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118153" ,目标:fr\DotNetFX35\x64)
德语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118149" ,目标:de\DotNetFX35\x86)
德语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118154" ,目标:de\DotNetFX35\x64)
意大利语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118097" ,目标:it\DotNetFX35\x86)
意大利语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118115" ,目标:it\DotNetFX35\x64)
日语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118096" ,目标:ja\DotNetFX35\x86)
日语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118114" ,目标:ja\DotNetFX35\x64)
朝鲜语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118147" ,目标:ko\DotNetFX35\x86)
朝鲜语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118152" ,目标:ko\DotNetFX35\x64)
葡萄牙语 – 巴西、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118092" ,目标:pt-BR\DotNetFX35\x86)
葡萄牙语 – 巴西、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118110" ,目标:pt-BR\DotNetFX35\x64)
俄语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118090" ,目标:ru\DotNetFX35\x86)
俄语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118108" ,目标:ru\DotNetFX35\x64)
西班牙语、x86(源 URL:"http://go.microsoft.com/fwlink?LinkID=118101" ,目标:es\DotNetFX35\x86)
西班牙语、x64(源 URL:"http://go.microsoft.com/fwlink?LinkID=118119" ,目标:es\DotNetFX35\x64)

       --------------------------------------------------

如果,你下载完之前的,可以下载Product.XML 的更新 http://www.mediafire.com/file/gol0tgw71uu/product.rar

 

http://www.mediafire.com/file/zgsnbnamakd/DotNetFX35SP1.part1.rar

http://www.mediafire.com/file/pxuewxs5rcm/DotNetFX35SP1.part2.rar

http://www.mediafire.com/file/kovaclwgvez/DotNetFX35SP1.part3.rar

 

将以上文件解压至 Bootstrapper 文件夹下即可。

如果链接出现问题,请回复。

 

PS.本打算,直接分享一个来的, 结果,看了一下容量, 我晕倒了。 316MB

如果能找到一个好的空间的话, 稍后会上传上来。

 

在这里说一个题外话,很多人都说.NET 太大了。 实际上,一点点细节没有注意。

.NET 3.5 之后,提供的程序包,里面,实际上包含了 X64 X86 2个平台的安装程序。另外,由于,Vista 以上的系统内置.NET ,因此,对这个平台的安装,又使用了MSU。所以,最终,的结果是,包含了2类系统的安装程序,每种又有X86X64平台的安装文件。

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文件。

至于,文件名称,这个可以自由更改,没有限制。