VS 制作安装包包含卸载程序Net 程序打包安装与卸载制作——问题描述(一)项目已将近完工,怎样将你的程序打包,包装成一个完美的安装程序呢? 今天我将我个人使用.Net 制作打包程序的经验分享给大家,不足之处还希望大家能够给予指正。
面对对.Net 平台开发出来的程序,它的运行对系统环境要求有点高,需要.Net Framework 的支持,所以首先面对的问题是怎样将.Net Framework1.1 或2.0 安装在一台没有以前没有装过的机子上。
以下是我在打包过程中需要解决的问题:一.怎样将.NET 程序部署到没有安装_NET Framwork 的机器上? 二.怎样在打包程序中自动安装SQL Server 数据库?三.怎样将MSDE Sp3 打包进.Net 安装项目中?四.怎样将MDAC 打包进.Net 安装项目中?五.怎样制作.Net 卸载程序?六.怎样创建各种快捷方式?解决了以上的问题后,基本上能够满足你的安装项目需要了吧?好了废话少说,现在我们马上来动手制作。
.Net 程序打包安装与卸载制作——怎样将.Net 程序部署到没有安装.Net Framwork 的机器上?(二)怎样将.Net 程序部署到没有安装.Net Framwork 的机器上?部署在.Net 平台下开发的应用程序,需要安装安装对应版本的.Net Framwork, 而Vsual Studio 2003 并没有提供一起打包的功能,所以这一点估计大多开发者都感觉不是太好,那如何将.Net Framework 安装部署到客户机上呢?其实微软提供了我们一个安装引导插件( Microsoft Visual Studio .NET 2003 引导程序插件) ,可以帮助我们在打包时,它会自动将.Net Framework 打包放入你的安装程序中,完成了我们想要的功能。
建立安装程序项目,将自己需要打包的程序加入进去,编译过后,你会注意到在生成的安装目录下,你将会注意到多了几个文件( dotnetfx.exe 、Config.ini 、langpack.exe 、Settings.ini ),详细介绍如下:Config.ini —安装配置文件dotnetfx.exe —.Net Framework 组件langpack.exe —语言包Settings —设置文件ItemSoft.msi —.msi 安装文件Setup.exe —主安装程序Config 的文件内容如下:[config.ini]IDS_NOT_SINGLE_INSTANCE= 已有另一版本的安装程序正在运行。
该应用程序一次只能运行一个版本。
IDS_DIALOG_CAPTION=%s 安装IDS_SINGLE_INSTANCE_FAIL=CreateMutex 无法对单个的实例检查分配句柄。
IDS_SETUP_FAILURE=%s 安装失败。
如果问题继续存在,请与产品支持人员联系。
IDS_DEFAULT_PRODUCTNAME= 应用程序IDS_SETTINGS_INIT_FAILURE= 安装设置文件’%s 在解析时出错,或者无法定位该文件。
IDS_CREATE_PROCESS_FAILURE= 下列命令行的CreateProcess 操作失败: %s 。
IDS_INSUFFICIENT_PRIVILEGES= 运行%s 安装程序要求具有本地系统管理员的权限。
安装程序现在退出。
IDS_DIALOG_TEXT= 单击”确定”开始安装%1 。
单击”取消” 退出安装。
IDS_ERROR_CAPTION=%s 安装错误IDS_VERSION_DETECT_FAILED=%1 的版本检测失败。
请确保安装程序存在于指定位置。
%n%n 返回消息: %2IDS_MSI_NOT_FOUND= 无法定位产品安装程序’%s。
安装程序现在退出。
IDS_REBOOT_QUERY= 安装完成。
现在重启吗?IDS_SETUP_SUCCEEDED= 安装成功。
IDS_INVALID_LANGID_CAPTION= 无效的语言包代码IDS_FX_NOT_FOUND= 无法定位.NET framework exe 文件’%s。
安装程序现在退出。
IDS_INVALID_LANGID_MESSAGE= 语言包代码%s 无效。
跳过…IDS_LANGPACK_NOT_FOUND= 无法定位语言包%s 。
安装程序现在退出。
IDS_MDAC_NOT_FOUND= 无法定位MDAC exe 文件’%s。
安装程序现在退出。
IDS_FILE_NOT_FOUND= 无法定位’%1安装程序现在退出。
Settings.ini 文件内容如下:[Bootstrap]MsiPath=ItemSoft.msi —.msi 安装文件ProductName=中国亿万电器成套报价系统-安装产品名称MdacVersion=2.71BootstrapFx=trueFxInstallerPath=LanguageID=2052BootstrapLangPack=trueLangPackInstallerPath=BootstrapMdac=trueMdacInstallerPath=这种方法能够很简单的将.Net Framwork 与你的应用程序一起打包到安装程序中,并且自动检测客机上的是否安装过.Net Framework, 然后运行安装。
相信大家一定能够喜欢这个插件。
.Net 程序打包安装与卸载制作——怎样在打包程序中自动安装SQL Server 数据库(三)?怎样在打包程序中自动安装SQL Server 数据库?1、创建安装项目“ Setup1 ”安装项目在“文件”菜单上指向“添加项目”,然后选择“新建项目”。
在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。
在“名称” 框中键入“ setup1 ”。
单击“确定”关闭对话框。
项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。
在“属性”窗口中,选择ProductName 属性,并键入”亿万电器成套报价系统”。
2、在安装项目中创建安装程序类( install.cs )。
添加创建数据库( InstallDatabase.txt )、删除数据库 ( DropDatabase.txt )、初始化数据基本数据(InitializeData.txt) 脚本文件,将属性“生成操作”设为“嵌入的资源”。
代码如下:using System;using System.Collections;using ponentModel;using System.Configuration.Install;using System.Data;using System.Data.SqlClient;using System.IO;using System.Reflection;using System.Text.RegularExpressions;using System.Windows.Forms;using System.Text;using Microsoft.Win32;namespace install{////// Installer 的摘要说明。
///[RunInstaller(true)]public class Installer : System.Configuration.Install.Installer { ////// 必需的设计器变量。
///string conStr= ” packet size=4096;integrated security=SSPI; ”+“data source=/ ” (local)/ ” ;persist security info=False; ”+“ initial catalog=master;connect timeout=300 ;RijndaelCryptography rijndael = newRijndaelCryptography();private ponentModel.Container components =null;public Installer(){// 该调用是设计器所必需的。
InitializeComponent();// TODO: 在InitializeComponent 调用后添加任何初始化}////// 清理所有正在使用的资源。
///protected override void Dispose( bool disposing ){if( disposing ){if(components != null){components.Dispose();}} base.Dispose( disposing );}#region 组件设计器生成的代码////// 设计器支持所需的方法- 不要使用代码编辑器修改/// 此方法的内容。
///private void InitializeComponent(){components = new ponentModel.Container(); }#endregion#region 重载自定义安装方法protected override void OnBeforeInstall(IDictionary savedState){ base.OnBeforeInstall (savedState);}public override void Install(IDictionary stateSaver) {base.Install (stateSaver); string databaseServer =Context.Parameters[ ” server ” ].ToString();string userName = Context.Parameters[ ” user ” ].ToString();string userPass= Context.Parameters[ ”pwd” ].ToString();string targetdir =this.Context.Param eters[ ” targetdir ” ].ToString();conStr =GetLogin(databaseServer,userName,userPass, ” master ” );SqlConnection sqlCon = new SqlConnection();try{sqlCon.ConnectionString = conStr;sqlCon.Open();rijndael.GenKey();rijndael.Encrypt(conStr);stateSaver.Add( ”key ” ,rijndael.Key);stateSaver.Add( ”IV ” ,rijndael.IV);stateSaver.Add( ” conStr ” ,rijndael.Encrypted);ExecuteSql(sqlCon, ” InstallDatabase.txt ”);ExecuteSql(sqlCon, ” InitializeData.txt ”);if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close();}catch(SqlException){MessageBox.Show( ”安装失败!/n 数据库配置有误,请正确配置信息! ”, ”错误” ,MessageBoxButtons.OK,MessageBoxIcon.Error);if(sqlCon.State!=ConnectionState.Closed) sqlCon.Close();this.Rollback(stateSaver);}}protected override void OnAfterInstall(IDictionarysavedState){base.OnAfterInstall(savedState);}public override void Rollback(IDictionary savedState) {base.Rollback (savedState);}public override void Uninstall(IDictionary savedState){base.Uninstall (savedState);if(savedState.Contains( ” conStr ”)){string targetdir =this.Context.Parameters[ ” targetdir ” ].ToString();RijndaelCryptography rijndael = new RijndaelCryptography();rijndael.Key = (byte[])savedState[ ”key ”]; rijndael.IV = (byte[])savedState[”IV ”];conStr ” ]); conStr = rijndael.Decrypt((byte[])savedState[ ”SqlConnection sqlCon = new SqlConnection(conStr); ExecuteDrop(sqlCon); }}#endregion#region 数据操作方法//从资源文件获取中数据执行脚本private static string GetScript(string name){Assembly asm = Assembly.GetExecutingAssembly();Stream str = asm.GetManifestResourceStream(asm.GetName().Name+ “ . ” + name);StreamReader reader = newStreamReader(str,System.Text.Encoding.Default);System.Text.StringBuilder output = new System.Text.StringBuilder();t■I ■“ ”string line = “”;while((line = reader.ReadLine())!=null){output.App end(line + “ /n ”);}return output.ToString();}//获取数据库登录连接字符串private static string GetLogin(string databaseServer,string userName,string userPass,string database) {return “ server= ” + databaseServer +“ ;database= ” +database+ ” ;User ID= ” + userName +“ ;Password= ” + userPass + ” ;connect timeout=300;}//执行数据库脚本方法private static void ExecuteSql(SqlConnection sqlCon,string sqlfile){string[] SqlLine;Regex regex = newRegex( ” A GO? ,RegexOptions」gnoreCase |RegexOptions.Multiline);string txtSQL = GetScript(sqlfile);SqlLine = regex.Split(txtSQL);if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close(); sqlCon.Open(); SqlCommand cmd = sqlCon.CreateCommand(); cmd.Connection = sqlCon; foreach(string line in SqlLine){if(line.Length>0){mandText = line;mandType = CommandType.Text;try{ cmd.ExecuteNonQuery();}catch(SqlException ex){//rollbackstring ss = ex.Message;ExecuteDrop(sqlCon);break;}}}}//删除数据库private static void ExecuteDrop(SqlConnection sqlCon){ if(sqlCon.State!=ConnectionState.Closed)sqlCon.Close(); sqlCon.Open(); SqlCommand cmd = sqlCon.CreateCommand(); cmd.Connection = sqlCon; mandText = GetScript( ” DropDatabase.txt ” );mandType = CommandType.Text;cmd.ExecuteNonQuery();sqlCon.Close();}#endregion}单击“生成”菜单下“生成解决方案”,生成nstall.dll安装类文件。