示例#1
0
        private static void ProcessAssemblyDownload(Byte[] data)
        {
            // and map the assembly
            var _assembly = Assembly.Load(data);

            AssemblyMapper.MapAssembly(_assembly);
        }
示例#2
0
        public static IObservable <LoadedResourceInfo> LoadResource(Uri resourceUri)
        {
            Guard.ArgumentNotNull(resourceUri, "resourceUri");
            Guard.ArgumentValue((resourceUri.ToString().EndsWith(DLL_EXT, StringComparison.OrdinalIgnoreCase) == false), "resourceUri",
                                DLL_ONLY_MESSAGE, resourceUri.ToString());

            return(new LazyRelayObservable <LoadedResourceInfo>((o) =>
            {
                lock (_lock)
                {
                    // if already loaded
                    if (_loadedPackages.Any((u) => IsUriEqual(u, resourceUri)))
                    {
                        o.OnNext(new LoadedResourceInfo(resourceUri, true, null));
                        o.OnCompleted();
                        return;
                    }

                    // if loading, we wait for it to be loaded
                    if (_loadingPackages.Any((u) => IsUriEqual(u, resourceUri)))
                    {
                        var _token = (IDisposable)null;
                        _token = ObservableExtensions.Subscribe(Channel <LoadedResourceInfo> .Public, (r) =>
                        {
                            if (IsUriEqual(r.ResourceUri, resourceUri))
                            {
                                o.OnNext(r);
                                o.OnCompleted();
                                _token.Dispose();
                            }
                        });
                        return;
                    }

                    // else add that we are loading
                    _loadingPackages.Add(resourceUri);
                }

                if (resourceUri.IsAbsoluteUri)
                {
                    // and we load
                    var _webClient = new WebClient();
                    _webClient.DownloadDataCompleted += (s, e) =>
                    {
                        var _remoteResourceInfo = new LoadedResourceInfo(resourceUri, (!e.Cancelled && e.Error == null), e.Error);
                        lock (_lock)
                        {
                            _loadingPackages.Remove(resourceUri);

                            if (_remoteResourceInfo.IsLoaded)
                            {
                                _loadedPackages.Add(resourceUri);
                                ProcessAssemblyDownload(e.Result);
                            }
                        }

                        Channel <LoadedResourceInfo> .Public.OnNext(_remoteResourceInfo);
                        o.OnNext(_remoteResourceInfo);
                        o.OnCompleted();
                    };

                    _webClient.DownloadDataAsync(resourceUri);
                }
                else
                {
                    var _remoteResourceInfo = (LoadedResourceInfo)null;
                    try
                    {
                        lock (_lock)
                        {
                            _loadingPackages.Remove(resourceUri);

                            var _fileName = resourceUri.OriginalString;
                            var _filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _fileName);
                            var _assembly = Assembly.LoadFile(_filePath);
                            _loadedPackages.Add(resourceUri);

                            AssemblyMapper.MapAssembly(_assembly);
                            _remoteResourceInfo = new LoadedResourceInfo(resourceUri, true, null);
                        }
                    }
                    catch (Exception ex)
                    {
                        _remoteResourceInfo = new LoadedResourceInfo(resourceUri, false, ex);
                    }

                    Channel <LoadedResourceInfo> .Public.OnNext(_remoteResourceInfo);
                    o.OnNext(_remoteResourceInfo);
                    o.OnCompleted();
                }
            }));
        }