예제 #1
0
        /// <summary>
        /// Loads several intermediates from paths on disk using the same definitions.
        /// </summary>
        /// <param name="intermediateFiles">Paths to intermediate files saved on disk.</param>
        /// <param name="creator">ISymbolDefinitionCreator to use when reconstituting the intermediates.</param>
        /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
        /// <returns>Returns the loaded intermediates</returns>
        public static IEnumerable <Intermediate> Load(IEnumerable <string> intermediateFiles, ISymbolDefinitionCreator creator, bool suppressVersionCheck = false)
        {
            var jsons         = new Queue <JsonWithPath>();
            var intermediates = new List <Intermediate>();

            foreach (var path in intermediateFiles)
            {
                using (var wixout = WixOutput.Read(path))
                {
                    var data = wixout.GetData(WixOutputStreamName);
                    var json = Intermediate.LoadJson(data, wixout.Uri, suppressVersionCheck);

                    Intermediate.LoadDefinitions(json, creator);

                    jsons.Enqueue(new JsonWithPath {
                        Json = json, Path = wixout.Uri
                    });
                }
            }

            while (jsons.Count > 0)
            {
                var jsonWithPath = jsons.Dequeue();

                var intermediate = Intermediate.FinalizeLoad(jsonWithPath.Json, jsonWithPath.Path, creator);

                intermediates.Add(intermediate);
            }

            return(intermediates);
        }
예제 #2
0
 /// <summary>
 /// Loads an intermediate from a stream.
 /// </summary>
 /// <param name="assembly">Assembly with intermediate embedded in resource stream.</param>
 /// <param name="resourceName">Name of resource stream.</param>
 /// <param name="creator">ISymbolDefinitionCreator to use when reconstituting the intermediate.</param>
 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
 /// <returns>Returns the loaded intermediate.</returns>
 public static Intermediate Load(Assembly assembly, string resourceName, ISymbolDefinitionCreator creator, bool suppressVersionCheck = false)
 {
     using (var wixout = WixOutput.Read(assembly, resourceName))
     {
         return(Intermediate.LoadIntermediate(wixout, creator, suppressVersionCheck));
     }
 }
예제 #3
0
 /// <summary>
 /// Loads an intermediate from a path on disk.
 /// </summary>
 /// <param name="path">Path to intermediate file saved on disk.</param>
 /// <param name="creator">ISymbolDefinitionCreator to use when reconstituting the intermediate.</param>
 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
 /// <returns>Returns the loaded intermediate.</returns>
 public static Intermediate Load(string path, ISymbolDefinitionCreator creator, bool suppressVersionCheck = false)
 {
     using (var wixout = WixOutput.Read(path))
     {
         return(Intermediate.LoadIntermediate(wixout, creator, suppressVersionCheck));
     }
 }
예제 #4
0
        /// <summary>
        /// Loads a wixout from a path on disk or embedded resource in assembly.
        /// </summary>
        /// <param name="baseUri">Uri with local path to wixout file saved on disk or embedded resource in assembly.</param>
        /// <returns>Loaded created <c>WixOutput</c>.</returns>
        public static WixOutput Read(Uri baseUri)
        {
            // If the embedded files are stored in an assembly resource stream (usually
            // a .wixlib embedded in a WixExtension).
            if ("embeddedresource" == baseUri.Scheme)
            {
                var assemblyPath = Path.GetFullPath(baseUri.LocalPath);
                var resourceName = baseUri.Fragment.TrimStart('#');

                var assembly = Assembly.LoadFile(assemblyPath);
                return(WixOutput.Read(assembly, resourceName));
            }
            else // normal file (usually a binary .wixlib on disk).
            {
                var stream = File.OpenRead(baseUri.LocalPath);
                return(WixOutput.Read(baseUri, stream));
            }
        }
예제 #5
0
        private void SaveEmbedFiles(WixOutput wixout)
        {
            var embeddedFields = this.Sections.SelectMany(s => s.Symbols)
                                 .SelectMany(t => t.Fields)
                                 .Where(f => f?.Type == IntermediateFieldType.Path)
                                 .Select(f => f.AsPath())
                                 .Where(f => f.Embed)
                                 .ToList();

            var savedEmbedFields = new Dictionary <string, IntermediateFieldPathValue>(StringComparer.OrdinalIgnoreCase);
            var uniqueEntryNames = new HashSet <string>(StringComparer.OrdinalIgnoreCase);

            foreach (var embeddedField in embeddedFields)
            {
                var key = String.Concat(embeddedField.BaseUri?.AbsoluteUri, "?", embeddedField.Path);

                if (savedEmbedFields.TryGetValue(key, out var existing))
                {
                    embeddedField.Path = existing.Path;
                }
                else
                {
                    var entryName = CalculateUniqueEntryName(uniqueEntryNames, embeddedField.Path);

                    if (embeddedField.BaseUri == null)
                    {
                        wixout.ImportDataStream(entryName, embeddedField.Path);
                    }
                    else // open the container specified in baseUri and copy the correct stream out of it.
                    {
                        using (var otherWixout = WixOutput.Read(embeddedField.BaseUri))
                            using (var stream = otherWixout.GetDataStream(embeddedField.Path))
                                using (var target = wixout.CreateDataStream(entryName))
                                {
                                    stream.CopyTo(target);
                                }
                    }

                    embeddedField.Path = entryName;

                    savedEmbedFields.Add(key, embeddedField);
                }
            }
        }