2012年(366)
分类: 系统运维
2012-03-09 19:02:35
之前开发了一个Silverlight 5的OOB应用程序,但是在更新上遇到一种特殊情况。
OOB应用程序的更新方式承载在浏览器中的Silverlight应用程序可以自动更新,但是OOB应用程序可能处于安全性的看哦啊率却不能自动更新,需要调用一个检查更新的方法来手动执行更新。
首先为Application的CheckAndDownloadUpdateCompleted事件注册一个处理程序,如下:
_app = Application.Current; if (_app.IsRunningOutOfBrowser) _app.CheckAndDownloadUpdateCompleted += Application_CheckAndDownloadUpdateCompleted; .csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }然后在创建一个更新按钮,在按钮点击事件中添加检查更新的代码,如下:
private void button1_Click(object sender, RoutedEventArgs e) { if (_app.IsRunningOutOfBrowser && NetworkInterface.GetIsNetworkAvailable()) _app.CheckAndDownloadUpdateAsync(); }.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; } 当然,以上代码也可以放到页面加载事件中,让程序每次启动的时候都自动检查更新,但是最佳实践是,创建一套自动检查版本的机制,然后提示用户有更新,再运行上述代码。
最后,就是编写更新完成后的处理代码,如下:
void Application_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e) { if (e.Error != null) { if (e.Error is PlatformNotSupportedException) MessageBox.Show("App_NeedUpgradePlatform"); else MessageBox.Show("App_UpgradeError: " + e.Error.Message); return; } if (e.UpdateAvailable) MessageBox.Show("App_UpgradeCompleted"); else MessageBox.Show("App_NoUpdate"); }.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; } 这就是更新OOB应用程序的基本方法。
提升信任后的OOB应用程序更新MSDN文档中对于提升信任后的OOB应用程序的更新,有一个特殊说明,如下:
Silverlight 4 为运行具有提升的信任的浏览器外应用程序提供支持。受信任的应用程序不能使用本节中描述的更新机制,除非应用程序和更新都使用同样有效的、代码签名证书进行了签名。若要更新没有有效签名的受信任的应用程序,用户必须卸载旧版本并且手动安装新版本。有关更多信息,请参见。
这句话的意思就是,如果前后更新使用了不同签名文件,或者老版本没有签名,新版本进行了签名,这两种情况都会导致不能进行更新,需要卸载重装。
也就是这句话误导了我半天。
经历不能更新的特殊情况我开发的OOB应用程序一开始是可以进行更新的,后来不知为何不能进行更新了。寻找了各种原因,尝试了各种方法,推测了各种情况,都无果而终。
最后,我单独建立了一个测试项目来对比测试,在所有配置和代码都一样的情况却可以更新,让我开始考虑是否是Silverlight SDK有问题。在对比了整个项目的文件后,发现测试项目比正式项目少一个文件——InBrowserSettings.xml。这个文件其实是Silverlight 5提供的一个新特性,即在浏览器内提升信任功能生成的一个配置文件。
这个文件估计是什么时候,我尝试勾选”提升浏览器内信任“的选项的时候,生成的;于是我删除了InBrowserSettings.xml这个配置文件。还是问题依旧,不过感觉已经接近问题所在了。之前有过经验,一些配置信息之csproj中也会记录,所以打开csproj文件,发现里面有InBrowserSettingsFile和RequireInBrowserElevation节点;于是把这两个节点删除后,经测试就可以更新成功了。