Exemple #1
0
        private void loaded(LoadCompletedEventArgs e, LoadModuleCallback callback)
        {
            lock (e.Request.ModuleInfo)
            {
                (e.Request.ModuleInfo as ModuleInfo).Status = ModuleStatus.Loaded;
            }

            try
            {
                e.Request.ModuleInfo.Initialize();
            }
            catch (Exception ex)
            {
                (e.Request.ModuleInfo as ModuleInfo).Raise(this, new LoadCompletedEventArgs(e.Request, null, ex, e.Cancelled, e.UserState));
                if (callback != null)
                {
                    callback(this, new LoadedMoudleEventArgs(e.Request, ex, false, LoadModuleStatus.End, e.UserState));
                }
                else
                {
                    throw new PageException(MessageResource.PageException_ModuleInitializeError_Ttitle,
                                            MessageResource.PageException_ModuleInitializeError_Message, ex, e.Request);
                }
            }

            (e.Request.ModuleInfo as ModuleInfo).Raise(this, e);

            if (callback != null)
            {
                callback(this, new LoadedMoudleEventArgs(e.Request, null, false, LoadModuleStatus.End, e.UserState));
            }
        }
Exemple #2
0
        public void LoadModule(Request request, LoadModuleCallback callback)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if (callback != null)
            {
                callback(this, new LoadedMoudleEventArgs(request, null, false, LoadModuleStatus.Begin, null));
            }

            if (request.ModuleInfo.Status == ModuleStatus.Preloading)
            {
                XapModuleLoader loader = new XapModuleLoader();
                loader.LoadCompleted += new EventHandler <LoadCompletedEventArgs>(OnLoadModule);
                loader.LoadProgress  += new EventHandler <LoadProgressEventArgs>(OnLoadModuleProgress);
                loader.UserState      = callback;
                loader.Load(request);
                lock (request.ModuleInfo)
                {
                    (request.ModuleInfo as ModuleInfo).Status = ModuleStatus.Loading;
                }
            }
            else if (request.ModuleInfo.Status == ModuleStatus.Loading)
            {
                (request.ModuleInfo as ModuleInfo).RequestQueue.Enqueue(new KeyValuePair <Request, LoadModuleCallback>(request, callback));
            }
            else if (request.ModuleInfo.Status == ModuleStatus.Loaded)
            {
                OnLoadModule(this, new LoadCompletedEventArgs(request, null, null, false, callback));
            }
            else if (request.ModuleInfo.Status == ModuleStatus.Initialized)
            {
                (request.ModuleInfo as ModuleInfo).Raise(this, new LoadCompletedEventArgs(request, null, null, false, null));
                if (callback != null)
                {
                    callback(this, new LoadedMoudleEventArgs(request, null, false, LoadModuleStatus.End, null));
                }
            }
        }
Exemple #3
0
        private void OnLoadModule(object sender, LoadCompletedEventArgs e)
        {
            LoadModuleCallback callback = e.UserState as LoadModuleCallback;

            if (e.Error != null)
            {
                ModuleInfo module = e.Request.ModuleInfo as ModuleInfo;
                lock (module)
                {
                    module.Status = ModuleStatus.Preloading;
                }
                module.Raise(this, e);

                if (callback != null)
                {
                    callback(this, new LoadedMoudleEventArgs(e.Request, e.Error, false, LoadModuleStatus.End, e.UserState));
                }
                else
                {
                    throw new PageException(MessageResource.PageException_PageLoadFailure_Title,
                                            MessageResource.PageException_PageLoadFailure_Message, e.Error, e.Request);
                }
            }

            /*
             * 如果发生页面初始化失败的时候,会导致再次打开这个页面的时候一直处于Loading状态
             * 原因是EntryPointType可能在第一次加载的时候已经初始化,导致第二次不能进行加载;
             * (By Aaron.L.Zhou)
             */
            if (e.Request.ModuleInfo.Status == ModuleStatus.Loading && e.Request.ModuleInfo.EntryPointType == null)
            {
                //是否所有的Xap Dll都已经加载完成;
                bool m_isLoaded = false;
                try
                {
                    int loadedAssemblyCount = 0;

                    Stream stream = e.Result;
                    IEnumerable <AssemblyPart> parts = GetParts(stream, e.Request.ModuleInfo as ModuleInfo);
                    ModuleInfo module     = e.Request.ModuleInfo as ModuleInfo;
                    string     moduleFile = (module.m_entryPointType.Split(',')[1] + ".dll").ToLower();
                    module.m_stream = new StreamResourceInfo(stream, "xap");
                    LoadModuleConfig(module.m_stream, module.m_config);
                    foreach (AssemblyPart item in parts)
                    {
                        LoadAssembly(stream, item, (a) =>
                        {
                            Interlocked.Increment(ref loadedAssemblyCount);

                            if (item.Source.ToLower() == moduleFile)
                            {
                                module.m_entryPointType = string.Format("{0},Version={1}",
                                                                        module.m_entryPointType, Regex.Match(a.FullName, @"Version=(?<version>[\d.]+)").Groups["version"].Value);
                            }

                            if (parts.Count() == loadedAssemblyCount)
                            {
                                m_isLoaded = true;
                                loaded(e, callback);
                            }
                        });
                    }
                }
                catch (Exception ex)
                {
                    ModuleInfo module = e.Request.ModuleInfo as ModuleInfo;
                    if (!m_isLoaded)
                    {
                        lock (module)
                        {
                            module.Status = ModuleStatus.Preloading;
                        }
                    }

                    module.Raise(this, new LoadCompletedEventArgs(e.Request, null, ex, e.Cancelled, e.UserState));

                    if (callback != null)
                    {
                        callback(this, new LoadedMoudleEventArgs(e.Request, ex, false, LoadModuleStatus.End, e.UserState));
                    }
                    else
                    {
                        throw new PageException(MessageResource.PageException_ModuleInitializeError_Ttitle,
                                                MessageResource.PageException_ModuleInitializeError_Message, ex, e.Request);
                    }
                }
            }
        }