/// <summary>
/// Generates WiX XML source file the specified <see cref="Project"/> instance.
/// </summary>
/// <param name="project">The <see cref="Project"/> instance.</param>
/// <returns>Instance of XDocument class representing in-memory WiX XML source file.</returns>
public static XDocument GenerateWixProj(Project project)
{
project.Preprocess();
ProjectValidator.Validate(project);
project.ControlPanelInfo.AddMembersTo(project);
project.AutoAssignedInstallDirPath = "";
project.GenerateProductGuids();
ResetCachedContent();
string extraNamespaces = project.WixNamespaces.Distinct()
.Select(x => x.StartsWith("xmlns:") ? x : "xmlns:" + x)
.ConcatItems(" ");
XDocument doc = XDocument.Parse(
@"<?xml version=""1.0"" encoding=""utf-8""?>
<Wix xmlns=""http://schemas.microsoft.com/wix/2006/wi"" " + extraNamespaces + @">
<Product>
<Package InstallerVersion=""200"" Compressed=""yes""/>
<Media Id=""1"" Cabinet=""" + (project as WixEntity).Id + @".cab"" EmbedCab=""yes"" />
</Product>
</Wix>");
XElement product = doc.Root.Select("Product");
product.Add(new XAttribute("Id", project.ProductId),
new XAttribute("Name", project.Name),
new XAttribute("Language", new CultureInfo(project.Language).LCID),
new XAttribute("Codepage", project.Codepage),
new XAttribute("Version", project.Version),
new XAttribute("UpgradeCode", project.UpgradeCode));
if (project.ControlPanelInfo != null && project.ControlPanelInfo.Manufacturer.IsNotEmpty())
product.SetAttribute("Manufacturer", project.ControlPanelInfo.Manufacturer);
product.AddAttributes(project.Attributes);
XElement package = product.Select("Package");
package.SetAttribute("Description", project.Description)
.SetAttribute("Platform", project.Platform)
.SetAttribute("SummaryCodepage", project.Codepage)
.SetAttribute("Languages", new CultureInfo(project.Language).LCID)
.SetAttribute("InstallScope", project.InstallScope);
if (project.EmitConsistentPackageId)
package.CopyAttributeFrom(product, "Id");
package.AddAttributes(project.Package.Attributes);
product.Select("Media").AddAttributes(project.Media.Attributes);
ProcessLaunchConditions(project, product);
//extend wDir
XElement dirs = product.AddElement(
new XElement("Directory",
new XAttribute("Id", "TARGETDIR"),
new XAttribute("Name", "SourceDir")));
var featureComponents = new Dictionary<Feature, List<string>>(); //feature vs. component IDs
var autoGeneratedComponents = new List<string>(); //component IDs
var defaultFeatureComponents = new List<string>(); //default Feature (Complete setup) components
ProcessDirectories(project, featureComponents, defaultFeatureComponents, autoGeneratedComponents, dirs);
ProcessRegKeys(project, featureComponents, defaultFeatureComponents, product);
ProcessEnvVars(project, featureComponents, defaultFeatureComponents, product);
ProcessUsers(project, featureComponents, defaultFeatureComponents, product);
ProcessSql(project, featureComponents, defaultFeatureComponents, product);
ProcessCertificates(project, featureComponents, defaultFeatureComponents, product);
ProcessProperties(project, product);
ProcessCustomActions(project, product);
ProcessBinaries(project, product); //it is important to call ProcessBinaries after all other ProcessX as they may insert some implicit "binaries"
ProcessFeatures(project, product, featureComponents, autoGeneratedComponents, defaultFeatureComponents);
//special properties
if (project.UI != WUI.WixUI_ProgressOnly)
{
XElement installDir = GetTopLevelDir(product);
//if UIRef is set to WIXUI_INSTALLDIR must also add
//<Property Id="WIXUI_INSTALLDIR" Value="directory id" />
if (project.UI == WUI.WixUI_InstallDir)
product.Add(new XElement("Property",
new XAttribute("Id", "WIXUI_INSTALLDIR"),
new XAttribute("Value", installDir.Attribute("Id").Value)));
product.Add(new XElement("UIRef",
new XAttribute("Id", project.UI.ToString())));
var extensionAssembly = Utils.PathCombine(WixLocation, @"WixUIExtension.dll");
if (project.WixExtensions.Find(x => x == extensionAssembly) == null)
project.WixExtensions.Add(extensionAssembly);
}
if (project.EmbeddedUI != null)
{
string bynaryPath = project.EmbeddedUI.Name;
if (project.EmbeddedUI is EmbeddedAssembly)
{
var asmBin = project.EmbeddedUI as EmbeddedAssembly;
bynaryPath = asmBin.Name.PathChangeDirectory(project.OutDir.PathGetFullPath())
.PathChangeExtension(".CA.dll");
var refAsms = asmBin.RefAssemblies.Add(typeof(Session).Assembly.Location)
.Concat(project.DefaultRefAssemblies)
.Distinct()
.ToArray();
PackageManagedAsm(asmBin.Name, bynaryPath, refAsms, project.OutDir, project.CustomActionConfig);
}
product.AddElement("UI")
.Add(new XElement("EmbeddedUI",
new XAttribute("Id", project.EmbeddedUI.Id),
new XAttribute("SourceFile", bynaryPath)));
product.Select("UIRef").Remove();
}
if (!project.BannerImage.IsEmpty())
{
product.Add(new XElement("WixVariable",
new XAttribute("Id", "WixUIBannerBmp"),
new XAttribute("Value", Utils.PathCombine(project.SourceBaseDir, project.BannerImage))));
}
if (!project.BackgroundImage.IsEmpty())
{
product.Add(new XElement("WixVariable",
new XAttribute("Id", "WixUIDialogBmp"),
new XAttribute("Value", Utils.PathCombine(project.SourceBaseDir, project.BackgroundImage))));
}
if (!project.LicenceFile.IsEmpty())
{
if (!AllowNonRtfLicense && !project.LicenceFile.EndsWith(".rtf", StringComparison.OrdinalIgnoreCase))
throw new ApplicationException("License file must have 'rtf' file extension. Specify 'Compiler.AllowNonRtfLicense=true' to overcome this constrain.");
product.Add(
new XElement("WixVariable",
new XAttribute("Id", "WixUILicenseRtf"),
new XAttribute("Value", Utils.PathCombine(project.SourceBaseDir, project.LicenceFile)),
new XAttribute("xmlns", "")));
}
PostProcessMsm(project, product);
ProcessUpgradeStrategy(project, product);
return doc;
}