Post

c#应用安装包打包流程

这几天开发了一个c#应用,需要把应用打包成安装包,而且需要自定义一些安装操作(复制一些文件到安装目录),这里简单记录下,方便后用。

  • 首先安装打包插件。 visual studio 打开扩展, 安装截图中的扩展install projects 2022,然后重启ide image

  • 打开项目,在右键解决方案,新建一个setup项目

    image

  • 接下来在setup项目中,将所有要安装的文件复制到application folder中,这些文件将会被安装。 如果要安装时创建桌面快捷方式,可以在目录中右键创建一个快捷方式,然后拖到左侧users desktop文件夹,这样安装完成后,桌面就会有图标了。

    这里需要注意,图标应该是64x64的icon图标,如果不是的话,则图标配置不会生效。

image

  • 最后涉及到自定义安装过程,比如安装中需要从安装器根目录复制配置文件到安装目录

    右键解决方案,新建一个dll类库,因为自定义安装过程只能加载dll文件。

    image

    接下来右键类库,添加installer的扩展引用 image

接下来右键-添加项目,选择 自定义 installer 模板

image

这个类添加后,就可以自定义覆盖安装方法,并添加一些自己的逻辑,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace ClassLibrary3
{
    [RunInstaller(true)]
    public partial class Installer1 : System.Configuration.Install.Installer
    {
        public Installer1()
        {
            InitializeComponent();
        }
        public override void Install(IDictionary stateSaver)
        {
            base.Install(stateSaver);
        }
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
          // 获取参数,这里的参数是setup.exe调用时配置传入的
            string installDir = this.Context.Parameters["targetdir"];
            string sourcedir = this.Context.Parameters["sourcedir"];

            File.Copy(sourcedir + "notifyconfig.ini", installDir + "notifyconfig.ini", true);
            //string path = @"d:\test2124.txt";
            //string content = sourcedir + "notifyconfig.ini" + "|" + installDir + "notifyconfig.ini";

            //// 写入文本到文件
            //File.WriteAllText(path, content);
        }
    }
}

上面代码中

install流程我没有做更改

commit流程也就是安装完成流程,这里我定义的逻辑是:安装完成后复制安装目录下的notifyconfig.ini文件到应用安装目录去覆盖默认配置。

这里有两个参数, targetdirsourcedir。这两个参数是安装器调用时传入的。详情在下面介绍

接着就可以构建dll,并将dll也引入到安装器中。

在setup项目右键-view-自定义操作, 添加这个dll(这个dll添加到那个安装步骤,安装时就会调用对应实现的自定义逻辑).

image

左侧可以在添加的各个阶段添加自定义的dll, 那么参数就由右侧的customActionData 传入。 这里简单介绍下,更多的可以自己google.

我这里传入原文是(这里配置为/key=value形式,key之前必须使用反斜杠开头, value使用双引号括起来):

1
/targetdir="[TARGETDIR]/" /sourcedir="[SourceDir]/"

注意这里value的 “/”符号不是必须,我这样写的目的是系统将会在”[TARGETDIR]”实际目录后面拼接一个”/”。 至于使用方式,可以直接查看前面代码。

另外这里再备注一个自定义安装流程后,安装包安装时报错不能找到installstate文件问题。这个问题的原因时installstate文件是在install阶段生成的。

如果你只定义了其他流程,比如commit. 没有实现install ,那么这个文件就不会生成!

This post is licensed under CC BY 4.0 by the author.