private void ProcessPlatform(XmlNode platformNode) { // process platform task assemblies if (!ScannedTasks) { FileSet platformTaskAssemblies = new FileSet(); platformTaskAssemblies.BaseDirectory = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); platformTaskAssemblies.Project = Project; platformTaskAssemblies.NamespaceManager = NamespaceManager; platformTaskAssemblies.Parent = Project; // avoid warnings by setting the parent of the fileset platformTaskAssemblies.ID = "platform-task-assemblies"; // avoid warnings by assigning an id XmlNode taskAssembliesNode = platformNode.SelectSingleNode( "nant:task-assemblies", NamespaceManager); if (taskAssembliesNode != null) { platformTaskAssemblies.Initialize(taskAssembliesNode, Project.Properties, null); } // scan platform extensions assemblies LoadTasksTask loadTasks = new LoadTasksTask(); loadTasks.Project = Project; loadTasks.NamespaceManager = NamespaceManager; loadTasks.Parent = Project; loadTasks.TaskFileSet = platformTaskAssemblies; loadTasks.FailOnError = false; loadTasks.Threshold = (Project.Threshold == Level.Debug) ? Level.Debug : Level.Warning; loadTasks.Execute(); // scan NAnt.Core TypeFactory.ScanAssembly(Assembly.GetExecutingAssembly(), loadTasks); } // process the framework nodes of the current platform ProcessFrameworks(platformNode); // process runtime framework task assemblies if (!ScannedTasks) { LoadTasksTask loadTasks = new LoadTasksTask(); loadTasks.Project = Project; loadTasks.NamespaceManager = NamespaceManager; loadTasks.Parent = Project; loadTasks.TaskFileSet = Project.RuntimeFramework.TaskAssemblies; loadTasks.FailOnError = false; loadTasks.Threshold = (Project.Threshold == Level.Debug) ? Level.Debug : Level.Warning; loadTasks.Execute(); // ensure we don't scan task assemblies for the current // runtime framework and platform again ScannedTasks = true; } }
/// <summary> /// Merges Merge Modules into the MSI Database. /// </summary> /// <param name="Database">The MSI Database.</param> /// <param name="TempPath">The path to temporary files.</param> private void LoadMergeModules(string Database, string TempPath) { // If <mergemodules>...</mergemodules> exists in the nant msi task if (msi.mergemodules != null) { MsmMerge2Class mergeClass = new MsmMerge2Class(); int index = 1; Log(Level.Verbose, "Storing Merge Modules:"); if (!Directory.Exists(TempPath)) Directory.CreateDirectory(TempPath); // Merge module(s) assigned to a specific feature foreach (MSIMerge merge in msi.mergemodules) { // Get each merge module file name assigned to this feature //NAntFileSet modules = merge.modules; FileSet mergeSet = new FileSet(); mergeSet.Parent = this; mergeSet.Project = Project; mergeSet.NamespaceManager = NamespaceManager; XmlElement modulesElem = (XmlElement)((XmlElement)_xmlNode).SelectSingleNode( "nant:mergemodules/nant:merge[@feature='" + merge.feature + "']/nant:modules", NamespaceManager); mergeSet.Initialize(modulesElem); try { mergeClass.OpenDatabase(Database); } catch (FileLoadException fle) { throw new BuildException("Error while opening the database for merging.", Location, fle); } // Iterate each module assigned to this feature foreach (string mergeModule in mergeSet.FileNames) { Log(Level.Verbose, "\t" + Path.GetFileName(mergeModule)); // Open the merge module (by Filename) try { mergeClass.OpenModule(mergeModule, 1033); } catch (Exception ex) { throw new BuildException(string.Format(CultureInfo.InvariantCulture, "File '{0}' cannot be opened.", mergeModule), Location, ex); } // Once the merge is complete, components in the module are attached to the // feature identified by Feature. This feature is not created and must be // an existing feature. Note that the Merge method gets all the feature // references in the module and substitutes the feature reference for all // occurrences of the null GUID in the module database. if (merge.configurationitems != null) { Log(Level.Verbose, "\t\tConfigurable item(s):"); Hashtable configurations = new Hashtable(); foreach (MSIConfigurationItem configItem in merge.configurationitems) { if ((configItem.module == null || configItem.module.Equals(String.Empty)) || configItem.module.ToLower().Equals(mergeModule.ToLower()) || configItem.module.ToLower().Equals(Path.GetFileName(mergeModule.ToLower()))) { if (configItem.module == null || configItem.module.Equals(String.Empty)) { if (configurations[configItem.name] == null) { configurations[configItem.name] = configItem.value; Log(Level.Verbose, "\t\t\t{0}\tValue: {1}", configItem.name, configItem.value); } } else { configurations[configItem.name] = configItem.value; Log(Level.Verbose, "\t\t\t{0}\tValue: {1}", configItem.name, configItem.value); } } } mergeClass.MergeEx(merge.feature, null, new MsmConfigureModule(configurations)); } else { mergeClass.Merge(merge.feature, null); } string moduleCab = Path.Combine(Path.GetDirectoryName(Database), "mergemodule" + index + ".cab"); index++; mergeClass.ExtractCAB(moduleCab); if (File.Exists(moduleCab)) { // Extract the cabfile contents to a Temp directory try { ExtractCabFileToTempDirectory(moduleCab); } finally { File.Delete(moduleCab); } } mergeClass.CloseModule(); } // Close and save the database mergeClass.CloseDatabase(true); } } }