当前位置: 首页 > news >正文

C#打包应用程序

 

本文详细和大家讲一下打包部署仅仅为基础的打包方案,打包附加.netframework包的操作仅在Visual Studio2005以及以上版本才有效,VS2003的话需要下载一个PluginInstaller.msi插件包。


 

下面开始吧。


 

第一步 : 新建安装部署项目
打开 VS, 点击新建项目 , 选择 : 其他项目类型 -> 安装与部署 -> 安装向导 ( 安装项目也一样 ), 然后点击确定 .( 详细见下图 )


 


 

91fd24a69c0e80b29152ee49.jpg



 

第二步 : 安装向导


 

关闭后打开安装向导 , 点击下一步 , 或者直接点击完成 .


 

如下图 :


 


 

98940df54c7f1167730eec49.jpg




 


 

4ee59c20ac2385b6d6cae249.jpg


 

第三步 : 开始制作


 

安装向导完成后即可进入项目文件夹 :


 


 

acb908f137e7f28e0b46e049.jpg


 

双击 " 应用程序文件夹 " 在右边的空白处右击 , 选择添加 -> 文件 , 将你的做的应用程序的可执行文件和相应的类库和组件添加进来 .


 

PS: 在这里 , 有很多朋友问我 , 什么是 应用程序的可执行文件和相应的类库和组件 , 在这里我解释一下 , 应用程序的可执行文件即是你建立的 winform 应用程序项目最终生成的 EXE 可执行文件 , 而相应的类库则是执行这个 EXE 文件所有需要的非操作系统 dll 文件 , 在这里只要将 EXE 文件选中添加 ,VS 会自动将其用到的 DLL 文件添加 .( 这里你可以将应用程序项目中生成方式选择 Release, 然后生成 , bin/Release 文件夹下的文件按结构添加进来即可 )


 


 


 

097d7fc9e86b7b5abf09e649.jpg


 


 


 

d4f1f61d5a24e226f724e449.jpg


 

然后右击你的可执行文件 , 创建快捷方式 , 然后把快捷方式分别剪切或复制到左边的 " 用户的 ' 程序 ' 菜单 " " 用户桌面 " .


 

这样安装程序安装安装完成后会在 " 开始 -> 所有程序 " " 桌面 " 上生成程序的快捷方式 .


 


 

28936f62e41e0e01eaf8f849.jpg






 

然后右击左边的 " 应用程序文件夹 " 打开属性对话框 :


 


 


 

d284834601d59309500ffe49.jpg


 

将属性中的 " defaultlocation " 的路径中的 "[manufacturer]" 去掉 ,


 

不然的话做好的安装程序默认安装目录会是 "c:\programm file\ 你的用户名 \ 安装解决方案名称 ";


 

修改后如图 :


 


 


 

354f1e4ebd2250bcd62afc49.jpg



 

然后打开解决方案管理器 , 右击你的解决方案名称 , 选择属性 :


 


 


 

8fb8ddfb3907e91c242df249.jpg


 

在打开的属性页中 , 选择 " 系统必备 ",


 


 


 

099d645bd5005d6f2934f049.jpg



 

在打开的系统必备页中 , 选中如下中的选择项 , 这个很重要 !!!!!1!!!!!


 

选上以后 , 在生成的安装文件包中包含 .netframework 组件 .( 这个选项默认是没有选中的 )


 


 


 

fb9ad028da19bdde023bf649.jpg




 

在这里解释一下3个选项,第一个选项“从组件供应商的网站上下载系统必备组件”,选中此选项,当安装时检测到系统没有安装.netframework组件时,系统提示到微软官方下载组件,并给出下载地址;第二个选项“从与我的应用程序相同的位置下载系统必备组件”,选中此选项,安装程序生成时会在同目录下生成.netframework组件,当安装程序检测到系统没有安装组件时会提示进行安装,当然此选项生成的安装程序会比较大一些;第三个选项,看名字应该也可以猜测到他的意图,可以自行自定.netframework组件的安装位置。


 

好了,这样就完成99%了,然后点击"生成->生成解决方案",哈,生成成功!


 


 

第四步 : 制作完成


 

现在打开解决方案文件夹下的 debug 文件夹 , 就可以看到生成的安装文件了 .


 


 


 


 

f6833099f716d2f0c8eaf449.jpg



 


 

第五步:卸载功能的添加


 

众所周知,基本上每个安装都会在安装后的程序菜单中提供卸载本程序的快捷方式,从我们以上步骤建立的安装程序并不附加此功能,


 

但是我们安装后,如果再次运行此安装程序,则会提供重新安装、修改和删除应用程序的功能,也就是程序的卸载功能,也可以通过


 

控制面板进行卸载完成,不过我们可以看出,程序的打包是通过 Windows Installer 来完成的,我们这里也可以通过 Windows Installer 来完成卸载功能。


 


 

在添加你的应用程序项目的时候,多添加一个 msiexec.exe 进去 ,


 

这个文件在 c:\windows\system32 文件夹下 ,


 


 


 

dd8c5fb73fc79c8b37d3ca49.jpg


 

添加进去以后 , 为了让他更像个卸载程序 , 把他的名字改成 "Uninstall.exe",


 

当然这个关系不大 , 改不改都行的 .


 


 


 

175d11cccefe5c7cb700c849.jpg


 


 

然后给他创建一个快捷方式 , 放到桌面或者 " 开始 - 程序 " ,


 

我选择放在了开始菜单中 , 然后下面我们要的做的就是查找这个部署项目的 ProductCode ,


 

鼠标左键单击项目名称 , 记住是左键单击 , 然后点击属性标签 , 注意 : 不是右击的属性 ,


 

这个区别很大 , 这时你就可以看到 ProductCode ,


 




 


 


 

e864d13b4c2db3b63b87ce49.jpg




 

然后打开你创建的那个快捷方式的属性对话框 ,


 

Aguements 属性中输入 "/x {ProductCode}",


 

其中的 "/x {ProductCode}" Windows Installer 的卸载命令,高版本也有所不同,高版本的 "/uninstall {ProductCode}" 也可用,不过 "/x {ProductCode}", 是通用的。


 

好了 , 然后点击 " 生成解决方案 " 即可生成带有卸载功能的安装程序了 . 现在可以试试生成安装程序,是否已经具有了卸载功能?


 

PS :在添加某些操作系统 DLL 的时候可能会有警告的提示,这个不会对程序有什么影响,不用害怕。


 

68b73ef1c6aa6015342acc49.jpg


 


 

好了 , 然后点击 " 生成解决方案 " 即可生成带有卸载功能的安装程序了 .

相关文章:

  • SCUT - 37 - 手速帝CZK - 分块
  • HDU 1166 敌兵布阵
  • babel
  • 转载 对于struct file_operations中ioctl消失的学习笔记
  • SCUT - 77 - 哈利波特与他的魔法杖
  • 圆满完成 中大 《性能测试与LoadRunner应用》 实战训练课!
  • 利用vi编辑器创建和编辑正文文件
  • c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)
  • Simulation of AVL Trees (DYNAMIC)
  • hive中function函数查询
  • 更改Windwos server 2003 域用户密码策略默认配置
  • SCUT - 38 - 屠场的秘密 - 分解
  • 0 or 1 ?
  • 今天去面试.net开发,感想
  • fortinate防火墙使用本地用户三步开通PPTP ***
  • Android开源项目规范总结
  • FastReport在线报表设计器工作原理
  • fetch 从初识到应用
  • idea + plantuml 画流程图
  • iOS编译提示和导航提示
  • JavaScript DOM 10 - 滚动
  • JavaScript-Array类型
  • Redis字符串类型内部编码剖析
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 创建一个Struts2项目maven 方式
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 简析gRPC client 连接管理
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 协程
  • puppet连载22:define用法
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #数学建模# 线性规划问题的Matlab求解
  • #预处理和函数的对比以及条件编译
  • ( 10 )MySQL中的外键
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (一)u-boot-nand.bin的下载
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core Swagger 过滤部分Api
  • .net core 连接数据库,通过数据库生成Modell
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .Net的C#语言取月份数值对应的MonthName值
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • ?php echo ?,?php echo Hello world!;?
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [20161101]rman备份与数据文件变化7.txt
  • [2669]2-2 Time类的定义
  • [Angular 基础] - 表单:响应式表单
  • [C# 网络编程系列]专题六:UDP编程
  • [C++]STL之map
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏