ClickOnce部署(4):下载多个安装包

有时候,我们可能会一次性发布多个安装包,当然在网页上多加几个链接让用户逐个安装也是可取的。不过,也可以弄得更方便些,即用户先安装一个,作为一个"引导程序",然后通过这个程序去下载安装其他应用程序。

我们还是说说真实的例子,这样好理解一点。假设我开发了两个应用程序,一个叫App1,另一个叫App2。我把这两个应用程序同时发布。

我们可以在IIS服务器的根目录下新建两子目录,我们分别把这两个应有程序发布到这两个文件夹下,如下面两张截图所示。

第一个应用

第二个应用

最后,重点是如何做这个"引导"安装包,即我们通过这个应用程序来下载前面两个应用来安装。

别急,在开工之前,我想让大家背书,不多,小学生也能背下来的,总共就两句话:

第一句:凡是和ClickOnce部署有关的类都位于System.Deployment.Application命名空间下。

第二句:开菜单——做菜——试菜——开饭。

第一句话就不用解释了,如果你不明白说明你还没入门。我们把重点放在第二句话,这句话可能大家觉得很搞笑,怎么好像在做饭啊? 是啊,"民以食为天",做饭很重要。

这里说的是做这个"引导"安装应用的步骤,我们要用到InPlaceHostingManager类,它可以实现实时下载安装应用程序包,不要问我这个类在哪里,前面叫你背了第一句话。

InPlaceHostingManager类使 用按以下几步。

第一、new一个InPlaceHostingManager对象,这是废话。构造函数中我们要传 一个URI,部署清单的URI,打包ClickOnce后,那个以.application后缀结尾的文件就是。

第二、开菜单。调用GetManifestAsync方法获取清单,获取后,无论成功与否会引发GetManifestCompleted事件,所以在调用方法前要为GetManifestCompleted事件附加处理代码,这是基础知识,估计我不必解释了。

第三、做菜。调用AssertApplicationRequirements方法检查一下你有没有这个权限,要明白自己是吃几碗饭的,如果权限不够会引发异常,如果力所能及,方法调用后一切正常。一个bool类型的参数表示当权限不足时是否尝试提升,你懂的。

如果权限检查通过,调用DownloadApplicationAsync方法就可以下载应用程序了,在这过程中会引发DownloadProgressChanged和DownloadApplicationCompleted,这两个事件我不说了,你知识怎么处理了,和使用BackgroundWorker一样,如果你不懂,请回家好好细读《C#入门经典》。

第四、试菜。打开"开始"菜单或"开始"屏幕,看看有没有新安装应用的快捷方式,如果有,那就下载安装成功了。

第五、吃饭。尽情享用吧。

好吧,光说不行,还是要做一做。

界面是包括两个Label和两个ProgressBar,标签用来显示文本,进度条当然表示下载的进度。

然后处理Form的Load事件,启动对App1和App2项目的安装包的下载和安装。

public partial class Form1 : Form

{

InPlaceHostingManager appDown1 = null;

InPlaceHostingManager appDown2 = null;

// uris

Uri app1Uri, app2Uri;

public Form1()

{

InitializeComponent();

app1Uri = new Uri(AppMain.Properties.Settings.Default.app1);

app2Uri = new Uri(AppMain.Properties.Settings.Default.app2);

appDown1 = new InPlaceHostingManager(app1Uri, false);

appDown2 = new InPlaceHostingManager(app2Uri, false);

}

private void Form1_Load(object sender, EventArgs e)

{

// 开始下载第一个应用程序

appDown1.GetManifestCompleted += appDown1_GetManifestCompleted;

appDown1.GetManifestAsync();

// 开始下载第二个应用程序

appDown2.GetManifestCompleted += appDown2_GetManifestCompleted;

appDown2.GetManifestAsync();

}

void appDown2_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e)

{

if (e.Error != null)

{

MessageBox.Show(e.Error.Message); return;

}

lblSecond.Text = "即将下载" + e.ProductName + "," + e.Version.ToString();

try

{

appDown2.AssertApplicationRequirements(true);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message); return;

}

appDown2.DownloadProgressChanged += appDown2_DownloadProgressChanged;

appDown2.DownloadApplicationCompleted += appDown2_DownloadApplicationCompleted;

appDown2.DownloadApplicationAsync();

}

void appDown2_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)

{

lblSecond.Text = "下载完成。";

}

void appDown2_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)

{

this.progressbarSecond.Value = e.ProgressPercentage;

this.lblSecond.Text = "已下载" + e.BytesDownloaded.ToString() + "字节,共" + e.TotalBytesToDownload.ToString() + "字节。";

}

void appDown1_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e)

{

if (e.Error != null)

{

MessageBox.Show("出错:" + e.Error.Message); return;

}

this.lblFirst.Text = "即将下载" + e.ProductName + "," + e.Version.ToString();

try

{

appDown1.AssertApplicationRequirements(true);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

return;

}

appDown1.DownloadProgressChanged += appDown1_DownloadProgressChanged;

appDown1.DownloadApplicationCompleted += appDown1_DownloadApplicationCompleted;

appDown1.DownloadApplicationAsync();

}

void appDown1_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)

{

lblFirst.Text = "下载完成。";

}

void appDown1_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)

{

this.progressbarFirst.Value = e.ProgressPercentage;

this.lblFirst.Text = "已下载" + e.BytesDownloaded.ToString() + "字节,共" + e.TotalBytesToDownload.ToString() + "字节。";

}

}

而应用安装包的下载地址,我们放到配置文件中,以便修改。

打开项目属性窗口,切换到"设置"选项卡,然后输入App1的下载地址是http://localhost/App1/App1.application;App2的下载地址是http://localhost/App2/App2.application

VS会为我们生成相应的属性,如上面代码中,我们通过当前应用程序所在的程序集中的.Properties.Settings.Default.app1就可以得到app1的值。

两个应用项目,加上这个用来安装其他应用包的程序,共三个,把它们都发布到指定的路径下。

用来引导的应用就放到根目录,用户只需安装这个就可以了,然后利用这个应用程序来安装其他两个。

App1放到/App1下。

App2放到/App2下。

发布完成后,IIS的根目录如下。

然后安装根目录下的"引导"包。安装后运行应用程序,就会自动下载另外两个安装包并自动安装。

安装完成了,然后打开"开始"菜单或"开始"屏幕,就能看到三个应用程序了。

时间: 2024-08-24 09:31:03

ClickOnce部署(4):下载多个安装包的相关文章

如何离线下载Chrome的安装包

打开Chrome官网(自行搜索)点击下载后下载的是联网安装包,这对部分上网不方便的用户造成了一定的麻烦. http://www.google.cn/chrome/browser/desktop/index.html 我们在该网页链接的后面加上?standalone=1就可以下载到离线安装包,这是最新稳定版的离线安装包 在此总结一下: 最新稳定版:https://www.google.com/intl/zh-CN/chrome/browser/?standalone=1 最新测试版:https:/

Wix 安装部署教程(十三) -- 多语言安装包

这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下面我说一说步骤.共4步. 1.设置WixLocalization文件. Wxl文件就相当于应用程序的资源文件.让我们根据不同的语言来编写不同的文本内容. 例如我们新建一个WixUI_zh-cn.wxl ,来处理简体中文. <WixLocalization Culture="zh-cn"

微软MSDN订阅用户已可提前手工下载Windows 10安装包

在Windows 10发布之夜,当全世界都在翘首以盼Windows 10免费发布推送的到来,MSDN订阅用户可以立马享受一项令人项目的特殊待遇:手工下载Windows 10完整安装包+免费使用的激活密钥! 作为MSDN订阅用户,如果你现在登陆MSDN Subscription网站,就能看到如下Windows 10安装选项 以Windows 10 企业版为例,你可以点击Download直接下载3.75G的ISO安装包,或点击Product Keys获得一个免费的激活密钥.

下载完apk安装包后实现自动安装;

需配置的权限: <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />     <uses-permission android:name="android.permission.MOUNT_UNM

如何下载chrome离线安装包

最新稳定版:https://www.google.com/intl/zh-CN/chrome/browser/?standalone=1 最新测试版:https://www.google.com/intl/zh-CN/chrome/browser/?standalone=1&extra=betachannel 最新开发版:https://www.google.com/intl/zh-CN/chrome/browser/?standalone=1&extra=devchannel 有时候我们

如何下载VS2015离线安装包

进入微软VS官网,下载页只有在线安装的选项,没有离线安装的包可以直接下载.以前的解决方法是去查找下载ISO格式的包. 其实没有必要这么麻烦. 在线安装的这个小程序,同样具有下载软件包而不安装的功能.那就是在命令行上执行它,并添加 /layout参数.(官网上的帮助说明可以查到,仔细阅读官网确实管用.) 剩下一个问题.VS2015社区版虽然是免费的,但是需要联网激活,不联网的机器如何激活呢?希望有经验的同学指路. 版权声明:本文为博主原创文章,未经博主允许不得转载.

mysql官网下载源码安装包

ruby+watir 集成Eclipse 自动化安装部署及语法,附全安装包

关于Watir的安装文章网上一大堆,但真正靠谱的没有几个,不是报错就是安装包不对.我开始也是初哥,用了近一个星期才总结出来一套完整的安装理论,共享一下往大家可以从中可以少走一些弯路.本文提供全量安装包下载,包括:ruby + watri 自动化部署集成Eclipse 全量安装包 (包括:watir-1.5.4.ruby186-26.WatirRecorder_Setup_lite.dltk-core-ruby.dotnetfx.rubygems-1.3.7.安装说明. 安装说明:1. 安装 ru

部署AWStats日志分析系统与优化(附安装包)

介绍 AWStats是使用Perl语言开发的一款开源日志分析系统,可以分析apache,samba,vsftpd,iis等服务的日志信息,结合crond等计划任务,可以对不断增长的日志内容定期进行分析. 它可以帮助我们直观的图形化的,图形化的!看到原本繁杂的日志文件.这篇文章就使用一个简单的apache服务来演示如何部署AWStats日志分析系统. 环境 VMware Workstation 14 pro 测试机型 redhat6.5 IP:192.168.10.100 win10 IP:192