110,534
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using App1;
using App2;
// 凡是和 ClickOnce 部署有关的类都位于 System.Deployment.Application 命名空间下
using System.Deployment.Application;
namespace AppMain
{
public partial class frmMain : Form
{
// InPlaceHostingManager类,它可以实现实时下载安装应用程序包
InPlaceHostingManager appDown1 = null;
InPlaceHostingManager appDown2 = null;
// uris 提供统一资源标识符 (URI) 的对象表示形式和对 URI 各部分的轻松访问。
Uri app1Uri, app2Uri;
public frmMain()
{
InitializeComponent();
/* app1 和 app2 是 AppMain 的 Properties 中“设置”里的两个信息。应用程序设置允许动态地存储和检索应用程序的属性和其他信息。
* 例如,应用程序可以保存用户的颜色首选项,然后在下次运行时检索它们。*/
app1Uri = new Uri(AppMain.Properties.Settings.Default.app1);
app2Uri = new Uri(AppMain.Properties.Settings.Default.app2);
// 创建 InPlaceHostingManager 的一个新实例以下载和安装指定的应用程序,该应用程序可以是基于 Windows 窗体的独立应用程序,也可以是承载在 Web 浏览器中的应用程序。
appDown1 = new InPlaceHostingManager(app1Uri, false);
appDown2 = new InPlaceHostingManager(app2Uri, false);
}
private void frmMain_Load(object sender, EventArgs e)
{
// 开始下载第一个应用程序
// public event EventHandler<GetManifestCompletedEventArgs> GetManifestCompleted; 部署清单已下载到本地计算机时发生。
appDown1.GetManifestCompleted += appDown1_GetManifestCompleted;
// 在后台下载 ClickOnce 应用程序的部署清单,并在操作完成或遇到错误时引发事件。
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
{
// AssertApplicationRequirements 确定 ClickOnce 应用程序是否具有合适的权限和平台依赖项,以便在本地计算机上运行。
// 参数: grantApplicationTrust: 如果为 true,应用程序将尝试将其权限提升至所需级别。
appDown2.AssertApplicationRequirements(true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
// public event EventHandler<DownloadProgressChangedEventArgs> DownloadProgressChanged; 更改应用程序或清单下载状态时发生。
appDown2.DownloadProgressChanged += appDown2_DownloadProgressChanged;
// public event EventHandler<DownloadApplicationCompletedEventArgs> DownloadApplicationCompleted; 应用程序向本地计算机下载完成时发生。
appDown2.DownloadApplicationCompleted += appDown2_DownloadApplicationCompleted;
// 在后台下载应用程序更新。
// 异常: System.InvalidOperationException:
// 在 System.Deployment.Application.InPlaceHostingManager.GetManifestAsync()
// 和 System.Deployment.Application.InPlaceHostingManager.AssertApplicationRequirements()
// 方法之前调用此方法时引发。
appDown2.DownloadApplicationAsync();
}
void appDown2_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)
{
lblSecond.Text = "下载完成。";
}
void appDown2_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// e.ProgressPercentage 获取异步任务的进度百分比。返回结果: 指示异步任务进度的百分比值。
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;
}
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() + "字节。";
}
}
}