dotNetInstaller - .NET 应用程序的安装引导程序






4.96/5 (84投票s)
通过此工具,开发人员可以定义应用程序的先决条件,并根据用户操作系统类型和语言以正确的顺序安装这些组件的正确版本,允许用户从网络下载这些组件或直接安装这些组件。
引言
此应用程序不替代InstallShield、Wise或Visual Studio安装和部署项目等工具;我的目标是创建一个应用程序来帮助用户安装正确的先决条件组件。如今,应用程序通常需要安装多个组件才能正常工作:Windows Service Pack、Internet Explorer、MDAC、.NET Framework等。通过此工具,开发人员可以定义应用程序的先决条件,并根据用户操作系统类型和语言以正确的顺序安装这些组件的正确版本,允许用户从网络下载这些组件或直接从其媒体(通常是CD-ROM)安装这些组件。
此项目由以下组件组成
- dotNetInstaller.exe + 源代码:主引导程序应用程序,使用Visual Studio 2003 C++和MFC编写。
- InstallerEditor.exe + 源代码:用于编辑配置文件和编辑dotNetInstaller.exe资源的应用程序,使用Visual Studio 2003 C#编写。
- 配置示例和SupportFiles模板。
此项目基于Microsoft引导程序和Kevin Moore的引导程序“增强型.NET引导程序安装”(https://codeproject.org.cn/managedcpp/dotnetsetup.asp)。
所有设置都存储在一个XML文件中,该文件由Cho, Kyung-min使用一个小型XML解析器进行解析(XMLite:简单XML解析器。https://codeproject.org.cn/useritems/xmlite.asp
特别感谢Kevin Moore和Cho, Kyung-min的工作。
我使用Windows XP、Visual Studio 2003(C++和C#)和Microsoft .NET Framework 1.1构建了此项目。请在此处查看最新版本:http://dotnetinstaller.codeplex.com/。
编辑器:InstallerEditor.exe

您可以使用编辑器创建两种类型的配置文件
- 独立配置:从指定路径运行组件设置的配置,通常是dotNetInstaller.exe文件的相对路径。如果您想通过CD-ROM分发您的应用程序,请选择此配置。
- Web配置:从指定网站下载并执行所需组件的配置。如果您想通过网络分发配置,请选择此配置。
您可以使用编辑器创建这些配置文件,然后将这些文件包含在dotNetInstaller资源中。通过此解决方案,您只能分发一个exe文件。
另一种解决方案是在dotNetInstaller.exe的相同路径下分发名为“configuration.xml”的配置文件,如果您愿意,还可以分发名为“banner.bmp”的位图。dotNetInstaller首先检查此配置文件,如果该文件不存在,则应用程序使用嵌入到exe中的配置。
在XML配置文件中,您可以在所有命令或路径设置中使用一些路径变量。建议在所有包含一个或多个空格的command
属性中使用“符号,在msi
组件中不支持“符号,如果需要,应用程序会自动添加此符号。建议在所有带有路径值的属性(如command, dialog_bitmap, package
)中使用#APPPATH
变量,此常量允许从dotNetInstaller.exe文件夹写入相对路径字符串,否则所有路径都相对于系统当前目录。
如果您配置应用程序下载组件,我建议使用#TEMPPATH
变量下载组件,并从相同路径运行组件。
例如,如果您想在dotNetInstaller.exe的相同文件夹中启动一个文件('My App.exe'),您可以在命令字符串中写入:“#APPPATH\My App.exe”
在此版本中,您无法从编辑器更改组件的顺序,如果需要此功能,您必须手动更改XML。
教程
如何创建独立安装程序以安装.NET Framework和您的MSI安装程序
我们创建一个CD-ROM,其中包含您的MSI包、支持文件(如.NET Framework)、配置文件(configuration.xml)和位图(banner.bmp)。所有这些组件都直接从CD-ROM安装。
- 创建一个代表您的最终分发CD-ROM的文件夹,例如“c:\MyRelease\”。
- 将项目.zip中的“SupportFiles”目录复制到“c:\MyRelease\”下。
- 在SupportFiles中,将所有readme.txt文件替换为您的安装所需的实际组件文件;例如,将“SupportFiles\dotNet\v1.1\English\dotnetfx.exe.readme.txt”替换为您从微软网站下载的实际dotnetfx.exe文件。
- 将您的MSI包(您可以使用Visual Studio .NET、InstallShield或其他安装工具创建)复制到“c:\MyRelease\”下。
- 将dotNetInstaller.exe复制到“c:\MyRelease\”下。
- 创建一个位图(banner.bmp 110x208像素),名称为“c:\MyRelease\banner.bmp”,带有您的应用程序徽标。
- 执行InstallerEditor.exe文件。
- 选择菜单“文件”->“新建...”并创建一个名为“c:\MyRelease\configuration.xml”的新文件。
- 从菜单“工具”->“新项目的语言”中选择您想要的用户界面语言。(目前只有英语和意大利语,但您可以通过手动编辑属性来编写自定义消息。)
- 右键单击“Config File”节点并选择“Add”->“Setup Configuration”
- 选择刚创建的“install:”节点并使用您的应用程序名称自定义属性“dialog_caption”、“dialog_message”和“installation_completed”。
- 右键单击“install:”节点并选择“Add”->“Component Wizard...”
- 选择“Microsoft .NET Framework 1.1”、“Distributed with dotNetInstaller”并单击“OK”按钮。
- 右键单击“install:”节点并选择“Add”->“Msi Component”
- 选择刚创建的节点并使用您的安装程序和MSI包名称自定义属性“description”、“installmessage”和“package”。在包路径中,我使用#APPPATH变量,它代表dotNetInstaller.exe路径。
- 选择菜单“文件”->“保存”。
- 将“c:\MyRelease\”目录中的所有内容写入您的CD-ROM。如果您愿意,还可以创建一个“autorun.inf”文件来执行dotNetInstaller.exe。
有关其他信息,在.zip中您可以找到一个configuration.xml文件的示例,该文件配置为在Windows 98、98 SE、Millennium、NT4、2000、XP、2003上安装这些组件
- 安装.NET Framework、MDAC和Internet Explorer所需的Windows Service Pack(Windows 2000 Sp4、Windows NT 4 Sp6a、Windows 98的Year 2000更新)
- Internet Explorer 6 Sp1
- .NET Framework 1.1
- Microsoft 数据访问组件 2.7 (MDAC 2.7)
- Microsoft JET 4.0 Service Pack 6
- 示例应用程序
我包含了一个SupportFiles目录,其中包含所需的结构和一些readme.txt文件,您可以在其中找到下载所需组件的链接(通常来自微软网站)。
如何创建Web安装程序以安装.NET Framework和您的MSI安装程序
创建支持文件目录
我们创建一个网站,其中包含您的MSI包和所有支持文件(如.NET Framework)。
- 创建一个代表您的最终分发网站的文件夹,例如“http://www.mysite.com/MyRelease/”。
- 将项目.zip中的“SupportFiles”目录复制到“http://www.mysite.com/MyRelease/”下。
- 在SupportFiles中,将所有readme.txt文件替换为您的安装所需的实际组件文件;例如,将“SupportFiles\dotNet\v1.1\English\dotnetfx.exe.readme.txt”替换为您从微软网站下载的实际dotnetfx.exe文件。
- 将您的MSI包(您可以使用Visual Studio .NET、InstallShield或其他安装工具创建)复制到“http://www.mysite.com/MyRelease/”下。
创建主配置文件
我们创建一个配置文件,该文件从网站下载并安装组件(适用于.NET Framework和一个MSI包)。
- 执行InstallerEditor.exe文件。
- 选择菜单“文件”->“新建...”并创建一个名为“configuration.xml”的新文件。
- 从菜单“工具”->“新项目的语言”中选择您想要的用户界面语言。(目前只有英语和意大利语,但您可以通过手动编辑属性来编写自定义消息。)
- 右键单击“Config File”节点并选择“Add”->“Setup Configuration”
- 选择刚创建的“install:”节点并使用您的应用程序名称自定义属性“dialog_caption”、“dialog_message”和“installation_completed”。
- 右键单击“install:”节点并选择“Add”->“Component Wizard...”
- 选择“Microsoft .NET Framework 1.1”、“从Internet下载”,并将“http://www.myWebSite.com/MyApp/SupportFiles”替换为您的网站,例如“http://www.mysite.com/MyRelease/SupportFiles”,然后单击“OK”按钮。
- 右键单击“install:”节点并选择“Add”->“Msi Component”
- 选择刚创建的节点并使用您的安装程序和MSI包名称自定义属性“description”、“installmessage”和“package”。将#APPPATH\mysetup.msi替换为#TEMPPATH\MyApplicationName\mysetup.msi,这是包的下载目的地。
- 右键单击MSI组件并选择“Add”->“Download Dialog”
- 选择刚创建的节点“Download Dialog”并使用您的应用程序名称自定义属性“dialog_caption”和“dialog_message”。
- 右键单击“Download Dialog”节点并选择“Add”->“Download File”
- 选择“Download Dialog”下刚创建的节点并自定义属性“componentname”、“destinationpath”(例如写入“#TEMPPATH\MyApplicationName\”,必须与“package”属性的路径相同)和“sourceurl”(写入“http://www.mysite.com/MyRelease/mysetup.msi”)。
- 选择菜单“文件”->“保存”,并将此configuration.xml文件复制到“http://www.mysite.com/MyRelease/”下。
创建引导程序
我们创建一个可执行文件,该文件从网站下载并执行主配置文件,用我们的自定义XML和位图更改dotNetInstaller资源。
- 创建一个位图(banner.bmp 110x208像素),带有您的应用程序徽标。
- 执行InstallerEditor.exe文件。
- 选择菜单“文件”->“新建...”并创建一个名为“reference.xml”的新文件。
- 从菜单“工具”->“新项目的语言”中选择您想要的用户界面语言。(目前只有英语和意大利语,但您可以通过手动编辑属性来编写自定义消息。)
- 右键单击“Config File”节点并选择“Add”->“Web Configuration”
- 选择刚创建的节点“reference:”,并自定义属性“referencefile”,例如写入“#TEMPPATH\MyApplicationName\configuration.xml”。
- 选择“reference:”下的“Download Dialog”节点,并自定义属性“dialog_caption”和“dialog_message”。
- 右键单击“Download Dialog”节点并选择“Add”->“Download File”
- 选择“Download Dialog”下刚创建的节点,并自定义属性“componentname”、“destinationpath”(例如写入“#TEMPPATH\MyApplicationName\”,必须与“referencefile”属性的路径相同)和“sourceurl”(写入“http://www.mysite.com/MyRelease/configuration.xml”,必须是您可以下载之前创建的配置文件的URL)。
- 选择菜单“文件”->“保存”。
- 选择菜单“文件”->“创建Exe”;在“Template dotNetInstaller.exe file”中选择您的“dotNetInstaller.exe”路径,在“Banner Bitmap”中选择之前创建的位图。单击“Make”按钮,然后选择新dotNetInstaller的文件名,例如“MyWebSetup.exe”。
- 将“MyWebSetup.exe”复制到“http://www.mysite.com/MyRelease/”下。
现在用户只需下载“MyWebSetup.exe”(310 Kb),此应用程序将自动下载并安装所需的组件,在此示例中为.NET Framework和一个MSI包。
路径变量
这些是可以在所有包含路径的属性(dialog_bitmap
, command
, ...)中使用的变量。#APPPATH
- 此字符串将替换为dotNetInstaller.exe程序的目录。#SYSTEMPATH
- 此字符串将替换为Windows系统目录(使用GetSystemDirectory()
API,通常为c:\WINNT\System32)。#WINDOWSPATH
- 此字符串将替换为Windows目录(使用GetWindowsDirectory()
API,通常为c:\WINNT)。#TEMPPATH
- 此字符串将替换为临时目录(使用GetTempPath()
API,通常为C:\Documents and Settings\[User]\Local Settings\Temp)。
检查组件是否已安装
您可以使用installedcheck
元素来检查组件是否已安装,例如,您可以通过读取此注册表项SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322\Install = 1来检查.NET Framework 1.1是否已安装。
目前有两种类型的安装检查
- “check_registry_value” - 检查特定的注册表值。
- “check_file” - 检查特定文件和特定版本。
您可以查看示例以了解最常见组件(.NET Framework、Internet Explorer、MDAC、JET等)使用的检查。
检查操作系统版本
这是用于仅在特定操作系统版本中安装组件的操作系统表。
操作系统名称 | 枚举 | 数字标识符 |
---|---|---|
无效 | winNotValid | 0 |
Windows 95 | win95 | 5 |
Windows 95 OSR2 | win95osr2 | 10 |
Windows 98 | win98 | 15 |
Windows 98 第二版 | win98se | 20 |
Windows Millennium | winME | 25 |
Windows NT4 | winNT4 | 30 |
Windows NT4 Service Pack 6 | winNT4sp6 | 35 |
Windows NT4 Service Pack 6a | winNT4sp6a | 40 |
Windows 2000 | win2000 | 45 |
Windows 2000 Service Pack 1 | win2000sp1 | 50 |
Windows 2000 Service Pack 2 | win2000sp2 | 55 |
Windows 2000 Service Pack 3 | win2000sp3 | 60 |
Windows 2000 Service Pack 4 | win2000sp4 | 65 |
Windows XP | winXP | 75 |
Windows XP Service Pack 1 | winXPsp1 | 80 |
Windows Server 2003 | winServer2003 | 90 |
下一步.... | winLater | 100 |
一些例子
- 仅在Windows XP(不带Service Pack检查)中安装组件:
os_filter_greater
='74',os_filter_smaller
='90'。 - 仅在Windows 2000或更高版本中安装组件:
os_filter_greater
='44',os_filter_smaller
=''。 - 仅在Windows 98(不在Windows 98 SE中)中安装组件:
os_filter_greater
='14',os_filter_smaller
='16'。 - 始终安装组件:
os_filter_greater
='',os_filter_smaller
=''。
通常最好使用安装检查来查看组件是否已安装,但对于某些组件,需要检查操作系统版本(尤其是Service Pack或Windows更新)。
XML元素帮助
警告:XML解析器不完全兼容标准XML规范;它只支持基本功能。不要包含XML注释,并使用正常的XML语法,如.zip中提供的示例。建议使用编辑器InstallerEditor创建或修改您的配置文件,或者我建议使用普通文本编辑器。如果您想手动在XML中插入“字符,您必须写入"。
配置 | ||
---|---|---|
根元素 | ||
属性 |
|
|
子元素 |
|
配置 (type='install') | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
用于安装组件集合的配置。 | |||||||||||||||||||||||||||||||||
属性 |
|
||||||||||||||||||||||||||||||||
子元素 |
|
配置 (type='reference') | |||||
---|---|---|---|---|---|
用于从特定URL下载配置文件的配置。 | |||||
属性 |
|
||||
子元素 |
|
配置文件 | |||
---|---|---|---|
下载的配置文件的路径。 | |||
属性 |
|
||
子元素 |
|
components | ||
---|---|---|
类型为“component”的元素集合。 | ||
属性 |
|
|
子元素 |
|
组件(另请参见基于“type”属性的特定帮助) | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
要安装的组件。 | |||||||||||||||||||
属性 |
|
||||||||||||||||||
子元素 |
|
组件 (type='cmd') | |||||||
---|---|---|---|---|---|---|---|
可用于执行.exe文件(如安装应用程序)的组件。 | |||||||
属性 |
|
||||||
子元素 |
|
组件 (type='msi') | |||||||||
---|---|---|---|---|---|---|---|---|---|
可用于安装msi包的组件。 | |||||||||
属性 |
|
||||||||
子元素 |
|
组件 (type='openfile') | |||||||
---|---|---|---|---|---|---|---|
可用于在安装过程中打开网页、readme文件或执行任何文件的组件。 | |||||||
属性 |
|
||||||
子元素 |
|
下载对话框 | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
表示要下载的文件列表和下载对话框的配置。 | |||||||||||||
属性 |
|
||||||||||||
子元素 |
|
下载 | ||
---|---|---|
类型为“download”的元素集合。 | ||
属性 |
|
|
子元素 |
|
下载 | |||||||||
---|---|---|---|---|---|---|---|---|---|
表示要下载的单个文件。 | |||||||||
属性 |
|
||||||||
子元素 |
|
installedcheck (type='check_file') | |||||||||
---|---|---|---|---|---|---|---|---|---|
应用程序通过查找指定的注册表信息或文件来检查组件是否已安装。 | |||||||||
属性 |
|
||||||||
子元素 |
|
installedcheck (type='check_registry_value') | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
应用程序通过查找指定的注册表信息或文件来检查组件是否已安装。 | |||||||||||||
属性 |
|
||||||||||||
子元素 |
|
注释
- 如果组件需要重新启动系统,应用程序会自动在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中添加一个键,以便在下次启动时重新加载应用程序。
- 您必须以管理员权限运行此应用程序。
- 我已在Windows 98、98 SE、Millennium、2000、XP上测试过此安装程序。(尚未在Windows NT 4和Terminal Server上测试)。
- 您的安装程序也写入一个小的注册表值,您可以在其中放置一些关于已安装版本的信息,这允许此应用程序使用“installedcheck”元素检查您的安装程序是否已安装。
- .NET Framework 1.1(dotNetFx.exe)的安装程序会自动安装Windows Installer 2.0。
- 要在Windows 98中安装MDAC 2.7,您必须首先安装Year 2000兼容性更新。在我的示例配置文件中,我为此文件添加了一个组件,您可以从Windows Update Catalog网站下载这些更新。
- 在Windows Millennium中,如果我将dotNetInstaller.exe重命名为Setup.exe,我遇到了一些奇怪的问题。如果我启动Setup.exe,我无法再检测到正确的操作系统版本(返回Windows 98版本而不是Windows Millennium)。无论如何,您所要做的就是将可执行文件名称保留为dotNetInstaller.exe或使用与Setup.exe不同的名称。
- 我发现检查JET 4.0是否已安装的唯一方法是在系统目录中搜索版本为4.0.7328.0的Msjet40.dll文件(JET 4.0 Sp7)。
- 您还可以使用此项目同时启动多个MSI或其他安装程序,也可以用于非.NET项目(如Visual Basic、VC++等)。
- 在Windows Millennium中,如果我将dotNetInstaller.exe重命名为Setup.exe,我遇到了一些奇怪的问题。如果我启动Setup.exe,我无法再检测到正确的操作系统版本(返回Windows 98版本而不是Windows Millennium)。无论如何,您所要做的就是将可执行文件名称保留为dotNetInstaller.exe或使用与Setup.exe不同的名称。
- 在我的配置文件中,我还添加了用于安装Service Pack和其他系统组件的组件,但请注意,安装此类组件始终是不安全的操作。
- 要查找已安装的操作系统LCID,我使用此文章中提供的信息:Microsoft 知识库文章 - 181604. HOWTO:确定 Windows 95 或 WinNT 的默认语言 ID
- 要下载组件,我使用
URLDownloadToFile
API。 - 目前我不删除下载的组件,因此我建议将TEMP路径用作目标文件夹。
- 为了更改exe文件的资源,我使用
BeginUpdateResourceW
、UpdateResourceW
和EndUpdateResourceW
API。这些API仅在Windows NT、2000和XP上可用,因此编辑器不能在Windows 98上使用(引导程序也支持Windows 98)。
未来工作总结
- 静默模式和命令行支持。
历史
1.1.0.2(2004年1月2日)
- 增加了从网络下载所需组件的功能。
- 添加了#TEMPPATH路径变量。
- 用于创建和修改XML配置文件的编辑器。
- XML结构进行了许多更改,旧文件不兼容。
- 修复了读取操作系统LCID函数中的一个bug和其他一些小bug。
1.0.8.0(2003年11月5日)
- 添加了#WINDOWSPATH路径常量。
1.0.7.0(2003年9月28日)
- 修复了MDAC和JET组件配置文件中的bug(注册表检查为REG_SZ和JET的语言支持)。
1.0.7.0(2003年9月27日)
- 首次公开发布。
许可证
dotNetInstaller - 用于.NET的C++安装引导程序
版权所有 (c) 2003, Davide Icardi
保留所有权利。
在遵守以下条件的前提下,允许以源代码和二进制形式重新分发和使用,无论是否经过修改:
- 源代码的再分发必须保留上述版权声明、此条件列表和以下免责声明。
- 二进制形式的再分发必须在随分发提供的文档和/或其他材料中复制上述版权声明、此条件列表和以下免责声明。
- 未经事先明确书面许可,不得使用本组织名称或其贡献者的名称来认可或推广源自本软件的产品。
本软件由版权所有者和贡献者“按原样”提供,不作任何明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权的暗示保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、惩戒性或后果性损害(包括但不限于采购替代商品或服务;使用、数据或利润损失;或业务中断)承担责任,无论其成因以及基于何种责任理论,无论是合同、严格责任还是侵权(包括疏忽或其他),即使已被告知此类损害的可能性。