From a79ce0b907676e50332139b4c4a8acb5d22a4b46 Mon Sep 17 00:00:00 2001 From: Sean Hall Date: Wed, 29 Apr 2020 19:32:42 +1000 Subject: Add support for FDD in DotNetCoreBootstrapperApplicationHost. --- src/dnchost/dnchost.cpp | 34 ++++++- src/dnchost/dnchost.h | 8 ++ .../WixToolsetTest.ManagedHost/DncHostFixture.cs | 107 +++++++++++++++++++++ .../EarliestCoreMBA/FrameworkDependentBundle.wxs | 17 ++++ .../EarliestCoreMBA/SelfContainedBundle.wxs | 1 + .../EarliestCoreMBA/TrimmedSelfContainedBundle.wxs | 1 + .../LatestCoreMBA/FrameworkDependentBundle.wxs | 17 ++++ .../TestData/LatestCoreMBA/SelfContainedBundle.wxs | 1 + .../LatestCoreMBA/TrimmedSelfContainedBundle.wxs | 1 + .../WixToolsetTest.ManagedHost.csproj | 3 + src/wixext/BalBurnBackendExtension.cs | 26 ++++- src/wixext/BalCompiler.cs | 86 ++++++++++++++++- src/wixext/BalErrors.cs | 12 ++- src/wixext/Tuples/BalTupleDefinitions.cs | 5 + src/wixext/Tuples/WixDncOptionsTuple.cs | 47 +++++++++ src/wixext/bal.xsd | 36 +++++++ src/wixlib/Dnc.wxs | 25 +++++ 17 files changed, 415 insertions(+), 12 deletions(-) create mode 100644 src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/FrameworkDependentBundle.wxs create mode 100644 src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/FrameworkDependentBundle.wxs create mode 100644 src/wixext/Tuples/WixDncOptionsTuple.cs (limited to 'src') diff --git a/src/dnchost/dnchost.cpp b/src/dnchost/dnchost.cpp index 0fad58c1..503537c0 100644 --- a/src/dnchost/dnchost.cpp +++ b/src/dnchost/dnchost.cpp @@ -97,15 +97,22 @@ extern "C" HRESULT WINAPI BootstrapperApplicationCreate( BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application factory."); } - BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading .NET Core SCD bootstrapper application."); + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading .NET Core %ls bootstrapper application.", DNCHOSTTYPE_FDD == vstate.type ? L"FDD" : L"SCD"); hr = vstate.pAppFactory->Create(pArgs, pResults); BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application."); } else // fallback to the prerequisite BA. { - hrHostInitialization = E_DNCHOST_SCD_RUNTIME_FAILURE; - BalLogError(hr, "The self-contained .NET Core runtime failed to load. This is an unrecoverable error."); + if (DNCHOSTTYPE_SCD == vstate.type) + { + hrHostInitialization = E_DNCHOST_SCD_RUNTIME_FAILURE; + BalLogError(hr, "The self-contained .NET Core runtime failed to load. This is an unrecoverable error."); + } + else + { + hrHostInitialization = S_OK; + } BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading prerequisite bootstrapper application because .NET Core host could not be loaded, error: 0x%08x.", hr); hr = CreatePrerequisiteBA(hrHostInitialization, pEngine, vstate.sczAppBase, pArgs, pResults); @@ -166,6 +173,7 @@ static HRESULT LoadDncConfiguration( LPWSTR sczPayloadId = NULL; LPWSTR sczPayloadXPath = NULL; LPWSTR sczPayloadName = NULL; + DWORD dwBool = 0; hr = XmlLoadDocumentFromFile(pArgs->pCommand->wzBootstrapperApplicationDataPath, &pixdManifest); BalExitOnFailure(hr, "Failed to load BalManifest '%ls'", pArgs->pCommand->wzBootstrapperApplicationDataPath); @@ -220,6 +228,26 @@ static HRESULT LoadDncConfiguration( hr = StrAllocConcat(&pState->sczBaFactoryRuntimeConfigPath, L".runtimeconfig.json", 0); BalExitOnFailure(hr, "Failed to concat extension to runtime config path."); + pState->type = DNCHOSTTYPE_FDD; + + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixDncOptions", &pixnHost); + if (S_FALSE == hr) + { + ExitFunction1(hr = S_OK); + } + BalExitOnFailure(hr, "Failed to find WixDncOptions element in bootstrapper application config."); + + hr = XmlGetAttributeNumber(pixnHost, L"SelfContainedDeployment", &dwBool); + if (S_FALSE == hr) + { + hr = S_OK; + } + else if (SUCCEEDED(hr) && dwBool) + { + pState->type = DNCHOSTTYPE_SCD; + } + BalExitOnFailure(hr, "Failed to get SelfContainedDeployment value."); + LExit: ReleaseStr(sczPayloadName); ReleaseObject(pixnPayload); diff --git a/src/dnchost/dnchost.h b/src/dnchost/dnchost.h index 40c506fc..22fd8f5e 100644 --- a/src/dnchost/dnchost.h +++ b/src/dnchost/dnchost.h @@ -2,6 +2,13 @@ // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. +enum DNCHOSTTYPE +{ + DNCHOSTTYPE_UNKNOWN, + DNCHOSTTYPE_FDD, + DNCHOSTTYPE_SCD, +}; + extern "C" typedef HRESULT(WINAPI* PFN_DNCPREQ_BOOTSTRAPPER_APPLICATION_CREATE)( __in HRESULT hrHostInitialization, __in IBootstrapperEngine* pEngine, @@ -21,6 +28,7 @@ struct DNCSTATE LPWSTR sczBaFactoryAssemblyPath; LPWSTR sczBaFactoryDepsJsonPath; LPWSTR sczBaFactoryRuntimeConfigPath; + DNCHOSTTYPE type; HOSTFXR_STATE hostfxrState; IBootstrapperApplicationFactory* pAppFactory; HMODULE hMbapreqModule; diff --git a/src/test/WixToolsetTest.ManagedHost/DncHostFixture.cs b/src/test/WixToolsetTest.ManagedHost/DncHostFixture.cs index f5714c67..7f40ee26 100644 --- a/src/test/WixToolsetTest.ManagedHost/DncHostFixture.cs +++ b/src/test/WixToolsetTest.ManagedHost/DncHostFixture.cs @@ -9,6 +9,40 @@ namespace WixToolsetTest.ManagedHost public class DncHostFixture { + [Fact] + public void CanLoadFDDEarliestCoreMBA() + { + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var binFolder = Path.Combine(baseFolder, "bin"); + var bundleFile = Path.Combine(binFolder, "FDDEarliestCoreMBA.exe"); + var baSourceFolder = TestData.Get(@"..\examples"); + var bundleSourceFolder = TestData.Get(@"TestData\EarliestCoreMBA"); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + + var compileResult = WixRunner.Execute(new[] + { + "build", + Path.Combine(bundleSourceFolder, "FrameworkDependentBundle.wxs"), + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"), + "-intermediateFolder", intermediateFolder, + "-bindpath", baSourceFolder, + "-burnStub", TestEngine.BurnStubFile, + "-o", bundleFile, + }); + compileResult.AssertSuccess(); + var testEngine = new TestEngine(); + + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder); + var logMessages = result.Output; + Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]); + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]); + Assert.Equal("EarliestCoreBA", logMessages[2]); + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]); + } + } + [Fact] public void CanLoadSCDEarliestCoreMBA() { @@ -119,6 +153,79 @@ namespace WixToolsetTest.ManagedHost } } + [Fact] + public void CanLoadFDDLatestCoreMBA() + { + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var binFolder = Path.Combine(baseFolder, "bin"); + var bundleFile = Path.Combine(binFolder, "FDDLatestCoreMBA.exe"); + var baSourceFolder = TestData.Get(@"..\examples"); + var bundleSourceFolder = TestData.Get(@"TestData\LatestCoreMBA"); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + + var compileResult = WixRunner.Execute(new[] + { + "build", + Path.Combine(bundleSourceFolder, "FrameworkDependentBundle.wxs"), + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"), + "-intermediateFolder", intermediateFolder, + "-bindpath", baSourceFolder, + "-burnStub", TestEngine.BurnStubFile, + "-o", bundleFile, + }); + compileResult.AssertSuccess(); + var testEngine = new TestEngine(); + + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder); + var logMessages = result.Output; + Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]); + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]); + Assert.Equal("LatestCoreBA", logMessages[2]); + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]); + } + } + + [Fact] + public void CanReloadFDDLatestCoreMBA() + { + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var binFolder = Path.Combine(baseFolder, "bin"); + var bundleFile = Path.Combine(binFolder, "FDDLatestCoreMBA.exe"); + var baSourceFolder = TestData.Get(@"..\examples"); + var bundleSourceFolder = TestData.Get(@"TestData\LatestCoreMBA"); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + + var compileResult = WixRunner.Execute(new[] + { + "build", + Path.Combine(bundleSourceFolder, "FrameworkDependentBundle.wxs"), + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"), + "-intermediateFolder", intermediateFolder, + "-bindpath", baSourceFolder, + "-burnStub", TestEngine.BurnStubFile, + "-o", bundleFile, + }); + compileResult.AssertSuccess(); + var testEngine = new TestEngine(); + + var result = testEngine.RunReloadEngine(bundleFile, baseFolder); + var logMessages = result.Output; + Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[0]); + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]); + Assert.Equal("LatestCoreBA", logMessages[2]); + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]); + Assert.Equal("Loading .NET Core FDD bootstrapper application.", logMessages[4]); + Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]); + Assert.Equal("LatestCoreBA", logMessages[7]); + Assert.Equal("Shutdown,Restart,0", logMessages[8]); + } + } + [Fact] public void CanLoadSCDLatestCoreMBA() { diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/FrameworkDependentBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/FrameworkDependentBundle.wxs new file mode 100644 index 00000000..5cec494d --- /dev/null +++ b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/FrameworkDependentBundle.wxs @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/SelfContainedBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/SelfContainedBundle.wxs index 4f3b2f20..d951ffc6 100644 --- a/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/SelfContainedBundle.wxs +++ b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/SelfContainedBundle.wxs @@ -3,6 +3,7 @@ xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> + diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/TrimmedSelfContainedBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/TrimmedSelfContainedBundle.wxs index 15dc72bb..816524ed 100644 --- a/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/TrimmedSelfContainedBundle.wxs +++ b/src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/TrimmedSelfContainedBundle.wxs @@ -3,6 +3,7 @@ xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> + diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/FrameworkDependentBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/FrameworkDependentBundle.wxs new file mode 100644 index 00000000..22fb3d8b --- /dev/null +++ b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/FrameworkDependentBundle.wxs @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/SelfContainedBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/SelfContainedBundle.wxs index 015cc099..4b0fe38a 100644 --- a/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/SelfContainedBundle.wxs +++ b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/SelfContainedBundle.wxs @@ -3,6 +3,7 @@ xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> + diff --git a/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/TrimmedSelfContainedBundle.wxs b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/TrimmedSelfContainedBundle.wxs index 39e850a8..eee87933 100644 --- a/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/TrimmedSelfContainedBundle.wxs +++ b/src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/TrimmedSelfContainedBundle.wxs @@ -3,6 +3,7 @@ xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal"> + diff --git a/src/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj b/src/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj index 1ea4522b..958c63fc 100644 --- a/src/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj +++ b/src/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj @@ -18,12 +18,14 @@ + + @@ -67,6 +69,7 @@ + diff --git a/src/wixext/BalBurnBackendExtension.cs b/src/wixext/BalBurnBackendExtension.cs index 71cd2d92..c81955be 100644 --- a/src/wixext/BalBurnBackendExtension.cs +++ b/src/wixext/BalBurnBackendExtension.cs @@ -28,15 +28,17 @@ namespace WixToolset.Bal var isStdBA = baId.StartsWith("WixStandardBootstrapperApplication"); var isMBA = baId.StartsWith("ManagedBootstrapperApplicationHost"); + var isDNC = baId.StartsWith("DotNetCoreBootstrapperApplicationHost"); + var isSCD = isDNC && this.VerifySCD(section); - if (isStdBA || isMBA) + if (isStdBA || isMBA || isDNC) { this.VerifyBAFunctions(section); } - if (isMBA) + if (isMBA || (isDNC && !isSCD)) { - this.VerifyPrereqPackages(section); + this.VerifyPrereqPackages(section, isDNC); } } @@ -78,12 +80,13 @@ namespace WixToolset.Bal } } - private void VerifyPrereqPackages(IntermediateSection section) + private void VerifyPrereqPackages(IntermediateSection section, bool isDNC) { var prereqInfoTuples = section.Tuples.OfType().ToList(); if (prereqInfoTuples.Count == 0) { - this.Messaging.Write(BalErrors.MissingPrereq()); + var message = isDNC ? BalErrors.MissingDNCPrereq() : BalErrors.MissingMBAPrereq(); + this.Messaging.Write(message); return; } @@ -115,5 +118,18 @@ namespace WixToolset.Bal } } } + + private bool VerifySCD(IntermediateSection section) + { + var isSCD = false; + + var dncOptions = section.Tuples.OfType().SingleOrDefault(); + if (dncOptions != null) + { + isSCD = dncOptions.SelfContainedDeployment != 0; + } + + return isSCD; + } } } diff --git a/src/wixext/BalCompiler.cs b/src/wixext/BalCompiler.cs index 33400f3b..dfe29bde 100644 --- a/src/wixext/BalCompiler.cs +++ b/src/wixext/BalCompiler.cs @@ -63,6 +63,9 @@ namespace WixToolset.Bal case "WixManagedBootstrapperApplicationHost": this.ParseWixManagedBootstrapperApplicationHostElement(intermediate, section, element); break; + case "WixDotNetCoreBootstrapperApplication": + this.ParseWixDotNetCoreBootstrapperApplicationElement(intermediate, section, element); + break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; @@ -200,7 +203,9 @@ namespace WixToolset.Bal case "BAFactoryAssembly": if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute)) { - section.AddTuple(new WixBalBAFactoryAssemblyTuple(sourceLineNumbers) + // There can only be one. + var id = new Identifier(AccessModifier.Public, "TheBAFactoryAssembly"); + section.AddTuple(new WixBalBAFactoryAssemblyTuple(sourceLineNumbers, id) { PayloadId = payloadId, }); @@ -655,5 +660,84 @@ namespace WixToolset.Bal } } } + + /// + /// Parses a WixDotNetCoreBootstrapperApplication element for Bundles. + /// + /// The element to parse. + private void ParseWixDotNetCoreBootstrapperApplicationElement(Intermediate intermediate, IntermediateSection section, XElement node) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(node); + string logoFile = null; + string themeFile = null; + string localizationFile = null; + var selfContainedDeployment = YesNoType.NotSet; + + foreach (var attrib in node.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "LogoFile": + logoFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "ThemeFile": + themeFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "LocalizationFile": + localizationFile = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "SelfContainedDeployment": + selfContainedDeployment = this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(node, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, node, attrib); + } + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, node); + + if (!this.Messaging.EncounteredError) + { + if (!String.IsNullOrEmpty(logoFile)) + { + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "DncPreqbaLogo")) + { + Value = logoFile, + }); + } + + if (!String.IsNullOrEmpty(themeFile)) + { + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "DncPreqbaThemeXml")) + { + Value = themeFile, + }); + } + + if (!String.IsNullOrEmpty(localizationFile)) + { + section.AddTuple(new WixVariableTuple(sourceLineNumbers, new Identifier(AccessModifier.Public, "DncPreqbaThemeWxl")) + { + Value = localizationFile, + }); + } + + if (YesNoType.Yes == selfContainedDeployment) + { + section.AddTuple(new WixDncOptionsTuple(sourceLineNumbers) + { + SelfContainedDeployment = 1, + }); + } + } + } } } diff --git a/src/wixext/BalErrors.cs b/src/wixext/BalErrors.cs index 5591ae1d..bc0186c1 100644 --- a/src/wixext/BalErrors.cs +++ b/src/wixext/BalErrors.cs @@ -18,9 +18,14 @@ namespace WixToolset.Bal return Message(sourceLineNumbers, Ids.BAFunctionsPayloadRequiredInUXContainer, "The BAFunctions DLL Payload element must be located inside the BootstrapperApplication container."); } - public static Message MissingPrereq() + public static Message MissingDNCPrereq() { - return Message(null, Ids.MissingPrereq, "There must be at least one PrereqPackage when using the ManagedBootstrapperApplicationHost.\nThis is typically done by using the WixNetFxExtension and referencing one of the NetFxAsPrereq package groups."); + return Message(null, Ids.MissingDNCPrereq, "There must be at least one PrereqPackage when using the DotNetCoreBootstrapperApplicationHost with SelfContainedDeployment set to \"no\"."); + } + + public static Message MissingMBAPrereq() + { + return Message(null, Ids.MissingMBAPrereq, "There must be at least one PrereqPackage when using the ManagedBootstrapperApplicationHost.\nThis is typically done by using the WixNetFxExtension and referencing one of the NetFxAsPrereq package groups."); } public static Message MultipleBAFunctions(SourceLineNumber sourceLineNumbers) @@ -46,10 +51,11 @@ namespace WixToolset.Bal public enum Ids { AttributeRequiresPrereqPackage = 6801, - MissingPrereq = 6802, + MissingMBAPrereq = 6802, MultiplePrereqLicenses = 6803, MultipleBAFunctions = 6804, BAFunctionsPayloadRequiredInUXContainer = 6805, + MissingDNCPrereq = 6806, } } } diff --git a/src/wixext/Tuples/BalTupleDefinitions.cs b/src/wixext/Tuples/BalTupleDefinitions.cs index 48199f95..9a294703 100644 --- a/src/wixext/Tuples/BalTupleDefinitions.cs +++ b/src/wixext/Tuples/BalTupleDefinitions.cs @@ -11,6 +11,7 @@ namespace WixToolset.Bal WixBalBAFactoryAssembly, WixBalBAFunctions, WixBalCondition, + WixDncOptions, WixMbaPrereqInformation, WixStdbaOptions, WixStdbaOverridableVariable, @@ -43,6 +44,9 @@ namespace WixToolset.Bal case BalTupleDefinitionType.WixBalCondition: return BalTupleDefinitions.WixBalCondition; + case BalTupleDefinitionType.WixDncOptions: + return BalTupleDefinitions.WixDncOptions; + case BalTupleDefinitionType.WixMbaPrereqInformation: return BalTupleDefinitions.WixMbaPrereqInformation; @@ -62,6 +66,7 @@ namespace WixToolset.Bal WixBalBAFactoryAssembly.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); WixBalBAFunctions.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); WixBalCondition.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); + WixDncOptions.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag); diff --git a/src/wixext/Tuples/WixDncOptionsTuple.cs b/src/wixext/Tuples/WixDncOptionsTuple.cs new file mode 100644 index 00000000..8a36879b --- /dev/null +++ b/src/wixext/Tuples/WixDncOptionsTuple.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Bal +{ + using WixToolset.Data; + using WixToolset.Bal.Tuples; + + public static partial class BalTupleDefinitions + { + public static readonly IntermediateTupleDefinition WixDncOptions = new IntermediateTupleDefinition( + BalTupleDefinitionType.WixDncOptions.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(WixDncOptionsTupleFields.SelfContainedDeployment), IntermediateFieldType.Number), + }, + typeof(WixDncOptionsTuple)); + } +} + +namespace WixToolset.Bal.Tuples +{ + using WixToolset.Data; + + public enum WixDncOptionsTupleFields + { + SelfContainedDeployment, + } + + public class WixDncOptionsTuple : IntermediateTuple + { + public WixDncOptionsTuple() : base(BalTupleDefinitions.WixDncOptions, null, null) + { + } + + public WixDncOptionsTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalTupleDefinitions.WixDncOptions, sourceLineNumber, id) + { + } + + public IntermediateField this[WixDncOptionsTupleFields index] => this.Fields[(int)index]; + + public int SelfContainedDeployment + { + get => this.Fields[(int)WixDncOptionsTupleFields.SelfContainedDeployment].AsNumber(); + set => this.Set((int)WixDncOptionsTupleFields.SelfContainedDeployment, value); + } + } +} \ No newline at end of file diff --git a/src/wixext/bal.xsd b/src/wixext/bal.xsd index 52f9142f..ee1f8cec 100644 --- a/src/wixext/bal.xsd +++ b/src/wixext/bal.xsd @@ -215,6 +215,42 @@ + + + + Configures the DotNetCoreBootstrapperApplicationHost for a Bundle. + + + + + + + + + Source file of the logo graphic. + + + + + Source file of the theme XML. + + + + + Source file of the theme localization .wxl file. + + + + + + Whether the .NET Core BA was published as self-contained (SCD). + If using PublishTrimmed in the .NET Core project, there must be an item group with <TrimmerRootAssembly Include="System.Runtime.Loader" /> + + + + + + diff --git a/src/wixlib/Dnc.wxs b/src/wixlib/Dnc.wxs index a2779c19..2a27050f 100644 --- a/src/wixlib/Dnc.wxs +++ b/src/wixlib/Dnc.wxs @@ -13,6 +13,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3-55-g6feb