这段时间在公司研究C#程序的安装包尝试了vs自带的setup项目,效果不尽如意跟直接压缩没太大区别。老大让我试试用nullsoft做着试试…在这期间踩了好多好多坑…主要是网上找到的nullsoft教程都不太适合初学者。整理发布下我拼凑的这篇脚本。本人研究有限,仅为了项目开发而研究。高手勿喷。

正文开始,首先是 nullsoft的官网 ,可以在下载页下载nsis。nsis仅是一个编译器 在这里插入图片描述
点击compile nsi scripts后把.nsi脚本文件扔进去就可以编译了。
这里是第一个坑…尼玛我才懒得学脚本语言。那好,再下载一个 HM NIS Edit ,其实嘛脚本文件拿什么文件编辑器打开都可以,但是这个HM NIS Edit自带向导,这就很友好了。这里提醒跟我一样c#的初学者一下打包的文件除了一些.txt文件和.pdb文件外几乎都是需要的…然后可以把需要打包的文件夹(release)先复制一份丢到其他文件夹中像这样 在这里插入图片描述
后面跟着向导弄完基本你的安装包就能正常工作了…
然后头疼的地方来了,定制化安装包,实现检测安装时是否在运行本软件,若运行则弹窗终止进程。检测是否安装旧版本,若安装则卸载旧版本。安装后自动关联文件默认打开方式,刷新文件图标。
还是那句话懒得学脚本语言。就白嫖呗。东拼西凑的可以用,有什么需要修改的自己看着办吧。上代码。

; Script generated by the HM NIS Edit Script Wizard.
!include "WordFunc.nsh"
!include "FileAssociation.nsh"
!include "FileFunc.nsh"
!include "nsProcess.nsh"
!include LogicLib.nsh
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "你的产品名字"
!define PRODUCT_VERSION "版本号"
!define PRODUCT_PUBLISHER "公司名"
!define PRODUCT_WEB_SITE "公司网址"
;定义注册表方便验证是否已安装,以及安装的版本
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\你的软件名.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
;你产品的唯一标识号
!define UninstId "{BDB7DC98-77FE-4859-8B49-C66132185719}"
;定义打包方式,lzma追求最小体积
SetCompressor lzma
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
;定义安装程序图标
!define MUI_ICON "Install2.ico"
;定义卸载程序图标
!define MUI_UNICON "uninstall.ico"
; Language Selection Dialog Settings
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!define MUI_LICENSEPAGE_CHECKBOX
;读取授权文件
!insertmacro MUI_PAGE_LICENSE "D:\repos\你的软件名\bin\x64\打包发布\授权文件.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\你的软件名.exe"
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "SimpChinese"
; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "你的软件名.exe"
;不知道咋回事nsis一直默认写在x86下就干脆写死
InstallDir "C:\Program Files\你的产品名"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
;这个必须在调用前(.onit前)定义
!macro UninstallExisting exitcode uninstcommand
Push `${
Function .onInit
  ClearErrors
  ReadRegStr $UNINSTALL_PROG ${PRODUCT_UNINST_ROOT_KEY} ${PRODUCT_UNINST_KEY} "UninstallStri
                                    Function .onInit
    ;检查重复运行
 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "MicroSetup") i .r1 ?e'
 Pop $R1 ;;;;$$$$$安装程序已经运行
 StrCmp $R1 0 +3
 ;MessageBox MB_OK|MB_ICONINFORMATION|MB
                                        以在工作中遇到的一个问题,我们的产品在运行时,点击安装,会报错,找到一个结束进程的控件processwork.dll    下载地址:http://www.esanu.name/programs/NSISKillProcess.html       将processwork.dll放到Plugins目录下,然后在NSIS代码中加入如下函数:Function CloseParentWith
                                    目录说明Script配置软件是否安装软件版本软件运行安装/升级程序运行安装软件或者升级软件的时候要做一下常规的检查,一般包括以下几项:
软件是否已经安装
软件版本是否正确(升级)
软件是否正在运行
安装/升级程序是否正常运行
Script
!define PRODUCT_NAME "Test"
!define PRODUCT_VERSION "2.4.1"
!defi...
                                    NSIS检测安装并卸载旧版本(64位):
Function .onInit
   !insertmacro TIP_WHEN_AMD64_INSTALLER_RUNAT_X86
   ;安装到所有用户下,current 表示安装到当用户下, all 表示所有用户下。
   SetShellVarContext all
   ClearErrors
   SetRegVie
                                    NSIS的官方地址是:http://nsis.sourceforge.net/Main_Page     NSIS的下载地址是:http://nsis.sourceforge.net/Download,     NSIS的帮助文档是:http://nsis.sourceforge.net/Docs/ 断DotNetFrameWork是否安装,可以自己添加如下的代码: ;f2.
                                    可能大家在使用NSIS制作安装包时会遇到覆盖文件或只覆盖较新文件的问题,这里烈火网就给大家整理了一些使用实例,欢迎阅读。碰到要处理分支:1、覆盖安装。(覆盖掉用户所有上个版本安装文件)SetOverwrite on2、先卸载再安装。(保留一部分数据)SetOverwrite off这样就需要根据在卸载时候uninst,用户的选择1或者2,进入安装时生成条件分支。无奈卸载和安装是两个进程做的事情,...