上文说到把服务器代码加载到了本地下面代码就获取保存在本地配置文件:
//获取本地升级文件
IEnumerable<PluginConf> pluginConfsClient=null;
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication)
{
(store.FileExists(PublicUnit.PluginConfigFile))
{
IsolatedStorageFileStream fs = store.OpenFile(PublicUnit.PluginConfigFile, FileMode.Open, FileAccess.Read);
XElement xmlClient = XElement.Load(.Xml.XmlReader.Create(fs));
pluginConfsClient = from c in xmlClient.DescendantsAndSelf("assembly")
select PluginConf
{
description = c.Elements("description").SingleOrDefault.Value,
filename = c.Elements("filename").SingleOrDefault.Value,
titlename = c.Elements("titlename").SingleOrDefault.Value,
typename = c.Elements("typename").SingleOrDefault.Value,
version = c.Elements("version").SingleOrDefault.Value
};
fs.Close;
}
}
首先判断本地文件是否存在 (store.FileExists(PublicUnit.PluginConfigFile))如果存在就使用Linq读取;
读取完成的后就比较本地配置文件和服务器配置文件如果本地配置和服务器配置版本不致或者不存在就表示需要从服务器重新下载:
//比较是否需要下载服务器端插件进行升级
foreach (PluginConf pServer in pluginConfsServer)
{
bool bUpdate = true;
//判断是否需要升级
//由于我对DLinq不熟悉暂时使用这个思路方法匹配
(pluginConfsClient != null)
{
foreach (PluginConf pClient in pluginConfsClient)
{
(pServer.filename pClient.filename)
{
(pServer.version pClient.version)
{
//如果文件名字相同和版本相同就不需要要升级
bUpdate = false;
ShowLoadPlugin(pServer);
}
}
}
}
//判断是否需要升级
(bUpdate)
{
this.canvasProgress.Visibility = Visibility.Visible;
progressTitle.Text = "正在下载“" + pServer.titlename + "”:";
DownLoadPlugin(pServer.filename);
}
}
//所有下载完成的后更新本地记录文件
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication)
{
(store.FileExists(WindCloud.Main.PublicUnit.PluginConfigFile))
{
store.DeleteFile(WindCloud.Main.PublicUnit.PluginConfigFile);
}
IsolatedStorageFileStream fileStream = store.CreateFile(WindCloud.Main.PublicUnit.PluginConfigFile);
using (StreamWriter sw = StreamWriter(fileStream))
{
Stream s = e.Result as Stream;
s.Position = 0;
Byte info = Byte[s.Length];
s.Read(info, 0, ()s.Length);
sw.BaseStream.Write(info, 0, info.Length);
sw.Flush;
sw.Close;
}
fileStream.Close;
}
下载插件文件:
void DownLoadPlugin( pluginName)
{
WebClient wc = WebClient;
(wc.IsBusy)
{
wc.CancelAsync;
}
wc.OpenReadCompleted OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.DownloadProgressChanged DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.OpenReadAsync( Uri(pluginName, UriKind.Relative));
}
下载完成的后就开始加载到显示界面:
void ShowLoadPlugin(PluginConf plugin)
{
//在界面上加载插件内容
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication)
{
(store.FileExists(plugin.filename))
{
BinaryReader reader = BinaryReader(store.OpenFile(plugin.filename, FileMode.Open, FileAccess.Read));
Byte info = reader.ReadBytes(()reader.BaseStream.Length);
AssemblyPart ap = AssemblyPart;
Assembly assembly = ap.Load(reader.BaseStream);
IPlugin element = assembly.CreateInstance(plugin.typename) as IPlugin;
//校验加载dll是否实现了契约当然此处也可以用Attribute来实现
element.Application =this;
element.SetVisibility(Visibility.Collapsed);
AddService(element., element);
UserControl pageWindow = element.LoadUserControl;
//添加到界面中
pageWindow.SetValue(Grid.RowProperty, 2);
pageWindow.SetValue(Grid.ColumnProperty, 0);
this.LayoutRoot.Children.Insert(0, pageWindow);
}
}
}
至此插件加载完成;
http://www.prolightsoft.com
最新评论