zoukankan      html  css  js  c++  java
  • 使用SilverLight构建插件式应用程序(二)

    使用SilverLight构建应用程序(二)

    上文说到把服务器代码加载到了本地,下面的代码就获取保存在本地的配置文件:

    //获取本地的升级文件

                IEnumerable<PluginConf> pluginConfsClient=null;

                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    if (store.FileExists(PublicUnit.PluginConfigFile))

                    {

                        IsolatedStorageFileStream fs = store.OpenFile(PublicUnit.PluginConfigFile, FileMode.Open, FileAccess.Read);

                        XElement xmlClient = XElement.Load(System.Xml.XmlReader.Create(fs));

                        pluginConfsClient = from c in xmlClient.DescendantsAndSelf("assembly")

                                            select new 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();

     

                    }

                }

    首先判断本地文件是否存在,if (store.FileExists(PublicUnit.PluginConfigFile)),如果存在就使用Linq读取;

    读取完成之后,就比较本地的配置文件和服务器的配置文件,如果本地的配置和服务器的配置的版本不一致或者不存在,就表示需要从服务器重新下载:

    //比较是否需要下载服务器端的插件进行升级

                foreach (PluginConf pServer in pluginConfsServer)

                {

                    bool bUpdate = true;

                    //判断是否需要升级,

                    //由于我对DLinq不熟悉,暂时使用这个方法匹配

                    if (pluginConfsClient != null)

                    {

                        foreach (PluginConf pClient in pluginConfsClient)

                        {

                            if (pServer.filename == pClient.filename)

                            {

                                if (pServer.version == pClient.version)

                                {

                                    //如果文件名字相同和版本相同,就不需要要升级

                                    bUpdate = false;

                                    ShowLoadPlugin(pServer);

                                }

                            }

                        }

                    }

                    //判断是否需要升级

                    if (bUpdate)

                    {

                        this.canvasProgress.Visibility = Visibility.Visible;

                        progressTitle.Text = "正在下载“" + pServer.titlename + "”:";

                        DownLoadPlugin(pServer.filename);

                    }

                }

        //所有的下载完成之后,更新本地的记录文件

                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    if(store.FileExists(WindCloud.Main.PublicUnit.PluginConfigFile))

                    {

                        store.DeleteFile(WindCloud.Main.PublicUnit.PluginConfigFile);

                    }

                    IsolatedStorageFileStream fileStream = store.CreateFile(WindCloud.Main.PublicUnit.PluginConfigFile);

                    using (StreamWriter sw = new StreamWriter(fileStream))

                    {

                        Stream s = e.Result as Stream;

                        s.Position = 0;

                        Byte[] info = new Byte[s.Length];

                        s.Read(info, 0, (int)s.Length);

                        sw.BaseStream.Write(info, 0, info.Length);

                        sw.Flush();

                        sw.Close();

                    }

                    fileStream.Close();

                }         

    下载插件文件:

    void DownLoadPlugin(string pluginName)

            {

                WebClient wc = new WebClient();

                if (wc.IsBusy)

                {

                    wc.CancelAsync();

                }

     

                wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);

                wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);

                wc.OpenReadAsync(new Uri(pluginName, UriKind.Relative));

     

            }

    下载完成之后就开始加载到显示界面:

    void ShowLoadPlugin(PluginConf plugin)

            {

                //在界面上加载的插件内容

                using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

                {

                    if (store.FileExists(plugin.filename))

                    {

                        BinaryReader reader = new BinaryReader(store.OpenFile(plugin.filename, FileMode.Open, FileAccess.Read));

                        Byte[] info = reader.ReadBytes((int)reader.BaseStream.Length);

     

                        AssemblyPart ap = new 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.ToString(), 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

    代码下载: http://www.prolightsoft.com/windcloud.rar

  • 相关阅读:
    使用respondsToSelector:来发现对象是否响应消息
    使用iskindofclass来发现对象是否是某类或其子类的实例
    集合set的使用
    字典的使用
    数组的使用
    对NSNumber的理解
    数组、字典和集合的定义
    强引用strong和弱引用weak的定义
    类工厂方法的定义
    POJ 2262 / UVa 543
  • 原文地址:https://www.cnblogs.com/songsgroup/p/1271739.html
Copyright © 2011-2022 走看看