2022年11月

VS2019 制作Setup Project详细教程

对于windows平台,可以使用Visual Studio 提供的Setup Project 来制作程序的安装包。本教程主要介绍VS2019如何安装Setup Project功能;如何使用Setup Project;如何自定义Setup Project界面。

运行环境:Visual Studio 2019

一、 Visual Studio 2019 如何安装Setup Project

Visual Studio 2019 默认是不自动安装Setup Project的,所以需要通过扩展来进行下载安装。具体步骤如下:

  1. 打开任意一个项目工程,点击菜单【扩展】=》【管理扩展】

  2. 在联机模块里面搜索“Microsoft Visual Studio Installer Projects”。

在这里插入图片描述

  1. 点击下载安装。

在这里插入图片描述

  1. 安装完毕重启Visual Studio 2019. 点击新建项目,选择Setup Project选项。

在这里插入图片描述

在这里插入图片描述

二、如何使用Setup Project

1. 设置项目属性

点击项目工程,则可以在属性面板中看到该项目的相关属性信息,我们可以通过该面板设置项目的名称、作者、描述等信息。同时也需要设置项目运行前需要的运行环境库如.net库。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 添加项目打包文件,桌面快捷方式等

点击项目工程,右键【view】=》【文件系统】。可以将项目打包的文件拖到Application Folder下面,桌面快捷方式添加到User’s Desktop下面,开始菜单快捷方式添加到User’s Programs Menu下面。

在这里插入图片描述
这里需要注意,可以设置默认安装路径,并且此处的Property中的TARGETDIT为该安装路径的标识号,在编写自定义操作的时候会用到。

在这里插入图片描述
可以为快捷方式设置图标

3. 添加注册表

点击项目工程,右键【view】=》【注册表】。可以将软件需要的注册表信息添加进去。

在这里插入图片描述

4. 添加用户界面

点击项目工程,右键【view】=》【用户界面】。可以添加用户需要的界面,Visual Studio提供了一系列的界面模板。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意这里的属性标识号LOCALIP.

5. 添加 Custom Action

  1. 添加一个C#类库工程
    在这里插入图片描述
    在这里插入图片描述

  2. 添加Installer类
    在这里插入图片描述
    在这里插入图片描述

  3. 编写自定义的代码,这里我们可以通过this.Content.Parameters[“Key”],来获取安装界面的中的安装路径和本地IP地址。
    在这里插入图片描述

  4. 在Setup Project中添加项目输出,选择上面的C#类库
    在这里插入图片描述
    在这里插入图片描述

  5. 添加自定义操作,关联已经导入的项目输出。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  6. 最后需要关联用户界面的变量和实现类的变量
    在这里插入图片描述

6. 生成安装程序

最后点击生成即可生成安装程序。


有时会出现卸载软件后残留开始菜单与桌面图标问题(只是极其个别电脑,但这种现象存在),还有的就是在更改几次安装程序后原安装程序的残留信息,某些情况下会对新生成的安装文件运行产生干扰,因此需要在新安装程序运行时强制删除残留信息(不是卸载,已经卸载过)。现将解决这些小问题的思路整理如下:
1)开始菜单及桌面图标残留
可以用LaunchAppAndWait来运行cmd进行文件夹及文件的删除,也可以用IS自带的DeleteProgramFolderDeleteFolderIcon进行显示删除,这里记住几个常量以对特殊文件夹路径进行读取
WINSYSDIRSystemFolder读取%windir%\system32文件夹(c:\windows\system32)
WINDIRWindowsFolder读取%windir%文件夹(c:\windows)
FOLDER_DESKTOPDesktopFolder读取桌面文件夹
INSTALLDIRTARGETDIR读取文件安装路径
FOLDER_PROGRAMSProgramMenuFolder读取程序菜单文件夹
@PRODUCT_NAME获取安装程序名称
@PRODUCT_GUID获取安装程序的ID
一般来说这几个常量就能够满足我们的操作了,如果还要了解更多,可以在<ISProductFolder>\Script\isrt\Include\SysVars.h<ISProductFolder> Script\iswi\Include\SysVarsConv.h,记不住?IS的安装文件里面搜.h文件,找一个你知道的关键字,总不会记一个关键字也难吧?
因此DeleteFile ( FOLDER_DESKTOP^@PRODUCT_NAME+".lnk" );DeleteProgramFolder ( FOLDER_PROGRAMS^@PRODUCT_NAME );这两句话加在OnMaintUIAfter()里就可满足清除残留图标的要求了。
2)自定义快捷方式
IS自带有向导来让你指定快捷方式及其图标,但是这样一来必须把你指定的每一个图标作为一个资源强加载到安装程序中,在%windir%\Installer\[ProductCode]文件夹内生成NEXEICO文件,二来也不能根据系统本身的情况作出适当调整,比如你有几个WORD文档,几个TXT文档和几个PDF文档,那么你用指定快捷方式向导的话你就得在上述文件夹内生成N个图标程序,而不管是否它们中几个文件类型是相同的,更别说某些用户系统类对该类文档的解析程序可能不同,它们的文件图标也可能根本跟你指定的不一样。对于这个问题,当然最灵活的方式就是用脚本添加快捷方式了。
完全从脚本添加快捷方式:
CreateProgramFolder ( @PRODUCT_NAME );
然后AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir,
szIconPath, nIcon, szShortCutKey, nFlag);
就可以添加快捷方式到相应的位置了,使用时请注意用LongPathToQuote处理有空格的路径。这里有一点麻烦的就是查找已知文件的图标关联,起初我想的是找到相应的解析程序,然后从其应用程序里面提取图标。在IS里面调用一个批处理来获得该EXE路径,以查找PDF相应关联程序为例:
批处理脚本:
@echo off
setlocal enabledelayedexpansion
echo "%1"
for /f "tokens=2 delims==" %%i in ('assoc .pdf') do (
for /f "tokens=2 delims==" %%j in ('ftype %%i') do (
set "strPath=%%j"
set strPath=!strPath: "%%1"=!
echo !strPath!
echo !strPath!>"%1"
)
)

IS相应脚本:
szBATFile = SUPPORTDIR^"getPath.bat";
szTXTFile = FOLDER_TEMP^"PDFRdr.txt";
LongPathToQuote( szBATFile, TRUE );
LongPathToQuote( szTXTFile, TRUE );
LaunchAppAndWait ( szBATFile , szTXTFile , LAAW_OPTION_HIDDEN|LAAW_OPTION_WAIT );
if ( FindFile ( FOLDER_TEMP , "PDFRdr.txt" , svResult ) = 0 ) then
OpenFileMode ( FILE_MODE_NORMAL );
OpenFile ( nvFileHandle , FOLDER_TEMP , svResult );
GetLine ( nvFileHandle , svExePath );
CloseFile ( nvFileHandle );
endif;
if ( StrCompare ( svExePath , "" ) = 0 ) then
MessageBox ( "当前未查到有任何PDF阅读软件", SEVERE );
else
MessageBox ( svExePath, INFORMATION );
endif;
将获得的应用程序图径代入AddFolderIcon,作为图标路径。结果发现诸如PDF文档的图标未必就在EXE里面,FoxitReader的图标在EXE文件里,可AdobeExe里面只有一个图标,PDF文档图标根本没有,没办法,还只有从注册表一途来查找了:
/*****************************
*取得系统PDF文件关联类型图标
*****************************/
function STRING GetPDFIcon()
NUMBER nStart, nvType, nvSize;
STRING szStart;
STRING svResult, svValue, svKey;
STRING svIconPath;
NUMBER nvIconIndex;
begin
RegDBSetDefaultRoot ( HKEY_CLASSES_ROOT );
svKey = ".pdf";
if ( RegDBKeyExist ( svKey ) = 1 ) then
RegDBGetKeyValueEx ( svKey , "" , nvType , svValue , nvSize );
svKey = svValue;
if ( RegDBKeyExist ( svKey ) = 1 ) then
//子键存在,查找DefaultIcon,如果有,读取,如果没有,读取它的Version,再读注册表
if ( RegDBKeyExist ( svKey + "\\DefaultIcon" ) = 1 ) then
RegDBGetKeyValueEx ( svKey + "\\DefaultIcon" , "" , nvType , svValue, nvSize );
return svValue;
else
//未发现关联类型的DefaultIcon,则查找其CurVer,查其版本号
if ( RegDBKeyExist ( svKey + "\\CurVer" ) = 1 ) then
RegDBGetKeyValueEx( svKey + "\\CurVer", "" , nvType, svValue, nvSize );
svKey = svValue;
if ( RegDBKeyExist ( svKey ) = 1 ) then
if ( RegDBKeyExist ( svKey + "\\DefaultIcon" ) = 1 ) then
RegDBGetKeyValueEx( svKey + "\\DefaultIcon" , "" , nvType, svValue, nvSize );
return svValue;
else
return "";
endif; //endif check ICON value
else
return "";
endif; //endif check CurVer value
else
return "";
endif; //endif check CurVer Exist
endif; //endif check DefaultIcon Exist
endif; //end if check .pdf filetype exist
endif; //endif check .pdf key exist
end;

然后在OnFirstUIAfter()里面调用该函数取得文件关联路径:
//查找PDF文件关联,并取得关联类型图标
svDefaultIcon = GetPDFIcon();
if ( StrCompare ( svDefaultIcon , "" ) != 0 ) then
nStart = StrFind ( svDefaultIcon , "," );
if ( nStart > 0 ) then
StrSub ( svPDFIconPath , svDefaultIcon , 0 , nStart );
StrSub ( svPDFIconIndex , svDefaultIcon , nStart+1 , 10 );
//MessageBox ( "图标路径为:" + svPDFIconPath + " 索引号为:" + svPDFIconIndex , INFORMATION );
endif;
StrToNum ( nvPDFIconIndex , svPDFIconIndex );
else
svPDFIconPath = WINSYSDIR^"shell32.dll";
nvPDFIconIndex = 0;
endif;
svResult = "";
nvResult = FindAllFiles ( INSTALLDIR , "*.pdf" , svResult , RESET );
while ( !nvResult )
LongPathToQuote ( svResult , TRUE );
ParsePath ( svPDFFileName , svResult , FILENAME_ONLY );
AddFolderIcon ( FOLDER_PROGRAMS^@PRODUCT_NAME ,
svPDFFileName ,
svResult ,
"" ,
svPDFIconPath , nvPDFIconIndex ,
"" ,
REPLACE );
nvResult = FindAllFiles ( INSTALLDIR , "*.pdf" ,svResult , CONTINUE );
endwhile;

最后,添加卸载的快捷方式,就基本上大功告成了。
//添加卸载快捷方式
nStart = StrFind ( UNINSTALL_STRING , ".exe" );
if ( nStart >= 0 ) then
StrSub ( szUninstPath , UNINSTALL_STRING , 0 , nStart+4 );
LongPathToQuote ( szUninstPath , FALSE );
StrSub ( szUninstParam, UNINSTALL_STRING , nStart+4 , 200 );
LongPathToQuote ( szUninstParam, FALSE );
endif;
AddFolderIcon ( FOLDER_PROGRAMS^@PRODUCT_NAME ,
"卸载" + @PRODUCT_NAME ,
"\"" + szUninstPath + "\"" + szUninstParam ,
"" ,
INSTALLDIR^"Uninstall.ico" ,
0 ,
"" ,
REPLACE );

3)残留安装信息的删除
目前就发现一个IS的安装信息在[ProgramFilesFolder]\InstallShield Installation Information\[ProcuctCode][WindowsFolder]\Installer\[ProductCode]里面有相关的文件,于是安装之前先检测此两处文件夹是否存在,清除之,避免残留信息的干扰。
/*****************************
*旧版残留信息清除
*****************************/
function NUMBER DealOldEdition()
STRING szPath;
begin
//删除InstallSheild Installation Information信息
szPath = PROGRAMFILES^"InstallShield Installation Information"^PRODUCT_GUID;
if ( ExistsDir ( szPath ) = 0 ) then
if (LaunchAppAndWait( WINSYSDIR^"cmd.exe", "/c rd /s/q \""+szPath+"\"", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN) = 0) then
//MessageBox( "删除文件夹"+szPath+"成功", INFORMATION );
else
return 0;
//MessageBox( "删除文件夹"+szPath+"失败", INFORMATION );
endif;
endif;
//删除Installer信息
szPath = WINDIR^"Installer"^PRODUCT_GUID;
if ( ExistsDir ( szPath ) = 0 ) then
if (LaunchAppAndWait( WINSYSDIR^"cmd.exe", "/c rd /s/q \""+szPath+"\"", LAAW_OPTION_WAIT | LAAW_OPTION_HIDDEN) = 0) then
//MessageBox( "删除文件夹"+szPath+"成功", INFORMATION );
else
return 0;
//MessageBox( "删除文件夹"+szPath+"失败", INFORMATION );
endif;
endif;
return 1;
end;

编程资料汇----大部分文档转自网络,只供个人备忘使用,如有冒犯,请来信或者留言说明,会在第一时间内删除。


推荐的是几个优质的DevOps开源工具

Jpom

Jpom是一个简而轻的低侵入式在线构建、自动部署、日常运维、项目监控软件。当项目出现问题时,可以能够通过Jpom即时排查问题,问题解决后还可以直接上传修改后的Jar,项目的堆栈信息,服务器CPU、内存使用情况一目了然,不必再登录服务器管理。

项目地址:github.com/dromara/Jpom

choerodon

猪齿鱼Choerodon全场景效能平台,提供体系化方法论和协作、测试、DevOps及容器工具,帮助企业拉通需求、设计、开发、部署、测试和运营流程,一站式提高管理效率和质量。从团队协同到DevOps工具链、从平台工具到体系化方法论,猪齿鱼全面满足协同管理与工程效率需求,贯穿端到端全流程,助力团队效能更快更强更稳定。

项目地址:github.com/open-hand/ch

spug

面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布、任务计划、配置中心、监控、报警等一系列功能。

项目地址:gitee.com/openspug/spug

walle-web

walle 让用户代码发布终于可以不只能选择 jenkins!支持各种web代码发布,php、java、python、go等代码的发布、回滚可以通过web来一键完成。walle 一个可自由配置项目,更人性化,高颜值,支持git、多用户、多语言、多项目、多环境同时部署的开源上线部署系统。

项目地址:github.com/meolu/walle-

zadig

Zadig 是一款面向开发者设计的云原生持续交付(Continuous Delivery)产品,具备高可用 CI/CD 能力,提供云原生运行环境,支持开发者本地联调、微服务并行构建和部署、集成测试等。

项目地址:gitee.com/koderover/zad

Gokins

Gokins一款由Go语言和Vue编写的款轻量级、能够持续集成和持续交付的工具。作为一个可扩展的自动化服务器,Gokins 可以用作简单的 CI 服务器,或者变成任何项目的持续交付中心。

项目地址:gitee.com/gokins/gokins

ks-devops

KubeSphere 愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成,支持云原生应用在多云与多集群的统一分发和运维管理。

项目地址:gitee.com/kubesphere/ks


发布于 2022-03-27 11:50


今天老李给大家整理28张数据分析的知识地图,话不多说,直接上图:

大招:数据分析流程地图

内含数据分析12个常见分析模型、18个理论分支、136个详细知识要点和60多个实际分析场景案例,不懂或不记得的知识点拿出地图就能查,图片会压缩,高清电子版获取方式↓↓,大家按需自取

点击下载,数据分析流程知识地图(高清电子版)www.fanruan.com/resource/169?utm_source=media&utm_medium=zhihu&utm_campaign=lqf&utm_term=nryx_8

1、数据分析步骤地图


2、数据分析基础知识地图



3、数据分析技术知识地图



4、数据分析师能力体系



5、数据分析思路体系



6、数据分析核心主题



7、数据科学技能书知识地图



8、数据挖掘体系



9、python学习路径



10、B端数据分析地图



11、RFM分析体系



12、线下店铺数据分析



13、小程序数据分析



14、用户分析



15、用户画像法



16、Excel常用公式



17、Excel透视表



18、数据分析图表



19、MySQL



20、统计学




网传的圈外同学知识地图和未来发展力地图,原文件很大,内容还是有些干货的,整理了对应的思维导图,稍加导读:


知识地图主要是按四个大类准备了一些工具表/清单并说明何时用怎么用


自我认识发展

工作

人际沟通表达

学习思考

未来发展力地图主要是在八类能力上介绍了不同模型,每类五个。很多工具模型还是比较耳熟能详的,汇总在一起学习理解,真的能够结合实践应用的话应该还是对个人能够有所提高的。


1.在学习力方面,


通过学习金字塔模型,可以在被动学习+主动学习的基础上找到最有效的学习方法;

想彻底掌握新知识可以采用费曼技巧实现;

想针对性提高某种技能/能力,可以采用刻意练习的方法进行有效训练;

想通过阅读有更高效的提升,可以参考RIA阅读法;

想快速掌握技能时,可参考二八定律集中精力在最关键的20%核心内容上。

2.在思考力方面,


思考问题时采用黄金圈法则探究事物本质;

面对复杂问题是可从5W1H来全面分析;

全面思考事情可用思维导图画出相关要素逐条分析;

用SWOT模型盘点自身优劣及外界环境;

做长远决策时要用10/10/10法则提问10分钟/10个月/10年后的看法。

3.在创造力方面,


用六顶思考帽进行团队会议;

需要更多创意创新时进行头脑风暴;

正向思考难以继续可以采用逆向思维;

思考新想法时可以通过类比思维找到新灵感;

需要改进现有产品模式时用SCAMPER创新思维模型思考。

4.在设计力方面,


需要解决特定问题可以用设计思维寻找创新方案;

面对多种选择时构建MVP最小可行方案做出正确决策;

需要设计/优化用户体验时参考峰终定律找到重点优化的地方;

参考AARRR漏斗模型思考产品的用户全生命周期;

想设计一款爆品可应用上瘾模型。

5.在共情力方面,


通过五大圈层模型深入了解一个人;

用高效倾听模型SOFEN技巧认真倾听别人诉说;

用情绪ABC模型检查是否有受事件影响的负面情绪;

沟通不顺时用乔哈里视窗及时调整回到公开区;

用冰山模型分析更好的认识自己或他人。

6.在故事力方面,


参考故事五要素构思一个好故事;

用SCQA模型快速组织语言内容临场发言;

参考STAR模型构思一个最简版的故事;

参考STORY模型系统评价一个故事;

参考英雄之旅模型构思一个情节跌宕起伏的长故事。

7.在领导力方面,


在职业发展过程中用领导力梯队模型认识自己的现状和目标发现差距并提高;

针对不同阶段的下属应用情境领导力模型采用不同的领导模式;

用GROW教练模型帮助别人或辅导下属;

采用管理4C模型提升团队执行力;

用TOPIC模型排查团队管理难题的要素问题。

8.在整合力方面,


资源有限时参考杠杆思维思考应在何处投入;

参考POA行动找到在何处下手来提升团队执行力;

遇到问题用系统思维全面思考;

面对两种对立观点时用整合思维模型取长补短找到解决方案;

在认识/思考/分析/决策时通过多元思维模型带来多学科视角。






更多思维导图,请移步:


Dale Dai:思维导图整理:人生+思维+写作zhuanlan.zhihu.com


————————————————

版权声明:本文为CSDN博主「weixin_39630762」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_39630762/article/details/112770370