WinForm程序创建证书签名安装发布自动更新全过程文档格式.docx
《WinForm程序创建证书签名安装发布自动更新全过程文档格式.docx》由会员分享,可在线阅读,更多相关《WinForm程序创建证书签名安装发布自动更新全过程文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![WinForm程序创建证书签名安装发布自动更新全过程文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/28/cabf4805-eefa-4930-bd42-9b010a8b76d0/cabf4805-eefa-4930-bd42-9b010a8b76d01.gif)
证书导出工具用于将.spc和.pvk文件导出为pfx证书文件。
导出时,会提示创建证书的密码
输入正确的密码后,出现导出向导界面,点击下一步,选择“是,导出密钥”,然后点击下一步,
出现证书类型选择界面,选择“个人信息交换-PKCS#12(.PFX)(P)”(只有这一种可选,并且其下面的选项均不选择),再点击下一步,
出现私钥保护密码选项,输入密码,然后点击下一步,在文本框中输入要生成的文件名(一般与证书名称一致),点击下一步
显示完成窗口,并显示导出证书的信息。
三、发布
(1)web浏览器发布应用程序
首先我给大家介绍一种很快捷的方法,不用在vs上面添加部署的那个项目。
也就是所谓的web浏览器发布应用程序。
还是和上面一样。
在所要发布的项目上面右击属性,选择publish属性
下图是应用程序再浏览器中的效果:
(2)添加安装、部署项目
右键点击整个解决方案添加安装项目。
如下图
接着就开始添加主要输出的文件,就是所谓打包的项目。
按照上面的步骤进入添加项目输出组窗口,如下图
接下来我来教你如何添加一个卸载程序
按照最上面的图片上显示的,添加一个输出的文件。
找到C:
\WINDOWS\system32目录下选择msiexec.exe文件。
将msiexec.ex添加到文件夹中后,给它增加一个快捷方式,改名为delete.exe。
之后修改delete.exe的属性Arguments为\x{6DCF3E96-7334-479D-B0B7-A36439E050C5},大括号中的数字是安装项目的ProductCode属性(查找此属性必须是左键选中安装项目,不是右键点击查找属性)。
之后生成安装项目。
待生成成功后,就可进行安装使用。
具体视图如下:
下面的是安装和卸载的视图。
四、手动更新
手动更新就是客户在使用的时候,可以随时到网上去查看是否有最新版本的软件。
下面是我的具体思路,已经得到实现:
1、写一个webservice,提供一个获取服务器xml中版本的数据的方法。
2、在WinForm应用程序启动的时候,首先访问webservice获取服务器的xml中的版本号,然后获取客户端的xml中的版本号。
将两个版本号比较,若服务器中的版本号大,则提示到指定网站进行手动下载更新。
手动更新在这里就不为大家介绍了。
下面详细说一下我最有收获的项目:
自动更新。
在自动更新里面含盖了上面的手动更新的所有步骤。
五、自动更新
自动更新的软件的目的在于让客户不在为了寻找最新软件花费时间。
也不用去到开发商的网站上查找。
客户端的软件自动会在程序启动前查找服务器上最新的版本。
和自己当前软件的版本比较,如果服务器的是最新版本。
客户端则进行自动下载、解压、安装。
当然了下载是要有网络的,并且用户可以根据提示去完成操作。
再也不用为找不到最新版本的软件而头疼。
下面是我的大体思路,已经得到了实现:
将两个版本号比较,若服务器中的版本号大,则提示提示可以在线更新应用程序。
3、然后客户端自动下载网络上的RAR压缩包到本机的指定位置,进行自动解压缩。
解压缩完毕之后,用进程打开所解压过的exe文件进行软件安装。
同时关闭客户端软件所在的进程。
(1)web项目中的代码
首先我给大家先展示下我的web项目中的webservice的代码,这里面跟简单,只有一个方法。
项目需要发布到IIS上面。
1.1webservice中的代码
///<
summary>
///获取xml中的软件最新版本
/summary>
returns>
<
/returns>
[WebMethod]
publicstringGetEdition(stringpassword)
{
strings=string.Empty;
//在使用此方法的时候必须先判断传进来的参数,看其是否有权限使用此方法。
if(password=="
clkj"
)
XDocumentdocument=XDocument.Load(Server.MapPath("
XMLEdition.xml"
));
XElementelement=document.XPathSelectElement("
Content/Project/Edition"
);
if(element!
=null)
s=element.Value.ToString();
}
returns;
1.2xml中的代码
Xml代码如下面所示,很简单
?
xmlversion="
1.0"
encoding="
utf-8"
?
>
Content>
<
Projectid="
p1"
Name>
test<
/Name>
Edition>
2.0<
/Edition>
/Project>
/Content>
(2)WinForm项目中的代码
Web项目的代码就只有上面的一点,重点的还是在WinForm中。
在WinForm中首先要添加web引用,将上述的webservice访问地址复制过来使用。
下面我一步一步来为大家解析吧。
第一步:
2.1xml中的代码
客户端的代码和服务器断的xml代码大致相同,不同的只用Edition元素里面的值。
-<
1.0<
2.2Program.cs代码(设置起始页的代码)
在Program.cs(WinForm中设置起始页的地方)这个类中添加代码
[STAThread]
staticvoidMain()
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
LoadMath();
privatestaticvoidLoadMath()
//服务器上的版本号
stringNewEdition=string.Empty;
//应用程序中的版本号
stringOldEdition=string.Empty;
try
//获取webservice上的版本号
myService.WebServiceUpdateSoapClientc=newmyService.WebServiceUpdateSoapClient();
NewEdition=c.GetEdition("
clkj_ws"
catch(Exceptionex)
MessageBox.Show(ex.Message);
//获取系统中xml里面存储的版本号
XDocumentdocument=XDocument.Load("
OldEdition=element.Value.ToString();
catch(Exceptionexx)
MessageBox.Show(exx.Message);
doublenewE=double.Parse(NewEdition);
doubleoldE=double.Parse(OldEdition);
//比较两个版本号,判断应用程序是否要更新
if(newE>
oldE)
//更新程序¨
°
DialogResultdr=MessageBox.Show("
发现新的版本是否要更新该软件"
"
系统提示?
"
MessageBoxButtons.OKCancel,MessageBoxIcon.Information);
if(dr==DialogResult.OK)
//打开下载窗口
Application.Run(newDownUpdate());
else
//若用户取消,打开初始界面
Application.Run(newLogin());
2.3Main.cs(登录后的主界面)的代码
这个可以省略,没有实际意义
2.4DownUpdate.cs(更新页面)的代码
界面显示如下图
自动更新代码如下(其中更新按钮的name为btnDown,安装按钮的name为btnInstall):
//debug目录,用于存放压缩文件t
stringpath=Application.StartupPath;
publicDownExe()
InitializeComponent();
privatevoidDownExe_Load(objectsender,EventArgse)
btnInstall.Enabled=false;
//下载文件、自动解压缩文件
privatevoidbtnDown_Click(objectsender,EventArgse)
//自动下载压缩包,并且解压,最后关闭当前进程,进行安装
//设置进度条
List<
int>
resultList=newList<
();
for(inti=0;
i<
100;
i++)
resultList.Add(i);
//设置进度条的最大值和最小值
this.progressBar1.Maximum=resultList.Count;
this.progressBar1.Minimum=0;
foreach(intiteminresultList)
//下载压缩包
System.Net.WebClientclient=newSystem.Net.WebClient();
client.DownloadFile(@"
http:
//192.168.1.120/File/setup.rar"
path+@"
setup.rar"
this.progressBar1.Value++;
catch
MessageBox.Show("
当前没有网络或者文件地址不正确"
if(!
Exists())
不支持RAR解压缩"
return;
//解a压1
unCompressRAR(path+"
\\setup"
path,"
false);
btnInstall.Enabled=true;
btnDown.Enabled=false;
//打开下载好的exe文件,并且关闭当前客户端所在的进程
privatevoidbtnInstall_Click(objectsender,EventArgse)
if(File.Exists(path+@"
\setup\cboxbeta2.0.0.7.exe"
))
//打开下载好的exe文件
Process.Start(path+@"
//关闭当前进程
Process[]proce=Process.GetProcesses();
foreach(Processpinproce)
//当前运行软件的进程名字
if(p.ProcessName=="
TestAutoUpdate.vshost"
p.Kill();
break;
///解压缩文件t
paramname="
unRarPatch"
解压缩后的文件所要存放的路径?
/param>
rarPatch"
rar文件所在的路径<
rarName"
rar文件名<
deleteFlag"
publicstaticstringunCompressRAR(stringunRarPatch,stringrarPatch,stringrarName,booldeleteFlag)
RegistryKeykey=Registry.LocalMachine.OpenSubKey(@"
SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\WinRAR.exe"
stringstr=key.GetValue("
).ToString();
key.Close();
System.IO.Directory.Exists(unRarPatch))
System.IO.Directory.CreateDirectory(unRarPatch);
stringstr2="
x\"
+rarName+"
\"
\"
+unRarPatch+"
+"
-y"
;
ProcessStartInfoinfo=newProcessStartInfo();
info.FileName=str;
info.Arguments=str2;
info.WindowStyle=ProcessWindowStyle.Hidden;
info.WorkingDirectory=rarPatch;
Processprocess=newProcess();
process.StartInfo=info;
process.Start();
process.WaitForExit();
process.Close();
if(deleteFlag&
&
System.IO.File.Exists(rarPatch+@"
+rarName))
System.IO.File.Delete(rarPatch+@"
+rarName);
catch(Exceptionexception)
throwexception;
returnunRarPatch;
///判读是否支持RAR自动解压缩
publicstaticboolExists()
return!
string.IsNullOrEmpty(Registry.LocalMachine.OpenSubKey(@"
).GetValue("
).ToString());