再转一篇关于。NET部署安装的文章:
前面从网上找了一篇文章,说明如何生成安装程序并且自动的生成数据库.不过有些知识点还是有遗漏的,所以又在msdn上找了一篇,有了这两篇相信生成安装部署程序就没有问题了.
先给出msdn上的链接:http://www.microsoft.com/china/MSDN/library/archives/library/dnvsent/html/vsent_etemplatedeployment.asp
全文如下:
Infusion Development Corporation (http://www.infusiondev.com/)
2003 年 10 月
适用于:
Microsoft® Visual Studio® .NET 2003
摘要:学习如何使用 Visual Studio .NET 2003 和 Active Directory 部署企业模板。(本文包含一些指向英文站点的链接。)
介绍
企业模板文件
部署方法
使用企业模板,建筑师和管理员可以改进和增强 Microsoft® Visual Studio® .NET 2003 中的项目结构及设计模式。企业模板规定了用户使用该模板创建项目时看到的项目骨架。有关在 Visual Studio .NET 中创建和设置企业模板的深入探讨,请参阅 Enterprise Templates Booklet(英文)。本文说明了企业模板周期中的最后一步:部署。
与其他软件组件一样,企业模板必须部署到要计算机上才能使用。对于模板,此过程主要是将相应的文件复制到 Visual Studio .NET 的子目录下。本文着重介绍可用来简化此过程的方法。突出介绍了如何使用 Active Directory 在可能拥有数百台计算机的企业环境中部署模板。
企业模板由很多文件组成,这些文件用于指定模板的结构、约束和内容。如表 1 所示,这些文件必须复制到 Visual Studio .NET 主目录(我们将其表示为 %VSNETRoot%,通常位于 C:/Program Files/Microsoft Visual Studio .NET 2003)中的不同子目录下。
表 1:企业模板文件的位置
文件(或扩展名) | 在 %VSNETRoot% 中的位置 | 用途 |
YourCustomHelpFile.xml | Common7/IDE/HTML/XMLLinks/1033 | Visual Studio .NET 参考此目录下的文件,以确定如何格式化动态帮助窗口。您可以在此目录下放置自定义的 XML 文件,以便为模板提供自定义帮助。(请注意,1033 是英语的语言代码,这与 Visual Studio .NET 的其他语言版本不同。) |
.csproj、.vbproj 和 .vcproj(语言项目文件) | EnterpriseFrameworks/Projects/SomeDir | Visual Studio .NET 语言项目文件。项目文件指向一个真实的静态项目结构(由 Visual Studio .NET 为模板实例逐字重新创建),或者指向一个空的项目文件(JScript 向导代码将为其动态添加内容)。 |
.html 或 .hxs | 用户定义的位置 | 模板的自定义帮助内容。这些内容可作为标准的 HTML (.html) 打包,或以 Microsoft 编译帮助格式 (.hxs) 打包。自定义帮助文件可位于任何目录下。 |
.tdl | EnterpriseFrameworks/Policy | 使用模板描述语言编写的模板策略文件,允许用户在创建模板实例时自定义、控制和限制 Visual Studio .NET 环境。 |
.etp | EnterpriseFrameworks/Projects | Visual Studio .NET 用于创建模板实例的主模板文件。 |
.js | EnterpriseFrameworks/EFWizards | Microsoft JScript® 文件与模板子项目向导一起使用。子项目向导允许您编写 JScript 代码,在 Visual Studio .NET 中创建模板的项目实例时将动态执行这些代码。实际上,子项目向导允许您在模板创建过程中插入自定义的编程操作。企业模板具有的灵活性大多归功于此功能。 |
.vsdir | EnterpriseFrameworks/ProxyProjects | Visual Studio .NET 参考 ProxyProjects 目录下的 .vsdir 文件来填写“添加新项目”和“新建项目”对话框中显示的项目选项。要向 Visual Studio .NET 提供自定义模板,必须创建一个自定义 .vsdir 文件并将其放在此目录下。 |
.vsz | EnterpriseFrameworks/SomeDir | .vsz 文件与子项目向导一起使用,其作用相当于指向执行编程操作的实际向导的“指针”。 |
从本质上讲,部署企业模板就是将表 1 中列出的文件复制到各自相应的目录下。执行此操作的方法有很多种。本文介绍三种方法:批处理文件、Microsoft Installation (.MSI) 文件和通过 Active Directory 进行部署。无论采用哪种方法,部署过程都要遵循某些一般原则:
部署企业模板的方法之一是创建一个通过命令提示符执行的批处理文件(就是 Microsoft Windows® 时代之前的 DOS 系统下使用的那种批处理文件)。因为批处理文件实际上是一系列由 Windows 动态执行的编程操作,因此可以通过多种方法编写部署企业模板所需的批处理文件。列表 1 给出了一个例子。该批处理文件的第一个参数必须是 %VSNETRoot% 目录。
列表 1:AddTemplate.cmd:用来复制企业模板的批处理文件
@echo off:: 确保已将 Visual Studio .NET 主目录作为参数传递:if %1 == "" goto Usage:: 映射包含企业模板文件的网络文件夹:net use z: //SomeComputer/SomeFolder:: 确保所有 ET 子目录都存在:if not exist %1 goto NoNewTemplatesDirectoryif not exist %1/Policy goto NoNewPolicyDirectoryif not exist %1/EFWizards/MyWizard goto NoNewEFWizardDirectoryif not exist %1/"CSharp Building Blocks" goto NoNewBuildingBlocksDirectoryif not exist %1/Projects goto NoNewProjectsDirectoryif not exist %1/ProxyProjects goto NoNewProxyProjectsDirectory:: 创建用于存储新模板的目录:mkdir %1/Projects/MyTemplatemkdir %1/ProxyProjects/MyTemplateFolder:: 复制模板文件:xcopy z:/Policy/MyPolicy.TDL %1/Policy/ /sxcopy z:/EFWizards/MyWizard/* %1/EFWizards/MyWizard/ /sxcopy z:/"CSharp Building Blocks"/* %1/"CSharp Building Blocks"/ /sxcopy z:/Projects/MyTemplate/* %1/Projects/MyTemplate/ /sxcopy z:/ProxyProjects/MyTemplateFolder/* %1/ProxyProjects/MyTemplateFolder/ /sgoto Exit:: 显示批处理文件使用规则::用法echo Usage: AddTemplates vsefdir newtemplatesdirecho Parameters:echo vsefdir - The EnterpriseFrameworks directory of the current Visual Studio installecho newtemplatesdir - 包含 Visual Studio .NET 的目录 files.echo 这些文件应当存储在名为“Policy”、“Projects”和“ProxyProjects”的子目录echo 中的新模板目录下 goto Exit:NoNewTemplatesDirectoryecho 指定的 Visual Studio .NET 目录 %1 不存在。goto Exit:NoNewPolicyDirectoryecho 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 goto Exit:NoNewEFWizardDirectoryecho 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 goto Exit:NoNewBuildingBlocksDirectoryecho 指定的 Visual Studio .NET 目录 %1 中不存在“Policy”子目录。 goto Exit:NoNewProjectsDirectoryecho 指定的 Visual Studio .NET 目录 %1 中不存在“Projects”子目录。goto Exit:NoNewProxyProjectsDirectoryecho 指定的 Visual Studio .NET 目录 %1 中不存在“ProxyProjects”子目录。goto Exit:: 清理操作 - 从网络驱动器断开连接:退出net use z: /delete
列表 1 中的批处理文件只是所需的样板操作的一个示例,并未包括企业部署方案所需的强大的错误处理机制。此外,这里介绍的批处理文件需要用户指定 Visual Studio .NET 主目录的位置。理想情况下,完善的批处理文件应能够从注册表自动获取位置信息。批处理文件过程也存在一些普遍的缺点:
Microsoft Installation (.MSI) 文件与 Microsoft Windows 安装程序配合工作。Microsoft Windows 安装程序最初打包在 Microsoft Windows 2000 和 Microsoft Windows Millennium 操作系统中(也可以作为 Microsoft Windows 95、Windows 98 以及 Microsoft Windows NT® 4.x 的再分发程序)。从 Windows 资源管理器或命令提示符下运行 .MSI 文件时,Windows 安装程序将执行内置的安装步骤。通常,这些步骤包含从用户那里收集安装参数(例如程序选项和/或目录位置),以及将程序文件复制到相应的目录。除了安装功能外,Windows 安装程序还可以执行卸载操作或从安装过程发生的错误中恢复。
Visual Studio .NET 的 Enterprise Developer 和 Enterprise Architect 版本中包含生成 .MSI 文件的功能。这是通过该环境提供的“设置和部署项目”类型完成的。本节将介绍如何使用 Visual Studio .NET 创建部署企业模板所需的 .MSI 文件。
在说明如何创建 .MSI 文件以部署企业模板之前,首先要介绍在 Visual Studio .NET 中创建安装项目的一般步骤。如图 1 所示,Visual Studio .NET 包含一个用于创建 .MSI 文件的“安装项目”模板。
图1:Visual Studio .NET 中的安装项目
使用此模板创建项目时,Visual Studio .NET 环境将显示为另一种独特的外观,如图 2 所示。
图 2:安装项目的 Visual Studio .NET IDE
图 2 的实现条件很简单:只需将组成应用程序的文件拖到 Application Folder 中(同时将图标快捷方式拖到用户桌面和用户程序菜单文件夹中)。当您在 Visual Studio .NET 中绑定项目时,该环境将生成一个包含拖动到 Application Folder 中的所有文件的 .MSI 文件,而不是生成 .EXE 文件或 .DLL 文件。当在其他计算机上执行 .MSI 文件时,Windows 安装程序将提示用户指定目标目录,然后将所有项目文件解压缩并复制到该目录下。
企业模板的安装与一般程序安装之间的不同之处在于事先已经知道目标目录(不用提示用户指定目录位置)。此外,必须在安装过程中从注册表中提取模板的目录位置(Visual Studio .NET 程序目录)。此方法比较复杂,需要在 Visual Studio .NET 中创建两个项目:
这两个程序将协同工作,如下所述:
下面介绍了创建以上两个项目的详细过程:
列表 2:ActionModule.vb:用于复制企业模板文件的 Visual Basic .NET 代码
Imports System.IOImports System.IO.PathImports System.IO.DirectoryImports Microsoft.Win32Module ActionModule Public Sub Main() Dim destRoot As String Dim srcRoot As String Dim regLocal As RegistryKey = Registry.LocalMachine destRoot = regLocal.OpenSubKey("SOFTWARE").OpenSubKey ("Microsoft").OpenSubKey("VisualStudio").OpenSubKey ("7.1").GetValue("InstallDir") destRoot = destRoot.Remove(destRoot.Length - 12, 12) & "EnterpriseFrameworks" Dim regUser As RegistryKey = Registry.CurrentUser srcRoot = regUser.OpenSubKey("SOFTWARE").OpenSubKey ("Microsoft").OpenSubKey("Windows").OpenSubKey ("CurrentVersion").OpenSubKey("Explorer").OpenSubKey ("User Shell Folders").GetValue("Personal") srcRoot &= "/ET/" MoveFolder(srcRoot, destRoot) End Sub Public Sub CopyFile(ByVal fileIn As String, ByVal fileOut As String) Dim fileReader As StreamReader Dim fileWriter As StreamWriter Dim str As String fileReader = File.OpenText(fileIn) fileWriter = File.CreateText(fileOut) While fileReader.Peek <> -1 fileWriter.WriteLine(fileReader.ReadLine()) End While fileReader.Close() fileWriter.Close() End Sub Private Sub MoveFolder(ByVal srcDirIn As String, ByVal destDirIn As String) Dim srcDir As String Dim srcFile As String Dim srcFileInfo As FileInfo Dim destFileInfo As FileInfo Dim destDirInfo As DirectoryInfo Dim srcDirInfo As DirectoryInfo ' 如果提供的路径中不存在末尾分隔符,则添加末尾分隔符。 If Not srcDirIn.EndsWith(DirectorySeparatorChar.ToString()) Then srcDirIn &= DirectorySeparatorChar End If If Not destDirIn.EndsWith(DirectorySeparatorChar.ToString()) Then destDirIn &= DirectorySeparatorChar End If ' 如果目标目录不存在,则予以创建。 destDirInfo = New DirectoryInfo(destDirIn) If destDirInfo.Exists = False Then destDirInfo.Create() destDirInfo = Nothing ' 从当前父目录中获取目录列表。 For Each srcDir In GetDirectories(srcDirIn) srcDirInfo = New DirectoryInfo(srcDir) destDirInfo = New DirectoryInfo(destDirIn & srcDirInfo.Name) ' 如果该目录不存在,则创建该目录。 If destDirInfo.Exists = False Then destDirInfo.Create() ' 由于我们处于递归模式下,因此还要复制子目录 MoveFolder(srcDirInfo.FullName, destDirInfo.FullName) srcDirInfo = Nothing destDirInfo = Nothing Next ' 从当前父目录中获取文件。 For Each srcFile In GetFiles(srcDirIn) srcFileInfo = New FileInfo(srcFile) destFileInfo = New FileInfo(Replace(srcFile, srcDirIn, destDirIn)) ' 如果文件不存在,则进行复制。 If destFileInfo.Exists = False Then srcFileInfo.CopyTo(destFileInfo.FullName) End If srcFileInfo = Nothing destFileInfo = Nothing Next End SubEnd Module
然后将部署项目添加到 Visual Studio .NET 解决方案中:
图 3:向 Visual Studio .NET 中添加特殊文件夹
接下来,在模板文件被解压缩到 User's Personal Data Folder 中之后,必须指示安装项目运行 Visual Basic .NET 程序。
接下来自定义项目的用户界面,使系统不再提示用户指定目标目录:
"The Enterprise Template is being copied and configured. Please wait."
"企业模板已成功移动到您的计算机上。该模板将显示在 Visual Studio .NET 的 New Project(新建项目)对话框中。"
最后,创建用于部署模板的 .MSI 文件:
由此可见,由于 Visual Basic .NET 应用程序和安装项目之间的相互影响,创建部署企业模板所需的 .MSI 文件可能有些麻烦(请注意,也可使用其他方法,如 C# 控制台应用程序)。但是,由于为用户提供的安装过程十分简单(只包含一个 .MSI 文件),因此即使麻烦也是值得的。此外,由于 .MSI 文件是由 Windows 安装程序执行的,安装例程还自动包括卸载工具和错误恢复功能。最后介绍 .MSI 文件如何与下一个部署方案 Active Directory 一起工作。
从 Windows 2000 开始引入的 Active Directory 使组织能够集中管理和共享网络资源信息。Active Directory 的功能之一是可以创建一个组策略,供管理员自定义最终用户的桌面环境。组策略的部分功能是提供了软件安装服务,使管理员可以在用户的计算机上安装软件。要利用软件安装服务,必须为活动域的组策略添加一个 .MSI 文件。MSI 文件将在用户下次登录时进行部署。
下面介绍了通过 Active Directory 利用软件安装服务的详细步骤:
注意:对于不熟悉 Active Directory 的用户来说,组织单元是目录树的一个分支,代表组织中的一个逻辑分区。组织单元(及其中的目录对象,如用户、计算机、打印机和文件共享)继承了一定的安全属性(访问控制项或 ACE)。它们还可能继承组策略设置(除非组织单位已配置为拒绝策略继承),也可能已指定了自己的组策略对象 (GPO)。
当面向大量计算机或开发人员时,适合使用 Active Directory 进行部署。它最大程度地简化了用户操作,用户只需注销或重新启动计算机。但是,此过程需要网络管理员的配合,并会在 EventLog 中显示错误消息。