• 前言

C#写好一个应用程序,总想分享给自己的朋友或者上架,然而被困在打包之外,这次为大家带来近期我的经验,经过几天的摸索,发现网上的教程并不全面,会给初学者带来很多疑问,这里将做些问题描述与解答。 
/*
开发工具:Visual Studio 2017 
系统版本:win10 x64 
要求:已经有一个已完成的项目 
*/

  1. 获取打包工具,使用微软自带工具,获取步骤如下,若已安装请忽略此步。

打开工具->扩展和更新->搜索(2017 installer)->点击安装: 
  
这里安装扩展的具体步骤就不再赘述。 
2. 安装完扩展以后,新建一个Setup project项目。

界面如下 
“应用程序文件夹”即”Application Folder”表示要安装的应用程序需要添加的文件; 
“用户的‘程序’菜单”即”User’s Programs 
Menu”表示:应用程序安装完,用户的“开始菜单”中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放:应用程序.exe和卸载程序.exe; 
“用户桌面”即”User’s Desktop”表示:这个应用程序安装完,用户的桌面上的创建的.exe快捷方式。 
3. 解决方案->添加->新建项目->类库,命名为ClassLibrary,在项目ClassLibrary下面,删除Class1.cs,添加->新建项目->安装程序类(名称为InstallerDemo.cs),打开Installer,这个class Installer继承自System.Configuration.Install.Installer,里面就一个构造函数。现在安装程序不能完成的功能,都可以在这个类写代码来自己实现。 
4. 重写安装函数BeforeInstall,AfterInstall,AfterRollback,AfterUninstall,BeforeRollback,BeforeUninstall等复制以下代码实现自定义操作: 
ps:这里的OnAfterInstall操作是写入注册表,自启动

protected override void OnAfterInstall(IDictionary savedState)
{
LogWrite("OnAfterInstall!");
string path = this.Context.Parameters["targetdir"];//获取用户设定的安装目标路径, 注意,需要在Setup项目里面自定义操作的属性栏里面的CustomActionData添加上/targetdir="[TARGETDIR]\"
LogWrite(path); //开机启动
RegistryKey hklm = Registry.LocalMachine;
RegistryKey run = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true); try
{//64位系统在计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
LogWrite("设置注册表!");
LogWrite(path.Substring(0, path.Length - 1) + @"BingPic\BingPic.exe");
run.CreateSubKey("Bing",true);
run.SetValue("Bing", path.Substring(0,path.Length-1) + @"BingPic\BingPic.exe");
hklm.Close();
LogWrite("设置结束!"); }
catch (Exception my)
{
my.ToString();
LogWrite(my.ToString());
}
base.OnAfterInstall(savedState);
}
public override void Install(IDictionary stateSaver)
{
LogWrite("Install!");
base.Install(stateSaver);
}
protected override void OnBeforeInstall(IDictionary savedState)
{
LogWrite("OnBeforeInstall!");
base.OnBeforeInstall(savedState);
}
public override void Uninstall(IDictionary savedState)
{
LogWrite("Uninstall!");
base.Uninstall(savedState);
}
public override void Rollback(IDictionary savedState)
{
LogWrite("Rollback");
base.Rollback(savedState);
}
public void LogWrite(string str)
{
string LogPath = @"c:\log\";
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(LogPath + @"SetUpLog.txt", true))
{
sw.WriteLine(DateTime.Now.ToString("[yyyy-MM-dd HH:mm:ss] ") + str + "\n"); }
}

实现以上还不能应用到你的程序中,接下来添加主程序入口。 
5. 添加主程序入口:“application folder 应用程序文件夹”–右侧空白处右键–“添加”–“项目输出” 
** 
项目Setup1 ->添加->项目输出->选择ClassLibrary后确定,你会发现,在项目Setup1 下面多了一项“主输出来自ClassLibrary(活动)”的字样。 
6. 添加自定义操作: 可以看到四个子项:安装,提交,回滚,卸载。在安装上面点击右键->添加自定义操作->选择“主输出来自ClassLibrary(活动)”。这样,重新生成后,安装之后就会执行 OnAfterInstall代码了。 
 
ps:获取用户设定的安装目标路径, 注意,需要在Setup项目里面自定义操作->install->输出的属性栏里面的CustomActionData添加上/targetdir=”[TARGETDIR]\”这样代码里就可以获取到安装路径了 
7. 添加卸载程序:c:\windows\system32\msiexec.exe 
 
获取资源管理器”:点击项目setup1,属性>-“ProductCode” ,将它的值复制,后面需要使用,很重要。 
 
8. 添加你的已存在项目文件:debug目录下的文件添加到应用程序文件夹里。 
9. 创建应用程序快捷方式,卸载快捷方式.并重命名为你希望的,剪切并黏贴到桌面文件夹和用户程序文件夹 
 
并在卸载快捷方式的属性中添加之前复制的 
最后生成应用程序即可。 
至此你的第一个应用程序就打包好了。现在去测试吧!

这个例子中在写入注册表时遇到了不少难题,其中一个很迷惑人的就是: 
System.UnauthorizedAccessException: 无法写入到注册表项。 
在 System.ThrowHelper.ThrowUnauthorizedAccessException(ExceptionResource resource) 
在 Microsoft.Win32.RegistryKey.EnsureWriteable() 
在 Microsoft.Win32.RegistryKey.SetValue(String name, Object value, RegistryValueKind valueKind) 
在 Microsoft.Win32.RegistryKey.SetValue(String name, Object value) 
在 MyInstall.InstallerBing.OnAfterInstall(IDictionary savedState)
 
后来找资料说是未将RegistryKey run = hklm.OpenSubKey(@”SOFTWARE\Microsoft\Windows\CurrentVersion\Run”,true);设为true,之后解决。

操作注册表时还有一个问题就是写入成功,找不到的问题, 
在32位机上自启动路径位:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 
64位:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run

最后设置的CustomActionData添加上/targetdir=”[TARGETDIR]\”,一定要写对 /targetdir=”[TARGETDIR]\”

欢迎大家指出问题。

[转] VS2017 打包安装程序的更多相关文章

  1. VS2017打包安装程序

    VS2017 并不自带安装部署项目,需要在[扩展和更新]中安装插件:Microsoft Visual Studio 2017 Installer Projects(现更名为Microsoft Visu ...

  2. sencha touch 扩展篇之将sencha touch打包成安装程序(上)- 使用sencha cmd打包安装程序

    由于最近一直忙着android原生的开发,很久没有更新博客了,官方的sencha cmd工具功能非常强大,创建项目,压缩项目,打包安装程序都能轻松实现,这讲我们就给大家介绍下如何使用sencha cm ...

  3. <转>[WinForm] VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  4. [WinForm] VS2010发布、打包安装程序

    最近用到了VS2010WinForm的程序打包功能,网上发现一篇好帖,在此记录以供日后他人之需. 原文链接地址:http://www.mamicode.com/info-detail-2453.htm ...

  5. 003. vs2010发布、打包安装程序(转)

    本资源来自于网络 1.  在vs2010 选择“新建项目”à“ 其他项目类型”à“ Visual Studio Installerà “安装项目”: 命名为:Setup1 . 这是在VS2010中将有 ...

  6. [WinForm] VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  7. VS2010发布、打包安装程序

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

  8. vs2013打包安装程序

    安装扩展包Visual Studio Installer VS2013下默认是没有Visual Studio Installer的,需要安装对应的扩展包: 下载地址:VS2013安装向导扩展包下载 安 ...

  9. VS2010发布、打包安装程序(超全超详细)

    1. 在vs2010 选择“新建项目”→“ 其他项目类型”→“ Visual Studio Installer→“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1.“应 ...

随机推荐

  1. CodeForces ~ 996

    Allen has a LOT of money. He has nn dollars in the bank. For security reasons, he wants to withdraw ...

  2. Tensorflow函数:tf.zeros

    tf.zeros函数 tf.zeros( shape, dtype=tf.float32, name=None ) 定义在:tensorflow/python/ops/array_ops.py. 创建 ...

  3. 如何给cbv的程序添加装饰器

    引入method_decorator模块 1,直接在类上加装饰器 @method_decorator(test,name=‘dispatch’) class Loginview(view) 2,直接在 ...

  4. IOS safari 浏览器 时间乱码(ios时间显示NaN) 问题解决

    问题一: 项目中遇到一个关于日期时间在ios中乱码在安卓中安然无恙的问题,焦躁了半天 问题如上图,通过用户选择的时间和当天的天数相加然后在ios上就是乱码 这个界面运用了日期类型的计算,当我们用Jav ...

  5. Transport & Buffer

    Transport 传输API的核心是Channel接口,用于所有的出站操作. 每个Channel都会分配一个ChannelPipeline和ChannelConfig.ChannelConfig负责 ...

  6. 阿里云CentOS中vsftp安装、配置、卸载

    1--卸载 查看当前服务器中的vsftpdrpm -qa|grep vsftpd 例如结果为:vsftpd-2.2.2-13.el6_6.1.x86_64执行卸载rpm -e vsftpd-2.2.2 ...

  7. C语言——第三次作业(2)

    作业要求一 PTA作业的提交列表 第一次作业 第二次作业 一道编程题: 有一个axb的数组,该数组里面顺序存放了从1到a*b的数字.其中a是你大学号的前三位数字,b是你大学号的后四位数字,比如你的学号 ...

  8. 九度OJ-1112-导弹拦截-最长不增子序列

    题目1112:拦截导弹 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5218 解决:2603 题目描述: 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...

  9. 1.。net框架

    1..net框架结构 主要包含公共语言运行时(CLR)和框架类库(.NET Framework 类库 ,FCL) 2.CLR 1.对于一个将要面向.NET平台进行开发的人来说,了解一下.NET平台的整 ...

  10. js 下载文件的操作方法

    https://blog.csdn.net/zhoumengshun/article/details/71405963