Net程序打包安装与卸载制作

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返回消息: %2
IDS_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.71
BootstrapFx=true
FxInstallerPath=
LanguageID=2052
BootstrapLangPack=true
LangPackInstallerPath=
BootstrapMdac=true
MdacInstallerPath=

这种方法能够很简单的将.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 System.ComponentModel;

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 = new RijndaelCryptography();

private System.ComponentModel.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 System.ComponentModel.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.Parameters[”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(IDictionary savedState)

{

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 = rijndael.Decrypt((byte[])savedState[”conStr”]);

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 = new StreamReader(str,System.Text.Encoding.Default);

System.Text.StringBuilder output = new System.Text.StringBuilder();

string line = “”;

while((line = reader.ReadLine())!=null)

{

output.Append(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 = new Regex(”^GO”,RegexOptions.IgnoreCase | 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)

{

cmd.CommandText = line;

cmd.CommandType = CommandType.Text;

try

{

cmd.ExecuteNonQuery();

}

catch(SqlException ex)

{

//rollback

string 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;

cmd.CommandText = GetScript(”DropDatabase.txt”);

cmd.CommandType = CommandType.Text;

cmd.ExecuteNonQuery();

sqlCon.Close();

}

#endregion

}

单击“生成”菜单下“生成解决方案”,生成install.dll安装类文件。

3、将“主程序”项目的输出添加到部署项目中

在“文件系统编辑器”中,选择“应用程序文件夹”,单击右键指向“添加”,添加“项目输出”。

在“添加项目输出组”对话框中,选择“项目”下拉表框中选择你的主安装程序类,如上面的“install”。

从列表框中选择“主输出”组,然后单击“确定”关闭。

4、创建自定义安装对话框

在解决方案资源管理器中选择安装项目“Setup1”项目,在“视图”菜单上指向“编辑器”,然后选择“用户界面”。

在用户界面编辑器具中,选择“安装”下的“启动”节点。在“操作”菜单上,选择“添加对话框”。

在“添加对话框”中选择“文本框(A)”对话框,然后单击“确定”关闭对话框。

在“操作”菜单上,选择“上移”,重复此步骤,移到“安装文件夹”上。

在“文本框(A)”上单击“属性窗口”,设置如下图所示:

5、建自定义操作

在解决方案资源管理器中选择安装项目“Setup1”项目,在“视图”菜单上指向“编辑器”,然后选择“自定义操作”。

在“自定义操作编辑器”中选择“安装”节点。单击右键“添加自定义操作”,在选择项目中的项中选择“应用程序文件夹”,选择“主输出来自install(活动)”。

在“属性窗口”中选择“CustomActionData”属性并键入“/server=[EDITA1] /user=[EDITA2] /pwd=[EDITA3] /targetdir=”[TARGETDIR]/””。

附:/targetdir=”[TARGETDIR]/”是安装后的目标路径,为了在install类中获得安装后的路径,我们设置此参数。

单击“生成”菜单下的“生成解决方案”,编译安装项目。

.Net程序打包安装与卸载制作——怎样将MSDE Sp3打包进.Net安装项目中?(四)
怎样将MSDE Sp3打包进.Net安装项目中?

1、创建安装项目“Setup1”安装项目

在“文件”菜单上指向“添加项目”,然后选择“新建项目”。

在“添加新项目”对话框中,选择“项目类型”窗格中的“安装和部署项目”,然后选择“模板”窗格中的“安装项目”。在“名称”框中键入 “setup1”。

单击“确定”关闭对话框。

项目被添加到解决方案资源管理器中,并且文件系统编辑器打开。

在“属性”窗口中,选择 ProductName 属性,并键入”亿万电器成套报价系统”。

2、下载MSDE Sp3 安装程序与MSI安装文件修改器(Orca)工具。

3、选择“文件系统编辑器”,在“视图“菜单上指向“添加”,然后选择“合并模块…”(Merge Moudle),在添加模块中,找到MSDE sp3安装文件所在目录,将MSM和MSM/1033下的所有文件,添加进来。

在安装项目Setup1的属性(Properties)中的“Search Path”,添加MSM和MSM/1033目录。

单击“生成菜单下的“生成解决方案”,编译Setup1安装项目工程。

用Orca MSI安装文件修改器打开生成的安装包(Setup1.msi)文件,在左列的表栏中

选择“InstallExecuteSequence”表,修改下面的属性值:

GetSqlStates.XXXXXX 103改成421

RemoveExistingProducts值改成1800

InstallInitialize值改成1799

在InstallUISequence

选择“InstallUISequence”表,修改下面的值:

GetSqlStates.XXXXXX 103改成421

选择“Property”表,添加以下三个属性:

SqlInstanceName:MSDEDH实例服务名

SqlSecurityMode:SQL(不加这行确实也行,就是没办法用SQL模式登录)

SqlSaPwd:sa的密码

连接测试:

单击修改过的Setup1.msi安装文件,确认是否能够安装;

osql -S 机器名/MSDEDH实例服务名 -U sa -P sa密码

能够进去——>OK!打包成功!

.Net程序打包安装与卸载制作 ——怎样将MDAC打包进.Net安装项目中?(五)

在“解决方案资源管理器”选择Setup1安装项目工程,选择“视图”菜单,指向“启动条件”,打开“启动条件”管理器。

在”启动条件”管理器中,右键点击”目标计算机上的要求”,在弹出的的菜单中选择”添加注册表启动条件”。你会发现在”搜索目标计算机”中多了一项”搜索 RegistryEntry1″,在”启动条件”中多了一项”Condition1″。

选择”搜索 RegistryEntry1″,在”属性”对话框中填写如下内容:

Property:MDACSEARCH

RegKey:Software/Microsoft/DataAccess

Root:vsdrrHKLM

Value:FullInstallVer

选择”Condition1″ ,在”属性”对话框中填写如下内容:

Condition:MDACSEARCH>=”2.6″

进行这一步是因为在安装.NET框架的时候需要MDAC。

.Net程序打包安装与卸载制作 ——怎样制作.Net卸载程序?(六)

方法一:

在打包项目中添加文件msiexec.exe(一般在c:/windows/system32(系统目录中)找到)。

在文件系统视图中选择应用程序文件,在msiexec.exe上单击右键选择“创建快捷方式”,重命名快捷方式为“uninst”.

更改此快捷方式Argmuments为“/x {产品ID}”,产品ID的值为打包项目的ProductCode属性值。

方法二:

先生成安装包,记下ProudctCode(选择解决方案资源管理根目录如Setup1,再查看属性标签,不是右键属性),下面用到

用Vs.Net 建立一个新的控制台程序uninst.exe文件。

代码如下:

using System;

namespace uninst

{

///

/// Class1 的摘要说明。

///

class UnInstall

{

///

/// 应用程序的主入口点。

///

[STAThread]

static void Main(string[] args)

{

string sysroot = System.Environment.SystemDirectory;

System.Diagnostics.Process.Start(sysroot + “//msiexec.exe”, “/x {850FED90-20D0-4EBA-BEDB-3D9DBA25F6EC} /qr”);

}

}

}

编译过后,将生成的uninst.exe文件添加到安装包中,重新生成安装项目。

.Net程序打包安装与卸载制作 ——怎样创建网页快捷方式(“开始与程序”菜单中)?(七)
如果你想在你的安装程序制作,在开始菜单中添加网页快捷方式,如果按照一般添加文件的方式添加时,你会发现添加不进去,怎么办呢?方法很简单,解决方法如下:

将要添加的网页快捷方式选中,按住鼠标不放,将其拖入你的.net安装程序中的用户的“程序”菜单或用户的“开始”菜单即可,这样你的网页快捷方式就可以像创建其它文件一样的被创建在windows的开始菜单与程序菜单中了!呵~~

 转自:http://i007.yo2.cn/articles/net%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值