Revit插件安装包整体制作流程:
1.安装程序
1.1前端:制作安装页面(winfomr和wpf均可,根据需要创建页面,如欢迎页面,安装许可协议页面,Revit版本选择页面,安装地址选择页面,安装进度页面)
1.2后端:
1.2.1获取安装地址,将程序中的dll压缩包文件和卸载程序解压到相应位置。
1.2.2获取需要安装的版本信息,动态创建addin文件,并将其移动到版本对应的文件夹
1.2.3写入注册表
1.2.4将卸载程序快捷方式写入开始菜单(也可写入桌面,但Revit插件暂时没有用到)
2.卸载程序
2.1前端:制作卸载页面(winform和wpf均可,根据需要创建页面,如确定页面,卸载完成页面)
2.2后端:
2.2.1删除版本对应的addin文件
2.2.2删除dll文件。
2.2.3删除注册表信息
2.2.4删除开始菜单快捷方式
2.2.5删除卸载程序本身

ps:项目整体代码后续会发出,不过建议大家根据流程自己制作;

以下为例子,仅供参考:
1.1前端页面为winform制作,因为页面比较简单,不放具体代码。ps:这是美工未美化之前的页面,吐槽的留情。





1.2后端
1.2.1 释放文件。前端传入的路径地址为string filePlace

//安装包内压缩包文件释放,解压缩到指定位置
//引用System.IO.Compression.FileSystemstring newFilePlace = filePlace + "\\PlugIn.zip";FileStream fileStream = new FileStream(newFilePlace, FileMode.OpenOrCreate);fileStream.Write(Properties.Resources.PlugIn, 0, Properties.Resources.PlugIn.Length);fileStream.Close();//解压缩。这种解压缩/压缩方式很简单,一行代码搞定。缺点是不能控制内部解压缩流程。ZipFile.ExtractToDirectory(newFilePlace, filePlace);//删除压缩包System.IO.File.Delete(newFilePlace);

1.2.2创建动态的addin文件,也是xml文件,外部直接调用这个方法。
建议在Revit中生成addin文件,再对照节点信息写xml文件

创建xml文件类代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;namespace xxxxRevit插件
{public class CreatXmlFile{public static void Xml(string filePlace){//创建xml文档对象XmlDocument xmldoc = new XmlDocument();XmlText xmltext;//加入xml的声明段落XmlNode xmlnode = xmldoc.CreateXmlDeclaration("1.0", "utf-8", null);xmldoc.AppendChild(xmlnode);//添加一个根元素//创建元素节点ModelConfigXmlElement xmlele = xmldoc.CreateElement("", "RevitAddIns", "");//创建文本节点xmltext = xmldoc.CreateTextNode("");//创建元素节点的文本节点xmlele.AppendChild(xmltext);//绑定元素节点属于xml文档xmldoc.AppendChild(xmlele);//添加一个子元素XmlElement xmlele1 = xmldoc.CreateElement("", "AddIn", "");xmltext = xmldoc.CreateTextNode("");xmlele1.AppendChild(xmltext);//创建元素节点的属性节点xmlele1.SetAttribute("Type", "Application");//绑定元素节点Config在ModelCofig下xmldoc.ChildNodes.Item(1).AppendChild(xmlele1);//创建第一个子元素的子元素XmlElement xmlele2 = xmldoc.CreateElement("", "Name", "");xmltext = xmldoc.CreateTextNode("UIPage");xmlele2.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele2);XmlElement xmlele3 = xmldoc.CreateElement("", "Assembly", "");xmltext = xmldoc.CreateTextNode(filePlace+ @"/xxxx.dll");xmlele3.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele3);XmlElement xmlele4 = xmldoc.CreateElement("", "ClientId", "");xmltext = xmldoc.CreateTextNode("95dca3f4-bb3c-4066-80ae-908574198f01");xmlele4.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele4);XmlElement xmlele5 = xmldoc.CreateElement("", "FullClassName", "");xmltext = xmldoc.CreateTextNode("FileChangeUI.UIPage");xmlele5.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele5);XmlElement xmlele6 = xmldoc.CreateElement("", "VendorId", "");xmltext = xmldoc.CreateTextNode("liunianwangshui");xmlele6.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele6);XmlElement xmlele7 = xmldoc.CreateElement("", "VendorDescription", "");xmltext = xmldoc.CreateTextNode("liunianwangshui,www.liunianwangshui.com.cn");xmlele7.AppendChild(xmltext);xmldoc.ChildNodes.Item(1).AppendChild(xmlele1).AppendChild(xmlele7);//保存xml成文件xmldoc.Save("xxxx" + ".addin");}}
}

安装页面调用代码
选择的版本信息用 bool vision[]存储,如果选择了版本则vision[i]=true,创建addin文件;
path为addin固定位置,path=@“C:\ProgramData\Autodesk\Revit\Addins”;

//将创建的addin文件放入版本对应的文件夹中for (int i = 0; i < versions.Length; i++){if (versions[i] == true){CreatXmlFile.Xml(filePlace);string j = @"\" + (2014 + i).ToString() + @"\";path = path + j;string xmlFilePath = @".\xxxx.addin";FileInfo fileInfo = new FileInfo(xmlFilePath);string tmp = path + fileInfo.Name; //判断是否存在原来的addin文件,如果存在删除它。目的是更新addin文件。if (File.Exists(tmp)){File.Delete(tmp);}//创建文件夹,发生情况:当未安装当前版本,却选了当前版本的时候。if (!Directory.Exists(path)){Directory.CreateDirectory(path);}fileInfo.MoveTo(tmp);}}

1.2.3写入注册表。因为Revit目前基本是64位电脑安装,因此写入64位注册表。

            //第一句是因为64位,如果是32位需要更改第一和第二句。//因为64位电脑直接打开路径的话,打开的路径会加入Wow64文件夹,并不是写入的路径。RegistryKey localMachin64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);RegistryKey key = localMachin64.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\", true);//创建插件名称的键key.CreateSubKey("xxxxePlugIn");key.Close();//对插件的注册表里面赋值。DisplayName和UninstallString必须填。可以打开注册表查看其他软件注册表作为参考。RegistryKey key1 = localMachin64.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\xxxxPlugIn",                      true);key1.SetValue("DisplayName", "xxxxPlugIn");key1.SetValue("UninstallString", filePlace + @"\uninstall.exe");key1.SetValue("DisplayVersion", "V1.0");key1.SetValue("Publisher", "xxxx有限公司");key1.Close();

1.2.4将卸载程序快捷方式写入开始菜单

 private void WriteStartMenu(){//创建程序对应的开始菜单快捷方式IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();string dtpath = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\程序\\xxxx\\" + "xxxxx.lnk";//判断是否有文件夹存在,不存在则创建if (!Directory.Exists(Path.GetDirectoryName(dtpath))){Directory.CreateDirectory(Path.GetDirectoryName(dtpath));}//创建对应关系。简单的只写了卸载程序路径和描述,如果需要更多信息,可以查找其他资料IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(dtpath);shortcut.TargetPath = filePlace + @"\uninstall.exe";//shortcut.WorkingDirectory = System.Environment.CurrentDirectory;//shortcut.WindowStyle = 1;shortcut.Description = "xxxxPlugIn的卸载程序";//shortcut.IconLocation = System.Environment.SystemDirectory + "\\" + "shell32.dll, 165";shortcut.Save();}

2.卸载程序
2.1前端:制作卸载页面(winform和wpf均可,根据需要创建页面,如确定页面,卸载完成页面)

2.2后端:
2.2.1删除版本对应的addin文件。
此处是循环删除了所有版本的文件,可以加判断条件,选择删除哪个版本。

                string addinPlace = @"C:\ProgramData\Autodesk\Revit\Addins\";//删除2014到2020版本的addin文件for (int i = 2014; i <=2020; i++){if (File.Exists(addinPlace + i + @"\xxxx.addin")){File.Delete(addinPlace + i + @"\xxxx.addin");}}

2.2.2删除dll文件。

                string filePlace = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;Directory.Delete(filePlace + @"PlugIn\", true);

2.2.3删除注册表信息

             //这里和上面创建注册表信息是对应的RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);RegistryKey uninstallKey=localMachine64.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\",true);//得到安装文件位置下的所有注册表文件名信息string[] subkeyNames = uninstallKey.GetSubKeyNames();foreach (string  keyName in subkeyNames){if (keyName== "xxxxPlugIn"){localMachine64.DeleteSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\xxxxPlugIn", true);return;}}

2.2.4删除开始菜单快捷方式

                string dtpath = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\程序\\xxxxPlugIn\\" +"xxxxPlugIn.lnk";string dt = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) + "\\程序\\xxxxPlugIn\\";if (File.Exists(dtpath)){File.Delete(dtpath);Directory.Delete(dt);}

2.2.5删除卸载程序本身

        //这块代码比较复杂,可以直接用//详细了解的话,可以百度如何删除程序自身。有些方法可以,有些方法不可以。[System.Runtime.InteropServices.DllImport("kernel32.dll")]public static extern uint WinExec(string lpCmdLine, uint uCmdShow);private static void DeleteItself(){string vBatFile = Path.GetDirectoryName(Application.ExecutablePath) + "\\DeleteItself.bat";using (StreamWriter vStreamWriter = new StreamWriter(vBatFile, false, Encoding.Default)){vStreamWriter.Write(string.Format(":del\r\n" +" del \"{0}\"\r\n" +"if exist \"{0}\" goto del\r\n" +"del %0\r\n", Application.ExecutablePath));}//************ 执行批处理WinExec(vBatFile, 0);//************ 结束退出Application.Exit();}

至此,一个完整的安装包流程制作完成,有意见可以在下方评论,我会根据建议进行修改。
希望大家都可以做出自己想要的安装包。

c#制作简单安装包 以Revit插件为例相关推荐

  1. Eclipse插件安装之,使用(已经下载的zip)安装包直接安装插件(例:glassfish 插件 plugin)

    目录 ■前言 ■友情提示 ■操作(zip 失败) ■其他安装方式(Eclipse Marketplace)  安装成功!!! ■前言 单位工作的电脑, 一般使用这种方式安装(zip方式). ■友情提示 ...

  2. python制作安装包_Python简单安装包制作

    Python 简单安装包制作 Python egg制作(安装出问题) 项目目录下创建 setup.py 文件, 目录与内容如下举例 ~/vomm$ tree . ├── LICENSE ├── MAN ...

  3. linux/ubuntu中制作deb安装包

    linux/ubuntu中制作deb安装包 由于要制作一个在arm平台上运行的xorg-server-1.12.4版本的安装包,所以需要学习如何制作deb安装包.这里以一个非常小的工程为例,记录制作的 ...

  4. 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

    原文:使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll) 前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.con ...

  5. 7z制作自解压安装包

    像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应 ...

  6. C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)...

    C#进阶系列--使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll) 原文:C#进阶系列--使用Advanced Installer制作IIS安装包(二:配置 ...

  7. python卸载_如何为Python程序制作Windows安装包?

    我们使用Python可以编写很多提高工作和学习效率的小工具,在编写完之后,如果我们想将其分享给更多的人使用,那么最便捷的方法就是将其打包为可执行程序. 在Windows环境下,我们使用Pyinstal ...

  8. 7z制作自解压安装包(转载)

    像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应 ...

  9. 使用HM NIS Edit制作软件安装包

    使用HM NIS Edit制作软件安装包 使用HM NIS Edit制作软件安装包 背景 准备工作 制作流程 结束语 背景 由于参与的横向项目需要,需要对实验室开发的VSP处理软件进行安装包制作,主要 ...

最新文章

  1. 【旧文新读】解释“闭包”需要几行代码?
  2. Linux 操作系统原理 — 内核态与用户态
  3. db2查询字段备注_通过逐浪数据精灵管理sqlserver数据表备注以及字段说明
  4. Django从理论到实战(part29)--Field的常用参数
  5. 七牛直播云服务技术揭秘
  6. 程序编码应保持良好的规范(C#)
  7. 32为Linux安卓AVD启动报错
  8. 智能名片为什么使用场景都是微信小程序?哪些新玩法值得一试?
  9. 用html画动漫人物,画动漫人物的步骤?
  10. SAP 采购订单入库——收货业务分析
  11. [和平之月系列] 《都 Ancient City Ⅱ》 钢琴
  12. 华为pppoe简单配置实验
  13. 使用frp+MobaXterm进行ssh远程连接报错及解决办法
  14. limit和offset用法
  15. wikioi 1550 不明飞行物
  16. LeeCode 1626 DP
  17. gog无效的验证码_如何退款GOG游戏
  18. 巴比特 | 元宇宙每日必读:盘点2022年全球元宇宙行业十大“闪光时刻”,2023年,元宇宙的发展机会又在哪里?...
  19. 【最新版】愚人节整人软件大全
  20. 灰点相机SDK研究(壹)-使用Python多线程读取灰点相机图像

热门文章

  1. 洛谷1072 Hankson 的趣味题
  2. 说说著名的计算机科学家和他们的代表成就,说一说你知道的科学家和他们的成就...
  3. 2【源码】数据可视化:基于 Echarts + Java SpringBoot 实现的动态实时大屏范例-物流大数据
  4. 破解手机私密相册app的密码 wpjpg格式图片
  5. 软著申请流程及所需材料
  6. 后台管理系统简单实现总结
  7. iframe标签的使用
  8. 你见过最惊艳的一些 PPT 或者一些演讲者与 PPT 成功配合的案例?
  9. 搜索切换dump之MapReduce讲解
  10. 修复 dji spark 的 micro sd/tf 存储卡里不能正常播放的视频文件