Example #1
0
 private void BuildPointers()
 {
     foreach (var pointerObject in ExportManager.GetExports().OfType <IPointerObject>())
     {
         pointerObject.AddPointers(Vault);
     }
 }
Example #2
0
        private Stream BuildVltStream()
        {
            MemoryStream ms = new MemoryStream(8192);
            BinaryWriter bw = new BinaryWriter(ms);
            ChunkWriter  cw = new ChunkWriter(bw, Vault);

            var versionChunk = new VltVersionChunk();

            cw.WriteChunk(versionChunk);

            var startChunk = new VltStartChunk();

            cw.WriteChunk(startChunk);

            var dependencyChunk = new VltDependencyChunk(new List <string>
            {
                $"{Vault.Name}.vlt",
                $"{Vault.Name}.bin"
            });

            cw.WriteChunk(dependencyChunk);

            var dataChunk = new VltDataChunk(ExportManager.GetExports());

            cw.WriteChunk(dataChunk);

            var exportChunk = new VltExportChunk(dataChunk.ExportEntries);

            cw.WriteChunk(exportChunk);
            var binWriter = new BinaryWriter(BinStream);

            foreach (var pointerObject in ExportManager.GetExports().OfType <IPointerObject>())
            {
                pointerObject.WritePointerData(Vault, binWriter);
            }

            // after writing exports, we can build pointers
            BuildPointers();

            var pointersChunk = new VltPointersChunk();

            cw.WriteChunk(pointersChunk);
            var endChunk = new EndChunk();

            cw.WriteChunk(endChunk);

            return(ms);
        }
Example #3
0
        private void DiscoverTypes(IEnumerable <ContractInfo> contracts)
        {
            lock (_lock)
            {
                if (_catalogCollection == null)
                {
                    _catalogCollection = new AggregateCatalog();
                }
                var exports = new List <Tuple <ContractInfo, Colosoft.Reflection.Composition.IExport> >();
                foreach (var i in contracts)
                {
                    if (i.Types.Count == 0)
                    {
                        var tuple = new Tuple <ContractInfo, Reflection.Composition.IExport>(i, ExportManager.GetExport(i.ContractType, i.ContractName, _uiContext));
                        if (tuple.Item2 != null)
                        {
                            exports.Add(tuple);
                        }
                    }
                    else
                    {
                        var contractExports = ExportManager.GetExports(i.ContractType, i.ContractName, _uiContext);
                        int contractCount   = 0;
                        foreach (var j in contractExports)
                        {
                            if (i.Types.Contains(j.Type, Colosoft.Reflection.TypeName.TypeNameEqualityComparer.Instance))
                            {
                                contractCount++;
                                var tuple = new Tuple <ContractInfo, Reflection.Composition.IExport>(i, j);
                                exports.Add(tuple);
                            }
                        }
                    }
                }
                if (exports.Count > 0)
                {
                    var pkgParts         = new List <Colosoft.Reflection.AssemblyPart>();
                    var partDescriptions = new List <PartDescription>();
                    foreach (var i in exports)
                    {
                        var assemblyPart = new Colosoft.Reflection.AssemblyPart(string.Format("{0}.dll", i.Item2.Type.AssemblyName.Name));
                        if (!pkgParts.Exists(f => StringComparer.InvariantCultureIgnoreCase.Equals(f.Source, assemblyPart.Source)))
                        {
                            pkgParts.Add(assemblyPart);
                        }
                        System.ComponentModel.Composition.CreationPolicy creationPolicy = System.ComponentModel.Composition.CreationPolicy.Any;
                        switch (i.Item2.CreationPolicy)
                        {
                        case Reflection.Composition.CreationPolicy.NonShared:
                            creationPolicy = System.ComponentModel.Composition.CreationPolicy.NonShared;
                            break;

                        case Reflection.Composition.CreationPolicy.Shared:
                            creationPolicy = System.ComponentModel.Composition.CreationPolicy.Shared;
                            break;
                        }
                        ImportingConstructorDescription importingConstructor = null;
                        if (i.Item2.ImportingConstructor)
                        {
                            importingConstructor = new ImportingConstructorDescription(i.Item2.Type, null);
                        }
                        var partDescription = new PartDescription(i.Item2.Type, new ExportDescription[] {
                            new ExportDescription {
                                ContractTypeName = i.Item1.ContractType,
                                ContractName     = string.IsNullOrEmpty(i.Item2.ContractName) ? null : i.Item2.ContractName.Trim(),
                                Metadata         = i.Item2.Metadata
                            }
                        }, new ImportDescription[0], i.Item2.UseDispatcher, importingConstructor, creationPolicy);
                        partDescriptions.Add(partDescription);
                    }
                    var catalog          = new DefinitionCatalog(new DiscoverAssembliesContainer(this, _assemblyRepository, pkgParts.ToArray(), exports), partDescriptions);
                    var addedDefinitions = catalog.Parts;
                    using (AtomicComposition composition = new AtomicComposition())
                    {
                        var args = new ComposablePartCatalogChangeEventArgs(addedDefinitions, Enumerable.Empty <ComposablePartDefinition>(), composition);
                        this.OnChanging(args);
                        _catalogCollection.Catalogs.Add(catalog);
                        composition.Complete();
                    }
                    ComposablePartCatalogChangeEventArgs e = new ComposablePartCatalogChangeEventArgs(addedDefinitions, Enumerable.Empty <ComposablePartDefinition>(), null);
                    this.OnChanged(e);
                }
            }
        }