Exemple #1
0
        private void DownloadPendingAssemblies()
        {
            if (_pendingDownloads.Count == 0)
            {
                return;
            }

            _busyContext.IsBusy = true;

            ThreadPool.QueueUserWorkItem(o =>
            {
                while (_pendingDownloads.Count > 0)
                {
                    var fileInfo = _pendingDownloads.Dequeue();

                    Dispatcher.BeginInvoke(() => { _busyContext.ItemLabel = fileInfo.Name; });

                    try
                    {
                        string extension = Path.GetExtension(fileInfo.Name);

                        if (KnownFormats.Zip.Contains(extension))
                        {
                            StorageService.AddFileToCache(fileInfo);
                            Dispatcher.BeginInvoke(() => LoadZiPackage(fileInfo));
                        }
                        else
                        {
                            var definition = AssemblyDefinition.ReadAssembly(fileInfo.OpenRead());

                            string assemblyPath = definition.IsSilverlight()
                ? StorageService.CacheSilverlightAssembly(fileInfo.Name, fileInfo.OpenRead())
                : StorageService.CacheNetAssembly(fileInfo.Name, fileInfo.OpenRead());

                            Dispatcher.BeginInvoke(() =>
                            {
                                var assemblyStream = new AssemblyFileStream(fileInfo);
                                ApplicationModel.Current.AssemblyCache.LoadAssembly(assemblyStream, definition, false);
                                LoadOrReplaceAssembly(definition, assemblyStream);
                            });
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.Message);
                        Dispatcher.BeginInvoke(() => new ErrorWindow(ex).Show());
                    }
                }

                Dispatcher.BeginInvoke(() => _busyContext.IsBusy = false);
            });
        }