安装包实现过程
完成功能:
1. 能够将开发的程序,Oracle客户端,.net Framwork,三方控件连续安装到目标机器上。
2. Oracle客户端安装过程中可以自动的修改安装配置,包括注册表,环境变量的修改。其中环境变量实现的添加而非覆盖。
3. .net Framwok 实现的是自动安装,即能够自己查找在目标机上是否已经安装了此产品。有则跳过,无则进行安装。
4. 三方控件实现了最优安装。减少了安装包的大小,缩短了安装时间。
实现步骤:
1 建立项目
打开VS2005,文件——新建——项目,在“新建项目窗口”选择“其他项目类型”下的“安装和部署”,然后在右侧的“模板”中选择“安装项目”。
2 实现功能
2.1 oracle免安装客户端的安装
2.1.1文件复制
在“目标计算机的文件系统”添加文件夹,添加的顺序和Oracle客户端一样,名称也一样。如下图
然后根据Oracle客户端的每个文件夹的内容,在我们的项目文件夹中也进行添加,添加方法为,右击文件夹,选择“添加”,选择“文件”,然后选择需要添加的文件,进行添加,添加后的文件会出现在右侧的框内。如下图
这样整个客户端的文件就可以复制到目标机器上。
存在问题,由于客户端里面的东西并不是全部都需要,因此有些即使不复制过去也行,但是担心会在运行时出现问题,所以我们将所有的文件都复制了过去。其中有几个文件会出现报错,因此我们没有复制,oraoledbzhs.dll,oraoledbus.dll.
2.1.2 修改注册表
在Oracle客户端中,有个文件是修改注册表用的。Oracle.reg
右击setup1项目,选择“视图”,“注册表”,然后在左侧的“目标机器上的注册表”右击,“导入”,选择oracle,reg.就把注册表修改信息全部添加了进去。如下图
2.13 修改环境变量
修改环境变量也可以在修改注册表的时候修改,但是这样会直接覆盖掉目标机器上本来的环境变量,因此我们选用在目标机器的环境变量上添加值。
在解决方案setup1中新建一个类库,添加一个安装程序类。在安装程序类中写入代码如下;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using Microsoft.Win32;
using System.Collections;
namespace ClassLibrary1
{
[RunInstaller(true)]
public partial class Installer1 : Installer
{
public Installer1()
{
InitializeComponent();
}
#region 重载自定义安装方法
protected override void OnBeforeInstall(IDictionary savedState)
{
base.OnBeforeInstall(savedState);
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
CheckOracleClient();
}
#endregion
#region 检查Oracle客户端设置
///
/// 检查Oracle客户端设置
///
private void CheckOracleClient()
{
string[] keys = { "SYSTEM", "ControlSet001", "Control", "Session Manager", "Environment" };
this.SetRegistryKey(Registry.LocalMachine, keys, "Path", @"C:/oracle/ora81/bin", true);
}
///
/// 将指定的值写入注册表
///
/// <param name="startKey">初始的注册表项</param>
/// <param name="registryKeys">注册表项数组,表示了指定值的路径</param>
/// <param name="valueName">值的名称</param>
/// <param name="value">要写入的值</param>
/// <param name="append">是否在当前值前添加,若为否,则覆盖当前值</param>
private void SetRegistryKey(RegistryKey startKey, string[] registryKeys, string valueName, string value, bool append)
{
RegistryKey rk = startKey;
RegistryKey subKey = null;
for (int i = 0; i < registryKeys.GetLength(0); i++)
{
subKey = rk.OpenSubKey(registryKeys[i], true);
if (subKey == null)
{
subKey = rk.CreateSubKey(registryKeys[i]);
}
rk = subKey;
}
if (append)
{
if (rk.GetValue(valueName) == null)
{
rk.SetValue(valueName, value);
}
else
{
string oldValue = rk.GetValue(valueName).ToString();
if (oldValue.IndexOf(value) >= 0)
{
}
else
{
rk.SetValue(valueName, value + ";" + oldValue);
}
}
}
else
{
if (rk.GetValue(valueName) == null)
{
rk.SetValue(valueName, value);
rk.Flush();
}
}
if (subKey != null)
{
subKey.Close();
}
rk.Flush();
rk.Close();
}
#endregion 检查Oracle客户端设置
}
}
这段代码的功能就是将环境变量“添加“到目标机器上。
然后在项目setup1中右击,选择“添加“,”项目输出“,在类库项目下选择主输出。点击确定。
在文件系统中,应用程序文件夹下添加项目输出,选择主输出
在自定义操作中,右击安装节点,添加自定义操作,在“选择项目中的项“中,选择应用程序文件夹下的来自类库的主输出。如下图:
至此,安装oralce客户端完成。
2.2 安装.net Framework 2.0
右击项目setup1,点击属性,在系统必备上,选择创建用于安装系统必备组件的安装程序,选择.net Framwok 20,选择从与我的应用程序相同的位置下载系统必备组件。点击确定。如下图:
这样,当安装程序安装时候,会自动查看目标机器上是否安装了.net Framwok2.0 ,如果没有安装,它会自己进行安装。
2.3 安装我们的软件
在文件系统下,选择“应用程序文件夹”,右击添加文件,将项目中的DEBUG下的XXX.exe,添加进去。右击XXX.exe的快捷方式,剪切放置到用户桌面文件夹下和用户的程序菜单中。如下图所示:
这里注意可以修改快捷方式的名称和图标。
2.4 安装第三方控件程序集
这步只需要将程序和程序集放在同一目录下就可以了,就是把三方控件里面resource文件夹下的DLL文件和我们的软件EXE文件放在同一目录下。如下图
这样就可以实现最优安装。
总结。至此完成安装