这里仅简单记录一下,自己备忘。至于能否给大家参考,请大家自行阅读。
需求:
1.目前有一个WinForm程序,需要制作安装部署程序
2.需要添加一个Windows服务用于监控Winform程序的进程,防止退出,并且在Winform的安装部署程序中也要安装此服务。
解决方法:
WinForm的Project就不说了。
Windows服务程序的添加和ProjectInstaller的添加
在sln下面新建一个Window服务程序,在Winfows服务是Service1的设计界面点击右键“添加安装程序”,添加一个ProjectInstaller
ProjectInstaller部分代码如下,在相应方法内写自定义操作的相关代码public partial class ProjectInstaller : System.Configuration.Install.Installer
{
public ProjectInstaller()
{
InitializeComponent();
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;//设置服务为自动启动
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalService;//设置服务安装指定的账号为本地系统
writeLog("xxxWindowsService ProjectInstaller run.");
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
writeLog("enter OnAfterInstall ");
writeLog("leave OnAfterInstall ");
}
protected override void OnBeforeUninstall(IDictionary savedState)
{
base.OnBeforeUninstall(savedState);
writeLog("enter OnBeforeUninstall ");
writeLog("leave OnBeforeUninstall ");
}
安装项目的添加
sln右键添加新建项目-其他项目类型-安装和部署-Visual Studio Installer-安装项目。
在解决方案资源管理器点击Setup1,再点击vs2010工具栏的属性图标(ctrl+w,p),在弹出的属性框内设置Setup项目的相关属性,包括Auther,Manufacturer,productName等属性。
在解决方案资源管理器点击Setup1,再点击vs2010工具栏的属性图标(ctrl+w,p),在左侧设计界面弹出文件系统编辑器,点击应用程序文件夹,在中间窗口右键添加项目输出,添加安装程序所需的相关dll等文件。这里不再详细说具体的步骤了,网上baidu,google一大把。
现在说添加安装windows服务:
在文件系统编辑器中添加Window服务项目作为主输出后,Setup项目生成Setup文件安装时就会自动在安装Winform程序的时候安装Windows服务。
下面是如何在安装WindowsService过程中获取自定义参数的配置。
在解决方案资源管理器点击Setup1,再点击解决方案资源管理器顶部的自定义操作编辑器图标。
在自定义操作编辑器设计区域右键点击“安装”添加项目输出(这个项目输出要选中Windows服务那个项目)。
选中刚刚添加的项目输出,右键属性窗口,设置CustomActionData值为 /TARGETDIR="[TARGETDIR]\",注意,这里设置这个参数目的是能在Windows服务中的ProjectInstaller的方法中能获取到用户在安装过程中选中的安装程序路径。在ProjectInstaller中的OnAfterInstall方法中通过代码Context.Parameters.ContainsKey("TARGETDIR")获取到用户在安装过程中选中的安装程序路径。
右键点击“卸载”添加项目输出(这个项目输出要选中Windows服务那个项目)。重复上一步的操作设置属性相应值。
完整ProjectInstaller的代码如下:
[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
private string softWareMainFolder = "xxxMain";//Setup程序中配置的应用程序文件内自定义的主程序文件夹名
private string softWareServiceFolder = "xxxService";//Setup程序中配置的应用程序文件内自定义的服务程序文件夹名
private string serviceName = "xxxWinService";//服务名称
public ProjectInstaller()
{
InitializeComponent();
this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;//设置服务为自动启动
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;//设置服务安装指定的账号为本地系统
writeLog(Environment.NewLine);//添加换行便于日志查看
writeLog("xxxWindowsService ProjectInstaller run.");
}
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
}
protected override void OnAfterInstall(IDictionary savedState)
{
base.OnAfterInstall(savedState);
//安装成功后更改服务配置文件中的被监控程序的路径
try
{
writeLog("enter OnAfterInstall ");
#region 测试自定义参数
writeLog("Context.Parameters.Keys.Co