部署 .NET Framework 和 MDAC






4.70/5 (10投票s)
2004年10月15日
5分钟阅读

113902
在单一、流畅的安装过程中,与您的 .NET 应用程序一起安装 .NET Framework 和 MDAC
引言
我以前从未尝试过在 Visual Studio 中创建部署项目。所以,当然,第一次有人让我这么做的时候,我还要同时部署 .NET Framework 和 MDAC!为什么我的生活就不能轻松点呢?
每个人或多或少都使用过 Windows Installer;这是如今几乎所有基于 Windows 的程序都是这样安装的。如果你曾经在“添加/删除程序”的“控制面板”部分添加或删除过程序,你就用过它。如果你双击一个扩展名为“msi”的文件,它就会启动 Windows Installer。
我的挑战是:在一台没有连接到互联网、也没有安装 IIS 的计算机上安装并运行一个网站。我们不使用 IIS,而是使用 Microsoft 的 Cassini Web 服务器。不过,Cassini 是用 C# 编写的,因此需要 .NET Framework。而且,因为我们将在 Cassini 中运行的网站需要访问 Access 数据库,所以我们还需要安装 MDAC(2.6 或更高版本)。目标计算机不太可能安装任何版本的 .NET Framework 或 MDAC。
一体化安装
第一步是打开 Visual Studio 并创建一个应用程序安装部署项目(新建项目 > 设置和部署项目 > 设置项目)。使用文件编辑器,我将网站和 Windows Forms 应用程序(该应用程序在 Cassini 下运行网站)添加到应用程序文件夹(因为它不在 IIS 下运行,所以不需要放在 wwwroot)。我将 Cassini.dll 添加到全局程序集缓存文件夹,并创建了一个指向 Forms 应用程序的快捷方式,将其放在用户的桌面。当我生成解决方案时,我得到了一个 MSI 文件来完成部署的繁重工作。
Windows Installer 是为了方便安装高级应用程序(如我在上一段中所描述的)而创建的,而不是像 .NET Framework 和 MDAC 这样的核心基础架构应用程序。最初,我确实尝试过那样做,添加了一个自定义操作来安装 MDAC。但那根本不起作用。由于我们需要安装的计算机没有连接到我们的网络,我们需要一种简单的方法让非技术人员能够运行所有必需品的安装。幸运的是,Microsoft 提供了两个 C++ 程序,一个用于安装 Framework [#1],另一个用于安装 MDAC [#2],并解释了“精通 C++”的人如何将两者结合起来。而我并不精通。
因此,我非常高兴地发现 Kevin Moore 在 CodeProject 上发布了一个用 C++ 编写的程序 [#3],它将安装运行 .NET 应用程序所需的所有内容,包括 Windows Installer 本身、Framework、MDAC、IE 6,甚至在需要时安装 MSDE。一个简单的 INI 文件提供了一些必要的信息,其中之一是要加载您的 .NET 应用程序的 MSI 文件的名称,以便在其他系统安装完成后进行加载。
工作原理
设置程序首先要做的事情之一是确定已经存在哪些组件,因此不需要安装。
要确定 .NET Framework 是否存在,它会执行以下操作:
- 从 settings.ini 文件中获取 FxInstallerPath 变量,并尝试在那里找到 dotnexfx.exe 文件(如果变量值只是一个点,则表示在当前文件夹中查找)。
- 如果找到,则获取 dotnetfx.exe 文件的文件版本。
- 从 settings.ini 文件中获取 .NetVersion 变量(例如:v1.1)。
- 查找 HKLM\SOFTWARE\Microsoft\,NetFramework\Policy\v1.1 注册表文件夹。
- 查找与 dotnetfx.exe 文件版本匹配的文件版本(例如:4322)的注册表项。
- 从 settings.ini 文件中获取数字 LanguageDirectory 变量(默认值:1033,美式英语)。
- 使用此信息构建一个路径:c:\WINNT\Microsoft.Net\Framework\v1.1.4322\1033\。如果找到该目录,则无需加载 Framework。
要确定计算机上是否存在任何级别的 MDAC,它会在注册表中 HKLM\SOFTWARE\Microsoft\DataAccess 下查找 FullInstallVer 键。如果安装了 MDAC 2.5,它的值将类似于:2.53.6200.1。您可以设置可接受的最低级别(为与 Framework 配合使用,最低必须是 2.6),方法是在 Moore 的设置程序附带的 settings.ini 文件中设置 MDACVersion 变量。如果 FullInstallVer 大于或等于设置文件中的值,则无需安装 MDAC。
同样,为了确保 Internet Explorer 的版本至少是 v5.1,它会检查 HKLM\SOFTWARE\Microsoft\Internet Explorer 文件夹并获取 Version 键的值。
Kevin Moore 程序的原始版本按照此顺序安装系统:IE、MDAC、MSDE、MSI,最后是 .NET Framework。我怀疑 MDAC 在 .NET 之前加载时遇到了问题。因此,我将顺序更改为:MSI、.NET Framework、MDAC、IE,并且我根本不允许 MSDE 加载(因为我们的特定项目不需要它)。这似乎运行良好。而且,我可能错了,MDAC 在 .NET 之前加载可能真的是导致错误的原因。无论如何,新的顺序在我的脑海中感觉更合理,而且也确实有效。
故障排除
说到错误,如果您是那些第一次就把所有事情都做不好的人之一(能举个手吗?),Windows Installer 会将错误消息放入应用程序事件日志。有关更多详细信息(非常多!!),请使用以下注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Installer]
"Logging"="voicewarmup"
"Debug"=dword:00000007
这将在 C:\Documents and Settings\[username]\Local Settings\Temp\ 中创建一个详细日志文件,格式为 MSIxxxxx.log,其中“xxxxx”是看似随机的字母和数字组合。
Microsoft 的 Windows Installer FAQ 页面 [#4] 有一个故障排除部分,其中包含有关日志等的更多信息。
结论
在 Moore 的程序安装了所有缺失的基础架构系统后,它会执行我的 MSI 文件(该文件的名称必须在 settings.ini 文件中的 MSI 变量中设置),以安装我想要的 .NET 应用程序。
我的第一次部署很棘手。Kevin Moore 的引导程序版本让它变得容易多了。而且,我学到了很多关于什么有效、什么无效的知识。愿您自己的所有部署项目都轻松而顺利。
参考文献
[#1] .NET Framework 引导程序示例 -- www.microsoft.com/downloads/details.aspx?familyid=66350891-d15b-446b-bd69-f7f849224a00&displaylang=en
[#2] MDAC 引导程序示例 -- support.microsoft.com/default.aspx?scid=kb;EN-US;q257604
[#3] Kevin Moore 的优秀组合引导程序 -- www.codeproject.com/managedcpp/dotnetsetup.asp
[#4] Windows Installer FAQ -- www.microsoft.com/windows2000/community/centers/management/msi_faq.mspx