/// <summary> /// Automatically generates required sources files for building the Bootstrapper. It is /// used to automatically generate the files which, can be generated automatically without /// user involvement (e.g. BootstrapperCore.config). /// </summary> /// <param name="outDir">The output directory.</param> public override void AutoGenerateSources(string outDir) { //NOTE: while it is tempting, AutoGenerateSources cannot be called during initialization as it is too early. //The call must be triggered by Compiler.Build* calls. rawAppAssembly = AppAssembly; if (rawAppAssembly.EndsWith("%this%")) { rawAppAssembly = Compiler.ResolveClientAsm(outDir); //NOTE: if a new file is generated then the Compiler takes care for cleaning any temps if (Payloads.FirstOrDefault(x => x.SourceFile == "%this%") is Payload payload_this) { payload_this.SourceFile = rawAppAssembly; } } string asmName = Path.GetFileNameWithoutExtension(Utils.OriginalAssemblyFile(rawAppAssembly)); var suppliedConfig = Payloads.Select(x => x.SourceFile).FirstOrDefault(x => Path.GetFileName(x).SameAs("BootstrapperCore.config", true)); bootstrapperCoreConfig = suppliedConfig; if (bootstrapperCoreConfig == null) { bootstrapperCoreConfig = Path.Combine(outDir, "BootstrapperCore.config"); sys.File.WriteAllText(bootstrapperCoreConfig, DefaultBootstrapperCoreConfigContent.Replace("{asmName}", asmName)); Compiler.TempFiles.Add(bootstrapperCoreConfig); } }
/// <summary> /// Automatically generates required sources files for building the Bootstrapper. It is /// used to automatically generate the files which, can be generated automatically without /// user involvement (e.g. BootstrapperCore.config). /// </summary> /// <param name="outDir">The output directory.</param> public override void AutoGenerateSources(string outDir) { //NOTE: while it is tempting, AutoGenerateSources cannot be called during initialization as it is too early. //The call must be triggered by Compiler.Build* calls. rawAppAssembly = AppAssembly; if (rawAppAssembly.EndsWith("%this%")) { rawAppAssembly = Compiler.ResolveClientAsm(outDir); //NOTE: if a new file is generated then the Compiler takes care for cleaning any temps if (Payloads.FirstOrDefault(x => x.SourceFile == "%this%") is Payload payload_this) { payload_this.SourceFile = rawAppAssembly; } } string asmName = Path.GetFileNameWithoutExtension(Utils.OriginalAssemblyFile(rawAppAssembly)); var suppliedConfig = Payloads.Select(x => x.SourceFile).FirstOrDefault(x => Path.GetFileName(x).SameAs("BootstrapperCore.config", true)); bootstrapperCoreConfig = suppliedConfig; if (bootstrapperCoreConfig == null) { bootstrapperCoreConfig = Path.Combine(outDir, "BootstrapperCore.config"); sys.File.WriteAllText(bootstrapperCoreConfig, DefaultBootstrapperCoreConfigContent.Replace("{asmName}", asmName)); Compiler.TempFiles.Add(bootstrapperCoreConfig); } // WiX does not check the validity of the BootstrapperCore.config so we need to do it try { var expectedAssemblyName = XDocument.Load(bootstrapperCoreConfig) .FindFirst("host") .Attribute("assemblyName") .Value; if (asmName != expectedAssemblyName) { Compiler.OutputWriteLine( $"WARNING: It looks like your configured BA assembly name (<host assemblyName=\"{expectedAssemblyName}\">) " + $"from `BootstrapperCore.config` file is not matching the actual assembly name (\"{asmName}\")."); } } catch { } }