@joebigelow / wix / commits / 39e930d9

Add DotNetCoreBootstrapperApplicationHost for an SCD-style .NET Core BA.

Sean Hall committed Apr 29, 2020 at 19:28 UTC 39e930d9aaff250e0fd5019eeedaa40717a6c6fe
46 files changed +2756 -9
Bal.wixext.sln
+56
@@ -13,6 +13,8 @@ Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "bal", "src\wixlib\bal.wixpr
13 EndProject
14 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Bal.wixext", "src\wixext\WixToolset.Bal.wixext.csproj", "{BF720A63-9D7B-456E-B60C-8122852D9FED}"
15 EndProject
16 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixToolset.Dnc.Host", "src\WixToolset.Dnc.Host\WixToolset.Dnc.Host.csproj", "{0D780900-C2FF-4FA2-8CB5-8A19768724C5}"
17 +EndProject
18 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WixToolset.Mba.Host", "src\WixToolset.Mba.Host\WixToolset.Mba.Host.csproj", "{F2BA1935-70FA-4156-B161-FD03850B4FAA}"
19 EndProject
20 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "examples", "examples", "{C70E3534-A018-4D0A-A340-916C9777EEF7}"
@@ -27,6 +29,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.FullFramework4MBA",
29 EndProject
30 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolsetTest.Bal", "src\test\WixToolsetTest.Bal\WixToolsetTest.Bal.csproj", "{89D479FC-20DA-44D8-AE38-48F063223498}"
31 EndProject
32 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.EarliestCoreMBA", "src\test\examples\EarliestCoreMBA\Example.EarliestCoreMBA.csproj", "{1E86D8DF-DABD-4B6E-A812-64CD2040C73A}"
33 +EndProject
34 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dnchost", "src\dnchost\dnchost.vcxproj", "{B6F70281-6583-4138-BB7F-AABFEBBB3CA2}"
35 +EndProject
36 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Example.LatestCoreMBA", "src\test\examples\LatestCoreMBA\Example.LatestCoreMBA.csproj", "{A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}"
37 +EndProject
38 Global
39 GlobalSection(SolutionConfigurationPlatforms) = preSolution
40 Debug|Any CPU = Debug|Any CPU
@@ -89,6 +97,18 @@ Global
97 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x64.Build.0 = Release|Any CPU
98 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x86.ActiveCfg = Release|Any CPU
99 {BF720A63-9D7B-456E-B60C-8122852D9FED}.Release|x86.Build.0 = Release|Any CPU
100 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
101 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
102 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x64.ActiveCfg = Debug|Any CPU
103 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x64.Build.0 = Debug|Any CPU
104 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x86.ActiveCfg = Debug|Any CPU
105 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Debug|x86.Build.0 = Debug|Any CPU
106 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
107 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|Any CPU.Build.0 = Release|Any CPU
108 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x64.ActiveCfg = Release|Any CPU
109 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x64.Build.0 = Release|Any CPU
110 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x86.ActiveCfg = Release|Any CPU
111 + {0D780900-C2FF-4FA2-8CB5-8A19768724C5}.Release|x86.Build.0 = Release|Any CPU
112 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
113 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
114 {F2BA1935-70FA-4156-B161-FD03850B4FAA}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -161,6 +181,40 @@ Global
181 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x64.Build.0 = Release|Any CPU
182 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x86.ActiveCfg = Release|Any CPU
183 {89D479FC-20DA-44D8-AE38-48F063223498}.Release|x86.Build.0 = Release|Any CPU
184 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
185 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|Any CPU.Build.0 = Debug|Any CPU
186 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x64.ActiveCfg = Debug|Any CPU
187 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x64.Build.0 = Debug|Any CPU
188 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x86.ActiveCfg = Debug|Any CPU
189 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Debug|x86.Build.0 = Debug|Any CPU
190 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|Any CPU.ActiveCfg = Release|Any CPU
191 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|Any CPU.Build.0 = Release|Any CPU
192 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x64.ActiveCfg = Release|Any CPU
193 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x64.Build.0 = Release|Any CPU
194 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x86.ActiveCfg = Release|Any CPU
195 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A}.Release|x86.Build.0 = Release|Any CPU
196 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|Any CPU.ActiveCfg = Debug|Win32
197 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|Any CPU.Build.0 = Debug|Win32
198 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x64.ActiveCfg = Debug|Win32
199 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x86.ActiveCfg = Debug|Win32
200 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Debug|x86.Build.0 = Debug|Win32
201 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|Any CPU.ActiveCfg = Release|Win32
202 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|Any CPU.Build.0 = Release|Win32
203 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x64.ActiveCfg = Release|Win32
204 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x86.ActiveCfg = Release|Win32
205 + {B6F70281-6583-4138-BB7F-AABFEBBB3CA2}.Release|x86.Build.0 = Release|Win32
206 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
207 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|Any CPU.Build.0 = Debug|Any CPU
208 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x64.ActiveCfg = Debug|Any CPU
209 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x64.Build.0 = Debug|Any CPU
210 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x86.ActiveCfg = Debug|Any CPU
211 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Debug|x86.Build.0 = Debug|Any CPU
212 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|Any CPU.ActiveCfg = Release|Any CPU
213 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|Any CPU.Build.0 = Release|Any CPU
214 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x64.ActiveCfg = Release|Any CPU
215 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x64.Build.0 = Release|Any CPU
216 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x86.ActiveCfg = Release|Any CPU
217 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618}.Release|x86.Build.0 = Release|Any CPU
218 EndGlobalSection
219 GlobalSection(SolutionProperties) = preSolution
220 HideSolutionNode = FALSE
@@ -169,6 +223,8 @@ Global
223 {CC4236FC-226E-4232-AB50-24CBEC4D314D} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
224 {3D44B67D-A475-49BA-8310-E39F6C117CC9} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
225 {44297646-706D-4508-8E96-1B35B109694C} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
226 + {1E86D8DF-DABD-4B6E-A812-64CD2040C73A} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
227 + {A4247D9D-3CC9-4BE1-B23A-BEC166AF3618} = {C70E3534-A018-4D0A-A340-916C9777EEF7}
228 EndGlobalSection
229 GlobalSection(ExtensibilityGlobals) = postSolution
230 SolutionGuid = {74046961-48BF-467A-A6C2-F886C75CE0BE}
src/Custom.Build.props
+5 -3
@@ -2,8 +2,10 @@
2 <!-- 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. -->
3
4 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 - <PropertyGroup>
6 - <OutputPath Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.csproj' ">$(OutputPath)examples\$(ProjectName)\</OutputPath>
7 - <OutDir Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.vcxproj' ">$(OutDir)examples\$(ProjectName)\</OutDir>
5 + <PropertyGroup Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.csproj' ">
6 + <OutputPath>$(OutputPath)examples\$(ProjectName)\</OutputPath>
7 + </PropertyGroup>
8 + <PropertyGroup Condition="$(ProjectName.StartsWith('Example.')) And '$(MSBuildProjectExtension)'=='.vcxproj' ">
9 + <OutDir>$(OutDir)examples\$(ProjectName)\</OutDir>
10 </PropertyGroup>
11 </Project>
src/WixToolset.Dnc.Host/BootstrapperApplicationFactory.cs new
+87
@@ -0,0 +1,87 @@
1 +// 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.
2 +
3 +namespace WixToolset.Dnc.Host
4 +{
5 + using System;
6 + using System.Linq;
7 + using System.Reflection;
8 + using System.Runtime.InteropServices;
9 +
10 + /// <summary>
11 + /// Entry point for the .NET Core host to create and return the BA to the engine.
12 + /// Reflection is used instead of referencing WixToolset.Mba.Core directly to avoid requiring it in the AssemblyLoadContext.
13 + /// </summary>
14 + public sealed class BootstrapperApplicationFactory : IBootstrapperApplicationFactory
15 + {
16 + private string baFactoryAssemblyName;
17 + private string baFactoryAssemblyPath;
18 +
19 + public BootstrapperApplicationFactory(string baFactoryAssemblyName, string baFactoryAssemblyPath)
20 + {
21 + this.baFactoryAssemblyName = baFactoryAssemblyName;
22 + this.baFactoryAssemblyPath = baFactoryAssemblyPath;
23 + }
24 +
25 + /// <summary>
26 + /// Loads the bootstrapper application assembly and calls its IBootstrapperApplicationFactory.Create method.
27 + /// </summary>
28 + /// <param name="pArgs">Pointer to BOOTSTRAPPER_CREATE_ARGS struct.</param>
29 + /// <param name="pResults">Pointer to BOOTSTRAPPER_CREATE_RESULTS struct.</param>
30 + /// <exception cref="MissingAttributeException">The bootstrapper application assembly
31 + /// does not define the <see cref="BootstrapperApplicationFactoryAttribute"/>.</exception>
32 + public void Create(IntPtr pArgs, IntPtr pResults)
33 + {
34 + // Load the BA's IBootstrapperApplicationFactory.
35 + var baFactoryType = BootstrapperApplicationFactory.GetBAFactoryTypeFromAssembly(this.baFactoryAssemblyName, this.baFactoryAssemblyPath);
36 + var baFactory = Activator.CreateInstance(baFactoryType);
37 + if (null == baFactory)
38 + {
39 + throw new InvalidBootstrapperApplicationFactoryException();
40 + }
41 +
42 + var createMethod = baFactoryType.GetMethod(nameof(Create), new[] { typeof(IntPtr), typeof(IntPtr) });
43 + if (null == createMethod)
44 + {
45 + throw new InvalidBootstrapperApplicationFactoryException();
46 + }
47 + createMethod.Invoke(baFactory, new object[] { pArgs, pResults });
48 + }
49 +
50 + /// <summary>
51 + /// Locates the <see cref="BootstrapperApplicationFactoryAttribute"/> and returns the specified type.
52 + /// </summary>
53 + /// <param name="assemblyName">The assembly that defines the IBootstrapperApplicationFactory implementation.</param>
54 + /// <returns>The bootstrapper application factory <see cref="Type"/>.</returns>
55 + private static Type GetBAFactoryTypeFromAssembly(string assemblyName, string assemblyPath)
56 + {
57 + // The default ALC shouldn't need help loading the assembly, since the host should have provided the deps.json
58 + // when starting the runtime. But it doesn't hurt so keep this in case an isolated ALC is ever needed.
59 + var alc = new DnchostAssemblyLoadContext(assemblyPath, false);
60 + var asm = alc.LoadFromAssemblyName(new AssemblyName(assemblyName));
61 +
62 + var attr = asm.GetCustomAttributes()
63 + .Where(a => a.GetType().FullName == "WixToolset.Mba.Core.BootstrapperApplicationFactoryAttribute")
64 + .SingleOrDefault();
65 +
66 + if (null == attr)
67 + {
68 + throw new MissingAttributeException();
69 + }
70 +
71 + var baFactoryTypeProperty = attr.GetType().GetProperty("BootstrapperApplicationFactoryType", typeof(Type));
72 + if (baFactoryTypeProperty == null || baFactoryTypeProperty.GetMethod == null)
73 + {
74 + throw new MissingAttributeException();
75 + }
76 +
77 + var baFactoryType = (Type)baFactoryTypeProperty.GetMethod.Invoke(attr, null);
78 + return baFactoryType;
79 + }
80 +
81 + // Entry point for the DNC host.
82 + public static IBootstrapperApplicationFactory CreateBAFactory([MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyName, [MarshalAs(UnmanagedType.LPWStr)] string baFactoryAssemblyPath)
83 + {
84 + return new BootstrapperApplicationFactory(baFactoryAssemblyName, baFactoryAssemblyPath);
85 + }
86 + }
87 +}
src/WixToolset.Dnc.Host/DnchostAssemblyLoadContext.cs new
+58
@@ -0,0 +1,58 @@
1 +// 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.
2 +
3 +namespace WixToolset.Dnc.Host
4 +{
5 + using System;
6 + using System.Reflection;
7 + using System.Runtime.Loader;
8 +
9 + public sealed class DnchostAssemblyLoadContext : AssemblyLoadContext
10 + {
11 + private readonly AssemblyDependencyResolver resolver;
12 +
13 + public DnchostAssemblyLoadContext(string assemblyPath, bool isolateFromDefault)
14 + : base(nameof(DnchostAssemblyLoadContext), isolateFromDefault)
15 + {
16 + this.resolver = new AssemblyDependencyResolver(assemblyPath);
17 +
18 + if (!this.IsCollectible)
19 + {
20 + AssemblyLoadContext.Default.Resolving += this.ResolveAssembly;
21 + AssemblyLoadContext.Default.ResolvingUnmanagedDll += this.ResolveUnmanagedDll;
22 + }
23 + }
24 +
25 + private Assembly ResolveAssembly(AssemblyLoadContext defaultAlc, AssemblyName assemblyName)
26 + {
27 + var path = this.resolver.ResolveAssemblyToPath(assemblyName);
28 + if (path != null)
29 + {
30 + var targetAlc = this.IsCollectible ? this : defaultAlc;
31 + return targetAlc.LoadFromAssemblyPath(path);
32 + }
33 +
34 + return null;
35 + }
36 +
37 + private IntPtr ResolveUnmanagedDll(Assembly assembly, string unmanagedDllName)
38 + {
39 + var path = this.resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
40 + if (path != null)
41 + {
42 + return this.LoadUnmanagedDllFromPath(path);
43 + }
44 +
45 + return IntPtr.Zero;
46 + }
47 +
48 + protected override Assembly Load(AssemblyName assemblyName)
49 + {
50 + return this.ResolveAssembly(AssemblyLoadContext.Default, assemblyName);
51 + }
52 +
53 + protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
54 + {
55 + return this.ResolveUnmanagedDll(null, unmanagedDllName);
56 + }
57 + }
58 +}
src/WixToolset.Dnc.Host/Exceptions.cs new
+145
@@ -0,0 +1,145 @@
1 +// 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.
2 +
3 +namespace WixToolset.Dnc.Host
4 +{
5 + using System;
6 + using System.Runtime.Serialization;
7 +
8 + /// <summary>
9 + /// Base class for exception returned to the bootstrapper application host.
10 + /// </summary>
11 + [Serializable]
12 + public abstract class BootstrapperException : Exception
13 + {
14 + /// <summary>
15 + /// Creates an instance of the <see cref="BootstrapperException"/> base class with the given HRESULT.
16 + /// </summary>
17 + /// <param name="hr">The HRESULT for the exception that is used by the bootstrapper application host.</param>
18 + public BootstrapperException(int hr)
19 + {
20 + this.HResult = hr;
21 + }
22 +
23 + /// <summary>
24 + /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
25 + /// </summary>
26 + /// <param name="message">Exception message.</param>
27 + public BootstrapperException(string message)
28 + : base(message)
29 + {
30 + }
31 +
32 + /// <summary>
33 + /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
34 + /// </summary>
35 + /// <param name="message">Exception message</param>
36 + /// <param name="innerException">Inner exception associated with this one</param>
37 + public BootstrapperException(string message, Exception innerException)
38 + : base(message, innerException)
39 + {
40 + }
41 +
42 + /// <summary>
43 + /// Initializes a new instance of the <see cref="BootstrapperException"/> class.
44 + /// </summary>
45 + /// <param name="info">Serialization information for this exception</param>
46 + /// <param name="context">Streaming context to serialize to</param>
47 + protected BootstrapperException(SerializationInfo info, StreamingContext context)
48 + : base(info, context)
49 + {
50 + }
51 + }
52 +
53 + /// <summary>
54 + /// The bootstrapper application assembly loaded by the host does not contain exactly one instance of the
55 + /// <see cref="Core.BootstrapperApplicationFactoryAttribute"/> class.
56 + /// </summary>
57 + /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
58 + [Serializable]
59 + public class MissingAttributeException : BootstrapperException
60 + {
61 + /// <summary>
62 + /// Creates a new instance of the <see cref="MissingAttributeException"/> class.
63 + /// </summary>
64 + public MissingAttributeException()
65 + : base(NativeMethods.E_NOTFOUND)
66 + {
67 + }
68 +
69 + /// <summary>
70 + /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
71 + /// </summary>
72 + /// <param name="message">Exception message.</param>
73 + public MissingAttributeException(string message)
74 + : base(message)
75 + {
76 + }
77 +
78 + /// <summary>
79 + /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
80 + /// </summary>
81 + /// <param name="message">Exception message</param>
82 + /// <param name="innerException">Inner exception associated with this one</param>
83 + public MissingAttributeException(string message, Exception innerException)
84 + : base(message, innerException)
85 + {
86 + }
87 +
88 + /// <summary>
89 + /// Initializes a new instance of the <see cref="MissingAttributeException"/> class.
90 + /// </summary>
91 + /// <param name="info">Serialization information for this exception</param>
92 + /// <param name="context">Streaming context to serialize to</param>
93 + protected MissingAttributeException(SerializationInfo info, StreamingContext context)
94 + : base(info, context)
95 + {
96 + }
97 + }
98 +
99 + /// <summary>
100 + /// The bootstrapper application factory specified by the <see cref="Core.BootstrapperApplicationFactoryAttribute"/>
101 + /// does not extend the <see cref="Core.IBootstrapperApplicationFactory"/> base class.
102 + /// </summary>
103 + /// <seealso cref="Core.BaseBootstrapperApplicationFactory"/>
104 + /// <seealso cref="Core.BootstrapperApplicationFactoryAttribute"/>
105 + [Serializable]
106 + public class InvalidBootstrapperApplicationFactoryException : BootstrapperException
107 + {
108 + /// <summary>
109 + /// Creates a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
110 + /// </summary>
111 + public InvalidBootstrapperApplicationFactoryException()
112 + : base(NativeMethods.E_UNEXPECTED)
113 + {
114 + }
115 +
116 + /// <summary>
117 + /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
118 + /// </summary>
119 + /// <param name="message">Exception message.</param>
120 + public InvalidBootstrapperApplicationFactoryException(string message)
121 + : base(message)
122 + {
123 + }
124 +
125 + /// <summary>
126 + /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
127 + /// </summary>
128 + /// <param name="message">Exception message</param>
129 + /// <param name="innerException">Inner exception associated with this one</param>
130 + public InvalidBootstrapperApplicationFactoryException(string message, Exception innerException)
131 + : base(message, innerException)
132 + {
133 + }
134 +
135 + /// <summary>
136 + /// Initializes a new instance of the <see cref="InvalidBootstrapperApplicationFactoryException"/> class.
137 + /// </summary>
138 + /// <param name="info">Serialization information for this exception</param>
139 + /// <param name="context">Streaming context to serialize to</param>
140 + protected InvalidBootstrapperApplicationFactoryException(SerializationInfo info, StreamingContext context)
141 + : base(info, context)
142 + {
143 + }
144 + }
145 +}
src/WixToolset.Dnc.Host/IBootstrapperApplicationFactory.cs new
+16
@@ -0,0 +1,16 @@
1 +// 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.
2 +
3 +namespace WixToolset.Dnc.Host
4 +{
5 + using System;
6 + using System.Runtime.InteropServices;
7 +
8 + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
9 + public interface IBootstrapperApplicationFactory
10 + {
11 + void Create(
12 + IntPtr pArgs,
13 + IntPtr pResults
14 + );
15 + }
16 +}
src/WixToolset.Dnc.Host/NativeMethods.cs new
+18
@@ -0,0 +1,18 @@
1 +// 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.
2 +
3 +namespace WixToolset.Dnc.Host
4 +{
5 + using System;
6 + using System.Runtime.InteropServices;
7 +
8 + /// <summary>
9 + /// Contains native constants, functions, and structures for this assembly.
10 + /// </summary>
11 + internal static class NativeMethods
12 + {
13 + #region Error Constants
14 + internal const int E_NOTFOUND = unchecked((int)0x80070490);
15 + internal const int E_UNEXPECTED = unchecked((int)0x8000ffff);
16 + #endregion
17 + }
18 +}
src/WixToolset.Dnc.Host/WixToolset.Dnc.Host.csproj new
+38
@@ -0,0 +1,38 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<!-- 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. -->
3 +
4 +<Project Sdk="Microsoft.NET.Sdk">
5 + <PropertyGroup>
6 + <TargetFramework>netcoreapp3.0</TargetFramework>
7 + <RootNamespace>WixToolset.Dnc.Host</RootNamespace>
8 + <Description>WiX Toolset .NET Core BA Host</Description>
9 + <Title>WiX Toolset .NET Core BA Host</Title>
10 + </PropertyGroup>
11 +
12 + <ItemGroup>
13 + <HeaderPath Include="$(BaseOutputPath)obj\$(AssemblyName).h">
14 + <Visible>False</Visible>
15 + </HeaderPath>
16 + </ItemGroup>
17 +
18 + <Target Name="GenerateIdentityHeader" AfterTargets="Build" Inputs="$(TargetPath)" Outputs="@(HeaderPath)">
19 + <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
20 + <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
21 + </GetAssemblyIdentity>
22 + <ItemGroup>
23 + <Line Include='#define DNC_ASSEMBLY_FILE_NAME L"$(AssemblyName).dll"' />
24 + <Line Include='#define DNC_ASSEMBLY_FULL_NAME "%(AssemblyIdentity.Identity)"' />
25 + <Line Include='#define DNC_ENTRY_TYPE "$(RootNamespace).BootstrapperApplicationFactory"' />
26 + <Line Include='#define DNC_STATIC_ENTRY_METHOD "CreateBAFactory"' />
27 + </ItemGroup>
28 + <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" />
29 + <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" />
30 + <ItemGroup>
31 + <FileWrites Include="@(HeaderPath)" />
32 + </ItemGroup>
33 + </Target>
34 +
35 + <ItemGroup>
36 + <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
37 + </ItemGroup>
38 +</Project>
src/WixToolset.Mba.Host/BootstrapperApplicationFactory.cs
+2 -1
@@ -9,13 +9,14 @@ namespace WixToolset.Mba.Host
9 using WixToolset.Mba.Core;
10
11 /// <summary>
12 - /// Entry point for the MBA host to create and return the BA to the engine.
12 + /// Entry point for the managed host to create and return the BA to the engine.
13 /// </summary>
14 [ClassInterface(ClassInterfaceType.None)]
15 public sealed class BootstrapperApplicationFactory : MarshalByRefObject, IBootstrapperApplicationFactory
16 {
17 /// <summary>
18 /// Creates a new instance of the <see cref="BootstrapperApplicationFactory"/> class.
19 + /// Entry point for the MBA host.
20 /// </summary>
21 public BootstrapperApplicationFactory()
22 {
src/WixToolset.Mba.Host/WixToolset.Mba.Host.csproj
+3 -3
@@ -60,9 +60,9 @@
60 <Output TaskParameter="Assemblies" ItemName="AssemblyIdentity" />
61 </GetAssemblyIdentity>
62 <ItemGroup>
63 - <Line Include="#define MBA_ASSEMBLY_FULL_NAME L&quot;%(AssemblyIdentity.Identity)&quot;" />
64 - <Line Include="#define MBA_CONFIG_FILE_NAME L&quot;$(AssemblyName).config&quot;" />
65 - <Line Include="#define MBA_ENTRY_TYPE L&quot;$(RootNamespace).BootstrapperApplicationFactory&quot;" />
63 + <Line Include='#define MBA_ASSEMBLY_FULL_NAME L"%(AssemblyIdentity.Identity)"' />
64 + <Line Include='#define MBA_CONFIG_FILE_NAME L"$(AssemblyName).config"' />
65 + <Line Include='#define MBA_ENTRY_TYPE L"$(RootNamespace).BootstrapperApplicationFactory"' />
66 </ItemGroup>
67 <Message Importance="normal" Text="Generating identity definitions into @(HeaderPath->'%(FullPath)')" />
68 <WriteLinesToFile File="@(HeaderPath)" Lines="@(Line)" Overwrite="True" />
src/dnchost/coreclrhost.h new
+137
@@ -0,0 +1,137 @@
1 +// Licensed to the .NET Foundation under one or more agreements.
2 +// The .NET Foundation licenses this file to you under the MIT license.
3 +// See the LICENSE file in the project root for more information.
4 +
5 +
6 +
7 +// ***** ABOUT THIS HEADER *****
8 +// **************************************************************************************
9 +//
10 +// This is the version on 2019-12-22 from
11 +// https://github.com/dotnet/runtime/blob/master/src/coreclr/src/coreclr/hosts/inc/coreclrhost.h
12 +//
13 +// **************************************************************************************
14 +// ****************************
15 +
16 +
17 +//
18 +// APIs for hosting CoreCLR
19 +//
20 +
21 +#ifndef __CORECLR_HOST_H__
22 +#define __CORECLR_HOST_H__
23 +
24 +#if defined(_WIN32) && defined(_M_IX86)
25 +#define CORECLR_CALLING_CONVENTION __stdcall
26 +#else
27 +#define CORECLR_CALLING_CONVENTION
28 +#endif
29 +
30 +// For each hosting API, we define a function prototype and a function pointer
31 +// The prototype is useful for implicit linking against the dynamic coreclr
32 +// library and the pointer for explicit dynamic loading (dlopen, LoadLibrary)
33 +#define CORECLR_HOSTING_API(function, ...) \
34 + extern "C" int CORECLR_CALLING_CONVENTION function(__VA_ARGS__); \
35 + typedef int (CORECLR_CALLING_CONVENTION *function##_ptr)(__VA_ARGS__)
36 +
37 +//
38 +// Initialize the CoreCLR. Creates and starts CoreCLR host and creates an app domain
39 +//
40 +// Parameters:
41 +// exePath - Absolute path of the executable that invoked the ExecuteAssembly (the native host application)
42 +// appDomainFriendlyName - Friendly name of the app domain that will be created to execute the assembly
43 +// propertyCount - Number of properties (elements of the following two arguments)
44 +// propertyKeys - Keys of properties of the app domain
45 +// propertyValues - Values of properties of the app domain
46 +// hostHandle - Output parameter, handle of the created host
47 +// domainId - Output parameter, id of the created app domain
48 +//
49 +// Returns:
50 +// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
51 +//
52 +CORECLR_HOSTING_API(coreclr_initialize,
53 + const char* exePath,
54 + const char* appDomainFriendlyName,
55 + int propertyCount,
56 + const char** propertyKeys,
57 + const char** propertyValues,
58 + void** hostHandle,
59 + unsigned int* domainId);
60 +
61 +//
62 +// Shutdown CoreCLR. It unloads the app domain and stops the CoreCLR host.
63 +//
64 +// Parameters:
65 +// hostHandle - Handle of the host
66 +// domainId - Id of the domain
67 +//
68 +// Returns:
69 +// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
70 +//
71 +CORECLR_HOSTING_API(coreclr_shutdown,
72 + void* hostHandle,
73 + unsigned int domainId);
74 +
75 +//
76 +// Shutdown CoreCLR. It unloads the app domain and stops the CoreCLR host.
77 +//
78 +// Parameters:
79 +// hostHandle - Handle of the host
80 +// domainId - Id of the domain
81 +// latchedExitCode - Latched exit code after domain unloaded
82 +//
83 +// Returns:
84 +// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
85 +//
86 +CORECLR_HOSTING_API(coreclr_shutdown_2,
87 + void* hostHandle,
88 + unsigned int domainId,
89 + int* latchedExitCode);
90 +
91 +//
92 +// Create a native callable function pointer for a managed method.
93 +//
94 +// Parameters:
95 +// hostHandle - Handle of the host
96 +// domainId - Id of the domain
97 +// entryPointAssemblyName - Name of the assembly which holds the custom entry point
98 +// entryPointTypeName - Name of the type which holds the custom entry point
99 +// entryPointMethodName - Name of the method which is the custom entry point
100 +// delegate - Output parameter, the function stores a native callable function pointer to the delegate at the specified address
101 +//
102 +// Returns:
103 +// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
104 +//
105 +CORECLR_HOSTING_API(coreclr_create_delegate,
106 + void* hostHandle,
107 + unsigned int domainId,
108 + const char* entryPointAssemblyName,
109 + const char* entryPointTypeName,
110 + const char* entryPointMethodName,
111 + void** delegate);
112 +
113 +//
114 +// Execute a managed assembly with given arguments
115 +//
116 +// Parameters:
117 +// hostHandle - Handle of the host
118 +// domainId - Id of the domain
119 +// argc - Number of arguments passed to the executed assembly
120 +// argv - Array of arguments passed to the executed assembly
121 +// managedAssemblyPath - Path of the managed assembly to execute (or NULL if using a custom entrypoint).
122 +// exitCode - Exit code returned by the executed assembly
123 +//
124 +// Returns:
125 +// HRESULT indicating status of the operation. S_OK if the assembly was successfully executed
126 +//
127 +CORECLR_HOSTING_API(coreclr_execute_assembly,
128 + void* hostHandle,
129 + unsigned int domainId,
130 + int argc,
131 + const char** argv,
132 + const char* managedAssemblyPath,
133 + unsigned int* exitCode);
134 +
135 +#undef CORECLR_HOSTING_API
136 +
137 +#endif // __CORECLR_HOST_H__
\ No newline at end of file
src/dnchost/dnchost.cpp new
+229
@@ -0,0 +1,229 @@
1 +// 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.
2 +
3 +#include "precomp.h"
4 +
5 +static DNCSTATE vstate = { };
6 +
7 +
8 +// internal function declarations
9 +
10 +static HRESULT LoadModulePaths(
11 + __in DNCSTATE* pState
12 + );
13 +static HRESULT LoadDncConfiguration(
14 + __in DNCSTATE* pState,
15 + __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
16 + );
17 +static HRESULT LoadRuntime(
18 + __in DNCSTATE* pState
19 + );
20 +static HRESULT LoadManagedBootstrapperApplicationFactory(
21 + __in DNCSTATE* pState
22 + );
23 +
24 +
25 +// function definitions
26 +
27 +extern "C" BOOL WINAPI DllMain(
28 + IN HINSTANCE hInstance,
29 + IN DWORD dwReason,
30 + IN LPVOID /* pvReserved */
31 + )
32 +{
33 + switch (dwReason)
34 + {
35 + case DLL_PROCESS_ATTACH:
36 + ::DisableThreadLibraryCalls(hInstance);
37 + vstate.hInstance = hInstance;
38 + break;
39 +
40 + case DLL_PROCESS_DETACH:
41 + vstate.hInstance = NULL;
42 + break;
43 + }
44 +
45 + return TRUE;
46 +}
47 +
48 +extern "C" HRESULT WINAPI BootstrapperApplicationCreate(
49 + __in const BOOTSTRAPPER_CREATE_ARGS* pArgs,
50 + __inout BOOTSTRAPPER_CREATE_RESULTS* pResults
51 + )
52 +{
53 + HRESULT hr = S_OK;
54 + IBootstrapperEngine* pEngine = NULL;
55 +
56 + // coreclr.dll doesn't support unloading, so the rest of the .NET Core hosting stack doesn't support it either.
57 + // This means we also can't unload.
58 + pResults->fDisableUnloading = TRUE;
59 +
60 + hr = BalInitializeFromCreateArgs(pArgs, &pEngine);
61 + ExitOnFailure(hr, "Failed to initialize Bal.");
62 +
63 + if (!vstate.fInitialized)
64 + {
65 + hr = XmlInitialize();
66 + BalExitOnFailure(hr, "Failed to initialize XML.");
67 +
68 + hr = LoadModulePaths(&vstate);
69 + BalExitOnFailure(hr, "Failed to get the host base path.");
70 +
71 + hr = LoadDncConfiguration(&vstate, pArgs);
72 + BalExitOnFailure(hr, "Failed to get the dnc configuration.");
73 +
74 + vstate.fInitialized = TRUE;
75 + }
76 +
77 + if (!vstate.fInitializedRuntime)
78 + {
79 + hr = LoadRuntime(&vstate);
80 + BalExitOnFailure(hr, "Failed to load .NET Core runtime.");
81 +
82 + vstate.fInitializedRuntime = TRUE;
83 +
84 + hr = LoadManagedBootstrapperApplicationFactory(&vstate);
85 + BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application factory.");
86 + }
87 +
88 + BalLog(BOOTSTRAPPER_LOG_LEVEL_STANDARD, "Loading .NET Core SCD bootstrapper application.");
89 +
90 + hr = vstate.pAppFactory->Create(pArgs, pResults);
91 + BalExitOnFailure(hr, "Failed to create the .NET Core bootstrapper application.");
92 +
93 +LExit:
94 + ReleaseNullObject(pEngine);
95 +
96 + return hr;
97 +}
98 +
99 +extern "C" void WINAPI BootstrapperApplicationDestroy()
100 +{
101 + BalUninitialize();
102 +}
103 +
104 +static HRESULT LoadModulePaths(
105 + __in DNCSTATE* pState
106 + )
107 +{
108 + HRESULT hr = S_OK;
109 +
110 + hr = PathForCurrentProcess(&pState->sczModuleFullPath, pState->hInstance);
111 + BalExitOnFailure(hr, "Failed to get the full host path.");
112 +
113 + hr = PathGetDirectory(pState->sczModuleFullPath, &pState->sczAppBase);
114 + BalExitOnFailure(hr, "Failed to get the directory of the full process path.");
115 +
116 + hr = PathConcat(pState->sczAppBase, DNC_ASSEMBLY_FILE_NAME, &pState->sczManagedHostPath);
117 + BalExitOnFailure(hr, "Failed to create managed host path.");
118 +
119 +LExit:
120 + return hr;
121 +}
122 +
123 +static HRESULT LoadDncConfiguration(
124 + __in DNCSTATE* pState,
125 + __in const BOOTSTRAPPER_CREATE_ARGS* pArgs
126 + )
127 +{
128 + HRESULT hr = S_OK;
129 + IXMLDOMDocument* pixdManifest = NULL;
130 + IXMLDOMNode* pixnHost = NULL;
131 + IXMLDOMNode* pixnPayload = NULL;
132 + LPWSTR sczPayloadId = NULL;
133 + LPWSTR sczPayloadXPath = NULL;
134 + LPWSTR sczPayloadName = NULL;
135 +
136 + hr = XmlLoadDocumentFromFile(pArgs->pCommand->wzBootstrapperApplicationDataPath, &pixdManifest);
137 + BalExitOnFailure(hr, "Failed to load BalManifest '%ls'", pArgs->pCommand->wzBootstrapperApplicationDataPath);
138 +
139 + hr = XmlSelectSingleNode(pixdManifest, L"/BootstrapperApplicationData/WixBalBAFactoryAssembly", &pixnHost);
140 + BalExitOnFailure(hr, "Failed to get WixBalBAFactoryAssembly element.");
141 +
142 + if (S_FALSE == hr)
143 + {
144 + hr = E_NOTFOUND;
145 + BalExitOnRootFailure(hr, "Failed to find WixBalBAFactoryAssembly element in bootstrapper application config.");
146 + }
147 +
148 + hr = XmlGetAttributeEx(pixnHost, L"PayloadId", &sczPayloadId);
149 + BalExitOnFailure(hr, "Failed to get WixBalBAFactoryAssembly/@PayloadId.");
150 +
151 + hr = StrAllocFormatted(&sczPayloadXPath, L"/BootstrapperApplicationData/WixPayloadProperties[@Payload='%ls']", sczPayloadId);
152 + BalExitOnFailure(hr, "Failed to format BAFactoryAssembly payload XPath.");
153 +
154 + hr = XmlSelectSingleNode(pixdManifest, sczPayloadXPath, &pixnPayload);
155 + if (S_FALSE == hr)
156 + {
157 + hr = E_NOTFOUND;
158 + }
159 + BalExitOnFailure(hr, "Failed to find WixPayloadProperties node for BAFactoryAssembly PayloadId: %ls.", sczPayloadId);
160 +
161 + hr = XmlGetAttributeEx(pixnPayload, L"Name", &sczPayloadName);
162 + BalExitOnFailure(hr, "Failed to get BAFactoryAssembly payload Name.");
163 +
164 + hr = PathConcat(pArgs->pCommand->wzBootstrapperWorkingFolder, sczPayloadName, &pState->sczBaFactoryAssemblyPath);
165 + BalExitOnFailure(hr, "Failed to create BaFactoryAssemblyPath.");
166 +
167 + LPCWSTR wzFileName = PathFile(pState->sczBaFactoryAssemblyPath);
168 + LPCWSTR wzExtension = PathExtension(pState->sczBaFactoryAssemblyPath);
169 + if (!wzExtension)
170 + {
171 + BalExitOnFailure(hr = E_FAIL, "BaFactoryAssemblyPath has no extension.");
172 + }
173 +
174 + hr = StrAllocString(&pState->sczBaFactoryAssemblyName, wzFileName, wzExtension - wzFileName);
175 + BalExitOnFailure(hr, "Failed to copy BAFactoryAssembly payload Name.");
176 +
177 + hr = StrAllocString(&pState->sczBaFactoryDepsJsonPath, pState->sczBaFactoryAssemblyPath, wzExtension - pState->sczBaFactoryAssemblyPath);
178 + BalExitOnFailure(hr, "Failed to initialize deps json path.");
179 +
180 + hr = StrAllocString(&pState->sczBaFactoryRuntimeConfigPath, pState->sczBaFactoryDepsJsonPath, 0);
181 + BalExitOnFailure(hr, "Failed to initialize runtime config path.");
182 +
183 + hr = StrAllocConcat(&pState->sczBaFactoryDepsJsonPath, L".deps.json", 0);
184 + BalExitOnFailure(hr, "Failed to concat extension to deps json path.");
185 +
186 + hr = StrAllocConcat(&pState->sczBaFactoryRuntimeConfigPath, L".runtimeconfig.json", 0);
187 + BalExitOnFailure(hr, "Failed to concat extension to runtime config path.");
188 +
189 +LExit:
190 + ReleaseStr(sczPayloadName);
191 + ReleaseObject(pixnPayload);
192 + ReleaseStr(sczPayloadXPath);
193 + ReleaseStr(sczPayloadId);
194 + ReleaseObject(pixnHost);
195 + ReleaseObject(pixdManifest);
196 +
197 + return hr;
198 +}
199 +
200 +static HRESULT LoadRuntime(
201 + __in DNCSTATE* pState
202 + )
203 +{
204 + HRESULT hr = S_OK;
205 +
206 + hr = DnchostLoadRuntime(
207 + &pState->hostfxrState,
208 + pState->sczModuleFullPath,
209 + pState->sczManagedHostPath,
210 + pState->sczBaFactoryDepsJsonPath,
211 + pState->sczBaFactoryRuntimeConfigPath);
212 +
213 + return hr;
214 +}
215 +
216 +static HRESULT LoadManagedBootstrapperApplicationFactory(
217 + __in DNCSTATE* pState
218 + )
219 +{
220 + HRESULT hr = S_OK;
221 +
222 + hr = DnchostCreateFactory(
223 + &pState->hostfxrState,
224 + pState->sczBaFactoryAssemblyName,
225 + pState->sczBaFactoryAssemblyPath,
226 + &pState->pAppFactory);
227 +
228 + return hr;
229 +}
src/dnchost/dnchost.def new
+6
@@ -0,0 +1,6 @@
1 +; 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.
2 +
3 +
4 +EXPORTS
5 + BootstrapperApplicationCreate
6 + BootstrapperApplicationDestroy
src/dnchost/dnchost.h new
+19
@@ -0,0 +1,19 @@
1 +#pragma once
2 +// 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.
3 +
4 +
5 +struct DNCSTATE
6 +{
7 + BOOL fInitialized;
8 + BOOL fInitializedRuntime;
9 + HINSTANCE hInstance;
10 + LPWSTR sczModuleFullPath;
11 + LPWSTR sczAppBase;
12 + LPWSTR sczManagedHostPath;
13 + LPWSTR sczBaFactoryAssemblyName;
14 + LPWSTR sczBaFactoryAssemblyPath;
15 + LPWSTR sczBaFactoryDepsJsonPath;
16 + LPWSTR sczBaFactoryRuntimeConfigPath;
17 + HOSTFXR_STATE hostfxrState;
18 + IBootstrapperApplicationFactory* pAppFactory;
19 +};
src/dnchost/dnchost.vcxproj new
+77
@@ -0,0 +1,77 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<!-- 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. -->
3 +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 + <Import Project="..\..\packages\WixToolset.BalUtil.4.0.19\build\WixToolset.BalUtil.props" Condition="Exists('..\..\packages\WixToolset.BalUtil.4.0.19\build\WixToolset.BalUtil.props')" />
5 + <Import Project="..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props" Condition="Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props')" />
6 + <Import Project="..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" />
7 + <ItemGroup Label="ProjectConfigurations">
8 + <ProjectConfiguration Include="Debug|Win32">
9 + <Configuration>Debug</Configuration>
10 + <Platform>Win32</Platform>
11 + </ProjectConfiguration>
12 + <ProjectConfiguration Include="Release|Win32">
13 + <Configuration>Release</Configuration>
14 + <Platform>Win32</Platform>
15 + </ProjectConfiguration>
16 + </ItemGroup>
17 + <PropertyGroup Label="Globals">
18 + <ProjectGuid>{B6F70281-6583-4138-BB7F-AABFEBBB3CA2}</ProjectGuid>
19 + <ConfigurationType>DynamicLibrary</ConfigurationType>
20 + <PlatformToolset>v141</PlatformToolset>
21 + <CharacterSet>Unicode</CharacterSet>
22 + <TargetName>dnchost</TargetName>
23 + <ProjectModuleDefinitionFile>dnchost.def</ProjectModuleDefinitionFile>
24 + </PropertyGroup>
25 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
26 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
27 + <PropertyGroup>
28 + <NetHostPath>..\..\packages\runtime.win-x86.Microsoft.NETCore.DotNetAppHost.3.1.3\runtimes\win-x86\native\</NetHostPath>
29 + <ProjectAdditionalLinkLibraries>shlwapi.lib;$(NetHostPath)nethost.lib</ProjectAdditionalLinkLibraries>
30 + </PropertyGroup>
31 + <ItemGroup>
32 + <ClCompile Include="dnchost.cpp" />
33 + <ClCompile Include="dncutil.cpp" />
34 + <ClCompile Include="precomp.cpp">
35 + <PrecompiledHeader>Create</PrecompiledHeader>
36 + </ClCompile>
37 + </ItemGroup>
38 + <ItemGroup>
39 + <ClInclude Include="coreclrhost.h" />
40 + <ClInclude Include="dnchost.h" />
41 + <ClInclude Include="dncutil.h" />
42 + <ClInclude Include="hostfxr.h" />
43 + <ClInclude Include="precomp.h" />
44 + </ItemGroup>
45 + <ItemGroup>
46 + <None Include="dnchost.def" />
47 + </ItemGroup>
48 + <ItemGroup>
49 + <None Include="packages.config" />
50 + <Content Include="$(NetHostPath)nethost.dll">
51 + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
52 + <Visible>False</Visible>
53 + </Content>
54 + </ItemGroup>
55 + <ItemDefinitionGroup>
56 + <ClCompile>
57 + <AdditionalIncludeDirectories>$(BaseOutputPath)obj;$(NetHostPath);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
58 + </ClCompile>
59 + </ItemDefinitionGroup>
60 + <ItemGroup>
61 + <ProjectReference Include="..\WixToolset.Dnc.Host\WixToolset.Dnc.Host.csproj">
62 + <Project>{0D780900-C2FF-4FA2-8CB5-8A19768724C5}</Project>
63 + <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
64 + </ProjectReference>
65 + </ItemGroup>
66 + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
67 + <Import Project="..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" />
68 + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
69 + <PropertyGroup>
70 + <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
71 + </PropertyGroup>
72 + <Error Condition="!Exists('..\..\packages\WixToolset.BalUtil.4.0.19\build\WixToolset.BalUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BalUtil.4.0.19\build\WixToolset.BalUtil.props'))" />
73 + <Error Condition="!Exists('..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.BootstrapperCore.Native.4.0.15\build\WixToolset.BootstrapperCore.Native.props'))" />
74 + <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.18\build\WixToolset.DUtil.props'))" />
75 + <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.65\build\Nerdbank.GitVersioning.targets'))" />
76 + </Target>
77 +</Project>
\ No newline at end of file
src/dnchost/dncutil.cpp new
+359
@@ -0,0 +1,359 @@
1 +// 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.
2 +
3 +#include "precomp.h"
4 +
5 +// https://github.com/dotnet/runtime/blob/master/src/installer/corehost/error_codes.h
6 +#define HostApiBufferTooSmall 0x80008098
7 +
8 +// internal function declarations
9 +
10 +static HRESULT GetHostfxrPath(
11 + __in HOSTFXR_STATE* pState,
12 + __in LPCWSTR wzNativeHostPath
13 + );
14 +static HRESULT LoadHostfxr(
15 + __in HOSTFXR_STATE* pState
16 + );
17 +static HRESULT InitializeHostfxr(
18 + __in HOSTFXR_STATE* pState,
19 + __in LPCWSTR wzManagedHostPath,
20 + __in LPCWSTR wzDepsJsonPath,
21 + __in LPCWSTR wzRuntimeConfigPath
22 + );
23 +static HRESULT InitializeCoreClr(
24 + __in HOSTFXR_STATE* pState,
25 + __in LPCWSTR wzNativeHostPath
26 + );
27 +static HRESULT LoadCoreClr(
28 + __in HOSTFXR_STATE* pState,
29 + __in LPCWSTR wzCoreClrPath
30 + );
31 +static HRESULT StartCoreClr(
32 + __in HOSTFXR_STATE* pState,
33 + __in LPCWSTR wzNativeHostPath,
34 + __in size_t cProperties,
35 + __in LPCWSTR* propertyKeys,
36 + __in LPCWSTR* propertyValues
37 + );
38 +
39 +
40 +// function definitions
41 +
42 +HRESULT DnchostLoadRuntime(
43 + __in HOSTFXR_STATE* pState,
44 + __in LPCWSTR wzNativeHostPath,
45 + __in LPCWSTR wzManagedHostPath,
46 + __in LPCWSTR wzDepsJsonPath,
47 + __in LPCWSTR wzRuntimeConfigPath
48 + )
49 +{
50 + HRESULT hr = S_OK;
51 +
52 + hr = GetHostfxrPath(pState, wzNativeHostPath);
53 + BalExitOnFailure(hr, "Failed to find hostfxr.");
54 +
55 + hr = LoadHostfxr(pState);
56 + BalExitOnFailure(hr, "Failed to load hostfxr.");
57 +
58 + hr = InitializeHostfxr(pState, wzManagedHostPath, wzDepsJsonPath, wzRuntimeConfigPath);
59 + BalExitOnFailure(hr, "Failed to initialize hostfxr.");
60 +
61 + hr = InitializeCoreClr(pState, wzNativeHostPath);
62 + BalExitOnFailure(hr, "Failed to initialize coreclr.");
63 +
64 +LExit:
65 + return hr;
66 +}
67 +
68 +HRESULT DnchostCreateFactory(
69 + __in HOSTFXR_STATE* pState,
70 + __in LPCWSTR wzBaFactoryAssemblyName,
71 + __in LPCWSTR wzBaFactoryAssemblyPath,
72 + __out IBootstrapperApplicationFactory** ppAppFactory
73 + )
74 +{
75 + HRESULT hr = S_OK;
76 + PFNCREATEBAFACTORY pfnCreateBAFactory = NULL;
77 +
78 + hr = pState->pfnCoreclrCreateDelegate(
79 + pState->pClrHandle,
80 + pState->dwDomainId,
81 + DNC_ASSEMBLY_FULL_NAME,
82 + DNC_ENTRY_TYPE,
83 + DNC_STATIC_ENTRY_METHOD,
84 + reinterpret_cast<void**>(&pfnCreateBAFactory));
85 + BalExitOnFailure(hr, "Failed to create delegate in app domain.");
86 +
87 + *ppAppFactory = pfnCreateBAFactory(wzBaFactoryAssemblyName, wzBaFactoryAssemblyPath);
88 +
89 +LExit:
90 + return hr;
91 +}
92 +
93 +static HRESULT GetHostfxrPath(
94 + __in HOSTFXR_STATE* pState,
95 + __in LPCWSTR wzNativeHostPath
96 + )
97 +{
98 + HRESULT hr = S_OK;
99 + get_hostfxr_parameters getHostfxrParameters = { };
100 + int nrc = 0;
101 + size_t cchHostFxrPath = MAX_PATH;
102 +
103 + getHostfxrParameters.size = sizeof(get_hostfxr_parameters);
104 + getHostfxrParameters.assembly_path = wzNativeHostPath;
105 +
106 + // get_hostfxr_path does a full search on every call, so
107 + // minimize the number of calls
108 + // need to loop
109 + for (;;)
110 + {
111 + cchHostFxrPath *= 2;
112 + hr = StrAlloc(&pState->sczHostfxrPath, cchHostFxrPath);
113 + BalExitOnFailure(hr, "Failed to allocate hostFxrPath.");
114 +
115 + nrc = get_hostfxr_path(pState->sczHostfxrPath, &cchHostFxrPath, &getHostfxrParameters);
116 + if (HostApiBufferTooSmall != nrc)
117 + {
118 + break;
119 + }
120 + }
121 + if (0 != nrc)
122 + {
123 + BalExitOnFailure(hr = nrc, "GetHostfxrPath failed");
124 + }
125 +
126 +LExit:
127 + return hr;
128 +}
129 +
130 +static HRESULT LoadHostfxr(
131 + __in HOSTFXR_STATE* pState
132 + )
133 +{
134 + HRESULT hr = S_OK;
135 + HMODULE hHostfxr;
136 +
137 + hHostfxr = ::LoadLibraryExW(pState->sczHostfxrPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
138 + BalExitOnNullWithLastError(hHostfxr, hr, "Failed to load hostfxr from '%ls'.", pState->sczHostfxrPath);
139 +
140 + pState->pfnHostfxrInitializeForApp = reinterpret_cast<hostfxr_initialize_for_dotnet_command_line_fn>(::GetProcAddress(hHostfxr, "hostfxr_initialize_for_dotnet_command_line"));
141 + BalExitOnNullWithLastError(pState->pfnHostfxrInitializeForApp, hr, "Failed to get procedure address for hostfxr_initialize_for_dotnet_command_line.");
142 +
143 + pState->pfnHostfxrGetRuntimeProperties = reinterpret_cast<hostfxr_get_runtime_properties_fn>(::GetProcAddress(hHostfxr, "hostfxr_get_runtime_properties"));
144 + BalExitOnNullWithLastError(pState->pfnHostfxrGetRuntimeProperties, hr, "Failed to get procedure address for hostfxr_get_runtime_properties.");
145 +
146 + pState->pfnHostfxrSetErrorWriter = reinterpret_cast<hostfxr_set_error_writer_fn>(::GetProcAddress(hHostfxr, "hostfxr_set_error_writer"));
147 + BalExitOnNullWithLastError(pState->pfnHostfxrSetErrorWriter, hr, "Failed to get procedure address for hostfxr_set_error_writer.");
148 +
149 + pState->pfnHostfxrClose = reinterpret_cast<hostfxr_close_fn>(::GetProcAddress(hHostfxr, "hostfxr_close"));
150 + BalExitOnNullWithLastError(pState->pfnHostfxrClose, hr, "Failed to get procedure address for hostfxr_close.");
151 +
152 +LExit:
153 + // Never unload the module since it isn't meant to be unloaded.
154 +
155 + return hr;
156 +}
157 +
158 +static void HOSTFXR_CALLTYPE DnchostErrorWriter(
159 + __in LPCWSTR wzMessage
160 + )
161 +{
162 + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "error from hostfxr: %ls", wzMessage);
163 +}
164 +
165 +static HRESULT InitializeHostfxr(
166 + __in HOSTFXR_STATE* pState,
167 + __in LPCWSTR wzManagedHostPath,
168 + __in LPCWSTR wzDepsJsonPath,
169 + __in LPCWSTR wzRuntimeConfigPath
170 + )
171 +{
172 + HRESULT hr = S_OK;
173 +
174 + pState->pfnHostfxrSetErrorWriter(static_cast<hostfxr_error_writer_fn>(&DnchostErrorWriter));
175 +
176 + LPCWSTR argv[] = {
177 + L"exec",
178 + L"--depsfile",
179 + wzDepsJsonPath,
180 + L"--runtimeconfig",
181 + wzRuntimeConfigPath,
182 + wzManagedHostPath,
183 + };
184 + hr = pState->pfnHostfxrInitializeForApp(sizeof(argv)/sizeof(LPWSTR), argv, NULL, &pState->hostContextHandle);
185 + BalExitOnFailure(hr, "HostfxrInitializeForApp failed");
186 +
187 +LExit:
188 + return hr;
189 +}
190 +
191 +static HRESULT InitializeCoreClr(
192 + __in HOSTFXR_STATE* pState,
193 + __in LPCWSTR wzNativeHostPath
194 + )
195 +{
196 + HRESULT hr = S_OK;
197 + int32_t rc = 0;
198 + LPCWSTR* rgPropertyKeys = NULL;
199 + LPCWSTR* rgPropertyValues = NULL;
200 + size_t cProperties = 0;
201 + LPWSTR* rgDirectories = NULL;
202 + UINT cDirectories = 0;
203 + LPWSTR sczCoreClrPath = NULL;
204 +
205 + // We are not using hostfxr as it was intended to be used. We need to initialize hostfxr so that it properly initializes hostpolicy -
206 + // there are pieces of the framework such as AssemblyDependencyResolver that won't work without that. We also need hostfxr to find a
207 + // compatible framework for framework-dependent deployed BAs. We had to use hostfxr_initialize_for_dotnet_command_line since
208 + // hostfxr_initialize_for_runtime_config doesn't currently (3.x) support self-contained deployed BAs. That means we're supposed to
209 + // start the runtime through hostfxr_run_app, but that method shuts down the runtime before returning. We actually want to call
210 + // hostfxr_get_runtime_delegate, but that method currently requires hostfxr to be initialized through
211 + // hostfxr_initialize_for_runtime_config. So we're forced to locate coreclr.dll and manually load the runtime ourselves.
212 +
213 + // Unfortunately, that's not the only problem. hostfxr has global state that tracks whether it started the runtime. While we keep our
214 + // hostfxr_handle open, everyone that calls the hostfxr_initialize_* methods will block until we have started the runtime through
215 + // hostfxr or closed our handle. If we close the handle, then hostfxr could potentially try to load a second runtime into the
216 + // process, which is not supported. We're going to just keep our handle open since no one else in the process should be trying to
217 + // start the runtime anyway.
218 +
219 + rc = pState->pfnHostfxrGetRuntimeProperties(pState->hostContextHandle, &cProperties, rgPropertyKeys, rgPropertyValues);
220 + if (HostApiBufferTooSmall != rc)
221 + {
222 + BalExitOnFailure(hr = rc, "HostfxrGetRuntimeProperties failed to return required size.");
223 + }
224 +
225 + rgPropertyKeys = static_cast<LPCWSTR*>(MemAlloc(sizeof(LPWSTR) * cProperties, TRUE));
226 + rgPropertyValues = static_cast<LPCWSTR*>(MemAlloc(sizeof(LPWSTR) * cProperties, TRUE));
227 + if (!rgPropertyKeys || !rgPropertyValues)
228 + {
229 + BalExitOnFailure(hr = E_OUTOFMEMORY, "Failed to allocate buffers for runtime properties.");
230 + }
231 +
232 + hr = pState->pfnHostfxrGetRuntimeProperties(pState->hostContextHandle, &cProperties, rgPropertyKeys, rgPropertyValues);
233 + BalExitOnFailure(hr, "HostfxrGetRuntimeProperties failed.");
234 +
235 + for (DWORD i = 0; i < cProperties; ++i)
236 + {
237 + if (CSTR_EQUAL == ::CompareString(LOCALE_INVARIANT, 0, rgPropertyKeys[i], -1, L"NATIVE_DLL_SEARCH_DIRECTORIES", -1))
238 + {
239 + hr = StrSplitAllocArray(&rgDirectories, &cDirectories, rgPropertyValues[i], L";");
240 + BalExitOnFailure(hr, "Failed to split NATIVE_DLL_SEARCH_DIRECTORIES '%ls'", rgPropertyValues[i]);
241 + }
242 + }
243 +
244 + for (DWORD i = 0; i < cDirectories; ++i)
245 + {
246 + hr = PathConcat(rgDirectories[i], L"coreclr.dll", &sczCoreClrPath);
247 + BalExitOnFailure(hr, "Failed to allocate path to coreclr.");
248 +
249 + if (::PathFileExists(sczCoreClrPath))
250 + {
251 + break;
252 + }
253 + else
254 + {
255 + ReleaseNullStr(sczCoreClrPath);
256 + }
257 + }
258 +
259 + if (!sczCoreClrPath)
260 + {
261 + for (DWORD i = 0; i < cProperties; ++i)
262 + {
263 + BalLog(BOOTSTRAPPER_LOG_LEVEL_ERROR, "%ls: %ls", rgPropertyKeys[i], rgPropertyValues[i]);
264 + }
265 + BalExitOnFailure(hr = E_FILENOTFOUND, "Failed to locate coreclr.dll.");
266 + }
267 +
268 + hr = LoadCoreClr(pState, sczCoreClrPath);
269 + BalExitOnFailure(hr, "Failed to load coreclr.");
270 +
271 + hr = StartCoreClr(pState, wzNativeHostPath, cProperties, rgPropertyKeys, rgPropertyValues);
272 + BalExitOnFailure(hr, "Failed to start coreclr.");
273 +
274 +LExit:
275 + MemFree(rgDirectories);
276 + MemFree(rgPropertyValues);
277 + MemFree(rgPropertyKeys);
278 + ReleaseStr(sczCoreClrPath);
279 +
280 + return hr;
281 +}
282 +
283 +static HRESULT LoadCoreClr(
284 + __in HOSTFXR_STATE* pState,
285 + __in LPCWSTR wzCoreClrPath
286 + )
287 +{
288 + HRESULT hr = S_OK;
289 + HMODULE hModule = NULL;
290 +
291 + hModule = ::LoadLibraryExW(wzCoreClrPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
292 + BalExitOnNullWithLastError(hModule, hr, "Failed to load coreclr.dll from '%ls'.", wzCoreClrPath);
293 +
294 + pState->pfnCoreclrInitialize = reinterpret_cast<coreclr_initialize_ptr>(::GetProcAddress(hModule, "coreclr_initialize"));
295 + BalExitOnNullWithLastError(pState->pfnCoreclrInitialize, hr, "Failed to get procedure address for coreclr_initialize.");
296 +
297 + pState->pfnCoreclrCreateDelegate = reinterpret_cast<coreclr_create_delegate_ptr>(::GetProcAddress(hModule, "coreclr_create_delegate"));
298 + BalExitOnNullWithLastError(pState->pfnCoreclrCreateDelegate, hr, "Failed to get procedure address for coreclr_create_delegate.");
299 +
300 +LExit:
301 + // Never unload the module since coreclr doesn't support it.
302 +
303 + return hr;
304 +}
305 +
306 +static HRESULT StartCoreClr(
307 + __in HOSTFXR_STATE* pState,
308 + __in LPCWSTR wzNativeHostPath,
309 + __in size_t cProperties,
310 + __in LPCWSTR* propertyKeys,
311 + __in LPCWSTR* propertyValues
312 + )
313 +{
314 + HRESULT hr = S_OK;
315 + LPSTR szNativeHostPath = NULL;
316 + LPSTR* rgPropertyKeys = NULL;
317 + LPSTR* rgPropertyValues = NULL;
318 +
319 + rgPropertyKeys = static_cast<LPSTR*>(MemAlloc(sizeof(LPSTR) * cProperties, TRUE));
320 + rgPropertyValues = static_cast<LPSTR*>(MemAlloc(sizeof(LPSTR) * cProperties, TRUE));
321 + if (!rgPropertyKeys || !rgPropertyValues)
322 + {
323 + BalExitOnFailure(hr = E_OUTOFMEMORY, "Failed to allocate buffers for runtime properties.");
324 + }
325 +
326 + hr = StrAnsiAllocString(&szNativeHostPath, wzNativeHostPath, 0, CP_UTF8);
327 + BalExitOnFailure(hr, "Failed to convert module path to UTF8: %ls", wzNativeHostPath);
328 +
329 + for (DWORD i = 0; i < cProperties; ++i)
330 + {
331 + hr = StrAnsiAllocString(&rgPropertyKeys[i], propertyKeys[i], 0, CP_UTF8);
332 + BalExitOnFailure(hr, "Failed to convert property key to UTF8: %ls", propertyKeys[i]);
333 +
334 + hr = StrAnsiAllocString(&rgPropertyValues[i], propertyValues[i], 0, CP_UTF8);
335 + BalExitOnFailure(hr, "Failed to convert property value to UTF8: %ls", propertyValues[i]);
336 + }
337 +
338 + hr = pState->pfnCoreclrInitialize(szNativeHostPath, "MBA", cProperties, (LPCSTR*)rgPropertyKeys, (LPCSTR*)rgPropertyValues, &pState->pClrHandle, &pState->dwDomainId);
339 + BalExitOnFailure(hr, "CoreclrInitialize failed.");
340 +
341 +LExit:
342 + for (DWORD i = 0; i < cProperties; ++i)
343 + {
344 + if (rgPropertyKeys)
345 + {
346 + ReleaseStr(rgPropertyKeys[i]);
347 + }
348 +
349 + if (rgPropertyValues)
350 + {
351 + ReleaseStr(rgPropertyValues[i]);
352 + }
353 + }
354 + ReleaseMem(rgPropertyValues);
355 + ReleaseMem(rgPropertyKeys);
356 + ReleaseStr(szNativeHostPath);
357 +
358 + return hr;
359 +}
src/dnchost/dncutil.h new
+36
@@ -0,0 +1,36 @@
1 +#pragma once
2 +// 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.
3 +
4 +typedef IBootstrapperApplicationFactory* (STDMETHODCALLTYPE* PFNCREATEBAFACTORY)(
5 + __in LPCWSTR wzBaFactoryAssemblyName,
6 + __in LPCWSTR wzBaFactoryAssemblyPath
7 + );
8 +
9 +struct HOSTFXR_STATE
10 +{
11 + LPWSTR sczHostfxrPath;
12 + hostfxr_handle hostContextHandle;
13 + hostfxr_initialize_for_dotnet_command_line_fn pfnHostfxrInitializeForApp;
14 + hostfxr_get_runtime_properties_fn pfnHostfxrGetRuntimeProperties;
15 + hostfxr_set_error_writer_fn pfnHostfxrSetErrorWriter;
16 + hostfxr_close_fn pfnHostfxrClose;
17 + coreclr_initialize_ptr pfnCoreclrInitialize;
18 + coreclr_create_delegate_ptr pfnCoreclrCreateDelegate;
19 + void* pClrHandle;
20 + UINT dwDomainId;
21 +};
22 +
23 +HRESULT DnchostLoadRuntime(
24 + __in HOSTFXR_STATE* pState,
25 + __in LPCWSTR wzNativeHostPath,
26 + __in LPCWSTR wzManagedHostPath,
27 + __in LPCWSTR wzDepsJsonPath,
28 + __in LPCWSTR wzRuntimeConfigPath
29 + );
30 +
31 +HRESULT DnchostCreateFactory(
32 + __in HOSTFXR_STATE* pState,
33 + __in LPCWSTR wzBaFactoryAssemblyName,
34 + __in LPCWSTR wzBaFactoryAssemblyPath,
35 + __out IBootstrapperApplicationFactory** ppAppFactory
36 + );
src/dnchost/hostfxr.h new
+96
@@ -0,0 +1,96 @@
1 +// Licensed to the .NET Foundation under one or more agreements.
2 +// The .NET Foundation licenses this file to you under the MIT license.
3 +// See the LICENSE file in the project root for more information.
4 +
5 +
6 +
7 +// ***** ABOUT THIS HEADER *****
8 +// **************************************************************************************
9 +//
10 +// This is the version on 2019-12-22 from
11 +// https://github.com/dotnet/runtime/blob/master/src/installer/corehost/cli/hostfxr.h
12 +//
13 +// **************************************************************************************
14 +// ****************************
15 +
16 +
17 +#ifndef __HOSTFXR_H__
18 +#define __HOSTFXR_H__
19 +
20 +#include <stddef.h>
21 +#include <stdint.h>
22 +
23 +#if defined(_WIN32)
24 + #define HOSTFXR_CALLTYPE __cdecl
25 + #ifdef _WCHAR_T_DEFINED
26 + typedef wchar_t char_t;
27 + #else
28 + typedef unsigned short char_t;
29 + #endif
30 +#else
31 + #define HOSTFXR_CALLTYPE
32 + typedef char char_t;
33 +#endif
34 +
35 +enum hostfxr_delegate_type
36 +{
37 + hdt_com_activation,
38 + hdt_load_in_memory_assembly,
39 + hdt_winrt_activation,
40 + hdt_com_register,
41 + hdt_com_unregister,
42 + hdt_load_assembly_and_get_function_pointer
43 +};
44 +
45 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_main_fn)(const int argc, const char_t **argv);
46 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_main_startupinfo_fn)(
47 + const int argc,
48 + const char_t **argv,
49 + const char_t *host_path,
50 + const char_t *dotnet_root,
51 + const char_t *app_path);
52 +
53 +typedef void(HOSTFXR_CALLTYPE *hostfxr_error_writer_fn)(const char_t *message);
54 +typedef hostfxr_error_writer_fn(HOSTFXR_CALLTYPE *hostfxr_set_error_writer_fn)(hostfxr_error_writer_fn error_writer);
55 +
56 +typedef void* hostfxr_handle;
57 +struct hostfxr_initialize_parameters
58 +{
59 + size_t size;
60 + const char_t *host_path;
61 + const char_t *dotnet_root;
62 +};
63 +
64 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_initialize_for_dotnet_command_line_fn)(
65 + int argc,
66 + const char_t **argv,
67 + const struct hostfxr_initialize_parameters *parameters,
68 + /*out*/ hostfxr_handle *host_context_handle);
69 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_initialize_for_runtime_config_fn)(
70 + const char_t *runtime_config_path,
71 + const struct hostfxr_initialize_parameters *parameters,
72 + /*out*/ hostfxr_handle *host_context_handle);
73 +
74 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_property_value_fn)(
75 + const hostfxr_handle host_context_handle,
76 + const char_t *name,
77 + /*out*/ const char_t **value);
78 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_set_runtime_property_value_fn)(
79 + const hostfxr_handle host_context_handle,
80 + const char_t *name,
81 + const char_t *value);
82 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_properties_fn)(
83 + const hostfxr_handle host_context_handle,
84 + /*inout*/ size_t * count,
85 + /*out*/ const char_t **keys,
86 + /*out*/ const char_t **values);
87 +
88 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_run_app_fn)(const hostfxr_handle host_context_handle);
89 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_get_runtime_delegate_fn)(
90 + const hostfxr_handle host_context_handle,
91 + enum hostfxr_delegate_type type,
92 + /*out*/ void **delegate);
93 +
94 +typedef int32_t(HOSTFXR_CALLTYPE *hostfxr_close_fn)(const hostfxr_handle host_context_handle);
95 +
96 +#endif //__HOSTFXR_H__
\ No newline at end of file
src/dnchost/packages.config new
+8
@@ -0,0 +1,8 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<packages>
3 + <package id="runtime.win-x86.Microsoft.NETCore.DotNetAppHost" version="3.1.3" targetFramework="native" />
4 + <package id="Nerdbank.GitVersioning" version="2.1.65" targetFramework="native" developmentDependency="true" />
5 + <package id="WixToolset.BootstrapperCore.Native" version="4.0.15" targetFramework="native" />
6 + <package id="WixToolset.BalUtil" version="4.0.19" targetFramework="native" />
7 + <package id="WixToolset.DUtil" version="4.0.18" targetFramework="native" />
8 +</packages>
\ No newline at end of file
src/dnchost/precomp.cpp new
+3
@@ -0,0 +1,3 @@
1 +// 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.
2 +
3 +#include "precomp.h"
src/dnchost/precomp.h new
+29
@@ -0,0 +1,29 @@
1 +#pragma once
2 +// 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.
3 +
4 +#include <windows.h>
5 +#include <msiquery.h>
6 +#include <corerror.h>
7 +#include <Shlwapi.h>
8 +
9 +#include <dutil.h>
10 +#include <memutil.h>
11 +#include <pathutil.h>
12 +#include <strutil.h>
13 +#include <xmlutil.h>
14 +
15 +#include <BootstrapperEngine.h>
16 +#include <BootstrapperApplication.h>
17 +
18 +#include <IBootstrapperEngine.h>
19 +#include <IBootstrapperApplication.h>
20 +#include <IBootstrapperApplicationFactory.h>
21 +#include <balutil.h>
22 +
23 +#include <WixToolset.Dnc.Host.h>
24 +#include <nethost.h>
25 +
26 +#include "coreclrhost.h"
27 +#include "hostfxr.h"
28 +#include "dncutil.h"
29 +#include "dnchost.h"
src/test/WixToolsetTest.ManagedHost/DncHostFixture.cs new
+232
@@ -0,0 +1,232 @@
1 +// 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.
2 +
3 +namespace WixToolsetTest.ManagedHost
4 +{
5 + using System.IO;
6 + using WixBuildTools.TestSupport;
7 + using WixToolset.Core.TestPackage;
8 + using Xunit;
9 +
10 + public class DncHostFixture
11 + {
12 + [Fact]
13 + public void CanLoadSCDEarliestCoreMBA()
14 + {
15 + using (var fs = new DisposableFileSystem())
16 + {
17 + var baseFolder = fs.GetFolder();
18 + var binFolder = Path.Combine(baseFolder, "bin");
19 + var bundleFile = Path.Combine(binFolder, "SCDEarliestCoreMBA.exe");
20 + var baSourceFolder = TestData.Get(@"..\examples");
21 + var bundleSourceFolder = TestData.Get(@"TestData\EarliestCoreMBA");
22 + var intermediateFolder = Path.Combine(baseFolder, "obj");
23 +
24 + var compileResult = WixRunner.Execute(new[]
25 + {
26 + "build",
27 + Path.Combine(bundleSourceFolder, "SelfContainedBundle.wxs"),
28 + Path.Combine(bundleSourceFolder, "HarvestedSCD.wxs"),
29 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
30 + "-intermediateFolder", intermediateFolder,
31 + "-bindpath", baSourceFolder,
32 + "-burnStub", TestEngine.BurnStubFile,
33 + "-o", bundleFile,
34 + });
35 + compileResult.AssertSuccess();
36 + var testEngine = new TestEngine();
37 +
38 + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
39 + var logMessages = result.Output;
40 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
41 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
42 + Assert.Equal("EarliestCoreBA", logMessages[2]);
43 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
44 + }
45 + }
46 +
47 + [Fact]
48 + public void CanLoadTrimmedSCDEarliestCoreMBA()
49 + {
50 + using (var fs = new DisposableFileSystem())
51 + {
52 + var baseFolder = fs.GetFolder();
53 + var binFolder = Path.Combine(baseFolder, "bin");
54 + var bundleFile = Path.Combine(binFolder, "TrimmedSCDEarliestCoreMBA.exe");
55 + var baSourceFolder = TestData.Get(@"..\examples");
56 + var bundleSourceFolder = TestData.Get(@"TestData\EarliestCoreMBA");
57 + var intermediateFolder = Path.Combine(baseFolder, "obj");
58 +
59 + var compileResult = WixRunner.Execute(new[]
60 + {
61 + "build",
62 + Path.Combine(bundleSourceFolder, "TrimmedSelfContainedBundle.wxs"),
63 + Path.Combine(bundleSourceFolder, "HarvestedTrimmedSCD.wxs"),
64 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
65 + "-intermediateFolder", intermediateFolder,
66 + "-bindpath", baSourceFolder,
67 + "-burnStub", TestEngine.BurnStubFile,
68 + "-o", bundleFile,
69 + });
70 + compileResult.AssertSuccess();
71 + var testEngine = new TestEngine();
72 +
73 + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
74 + var logMessages = result.Output;
75 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
76 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
77 + Assert.Equal("EarliestCoreBA", logMessages[2]);
78 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
79 + }
80 + }
81 +
82 + [Fact]
83 + public void CanReloadSCDEarliestCoreMBA()
84 + {
85 + using (var fs = new DisposableFileSystem())
86 + {
87 + var baseFolder = fs.GetFolder();
88 + var binFolder = Path.Combine(baseFolder, "bin");
89 + var bundleFile = Path.Combine(binFolder, "SCDEarliestCoreMBA.exe");
90 + var baSourceFolder = TestData.Get(@"..\examples");
91 + var bundleSourceFolder = TestData.Get(@"TestData\EarliestCoreMBA");
92 + var intermediateFolder = Path.Combine(baseFolder, "obj");
93 +
94 + var compileResult = WixRunner.Execute(new[]
95 + {
96 + "build",
97 + Path.Combine(bundleSourceFolder, "SelfContainedBundle.wxs"),
98 + Path.Combine(bundleSourceFolder, "HarvestedSCD.wxs"),
99 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
100 + "-intermediateFolder", intermediateFolder,
101 + "-bindpath", baSourceFolder,
102 + "-burnStub", TestEngine.BurnStubFile,
103 + "-o", bundleFile,
104 + });
105 + compileResult.AssertSuccess();
106 + var testEngine = new TestEngine();
107 +
108 + var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
109 + var logMessages = result.Output;
110 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
111 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
112 + Assert.Equal("EarliestCoreBA", logMessages[2]);
113 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
114 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[4]);
115 + Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading
116 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]);
117 + Assert.Equal("EarliestCoreBA", logMessages[7]);
118 + Assert.Equal("Shutdown,Restart,0", logMessages[8]);
119 + }
120 + }
121 +
122 + [Fact]
123 + public void CanLoadSCDLatestCoreMBA()
124 + {
125 + using (var fs = new DisposableFileSystem())
126 + {
127 + var baseFolder = fs.GetFolder();
128 + var binFolder = Path.Combine(baseFolder, "bin");
129 + var bundleFile = Path.Combine(binFolder, "SCDLatestCoreMBA.exe");
130 + var baSourceFolder = TestData.Get(@"..\examples");
131 + var bundleSourceFolder = TestData.Get(@"TestData\LatestCoreMBA");
132 + var intermediateFolder = Path.Combine(baseFolder, "obj");
133 +
134 + var compileResult = WixRunner.Execute(new[]
135 + {
136 + "build",
137 + Path.Combine(bundleSourceFolder, "SelfContainedBundle.wxs"),
138 + Path.Combine(bundleSourceFolder, "HarvestedSCD.wxs"),
139 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
140 + "-intermediateFolder", intermediateFolder,
141 + "-bindpath", baSourceFolder,
142 + "-burnStub", TestEngine.BurnStubFile,
143 + "-o", bundleFile,
144 + });
145 + compileResult.AssertSuccess();
146 + var testEngine = new TestEngine();
147 +
148 + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
149 + var logMessages = result.Output;
150 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
151 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
152 + Assert.Equal("LatestCoreBA", logMessages[2]);
153 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
154 + }
155 + }
156 +
157 + [Fact]
158 + public void CanLoadTrimmedSCDLatestCoreMBA()
159 + {
160 + using (var fs = new DisposableFileSystem())
161 + {
162 + var baseFolder = fs.GetFolder();
163 + var binFolder = Path.Combine(baseFolder, "bin");
164 + var bundleFile = Path.Combine(binFolder, "TrimmedSCDLatestCoreMBA.exe");
165 + var baSourceFolder = TestData.Get(@"..\examples");
166 + var bundleSourceFolder = TestData.Get(@"TestData\LatestCoreMBA");
167 + var intermediateFolder = Path.Combine(baseFolder, "obj");
168 +
169 + var compileResult = WixRunner.Execute(new[]
170 + {
171 + "build",
172 + Path.Combine(bundleSourceFolder, "TrimmedSelfContainedBundle.wxs"),
173 + Path.Combine(bundleSourceFolder, "HarvestedTrimmedSCD.wxs"),
174 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
175 + "-intermediateFolder", intermediateFolder,
176 + "-bindpath", baSourceFolder,
177 + "-burnStub", TestEngine.BurnStubFile,
178 + "-o", bundleFile,
179 + });
180 + compileResult.AssertSuccess();
181 + var testEngine = new TestEngine();
182 +
183 + var result = testEngine.RunShutdownEngine(bundleFile, baseFolder);
184 + var logMessages = result.Output;
185 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
186 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
187 + Assert.Equal("LatestCoreBA", logMessages[2]);
188 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
189 + }
190 + }
191 +
192 + [Fact]
193 + public void CanReloadSCDLatestCoreMBA()
194 + {
195 + using (var fs = new DisposableFileSystem())
196 + {
197 + var baseFolder = fs.GetFolder();
198 + var binFolder = Path.Combine(baseFolder, "bin");
199 + var bundleFile = Path.Combine(binFolder, "SCDLatestCoreMBA.exe");
200 + var baSourceFolder = TestData.Get(@"..\examples");
201 + var bundleSourceFolder = TestData.Get(@"TestData\LatestCoreMBA");
202 + var intermediateFolder = Path.Combine(baseFolder, "obj");
203 +
204 + var compileResult = WixRunner.Execute(new[]
205 + {
206 + "build",
207 + Path.Combine(bundleSourceFolder, "SelfContainedBundle.wxs"),
208 + Path.Combine(bundleSourceFolder, "HarvestedSCD.wxs"),
209 + "-ext", TestData.Get(@"WixToolset.Bal.wixext.dll"),
210 + "-intermediateFolder", intermediateFolder,
211 + "-bindpath", baSourceFolder,
212 + "-burnStub", TestEngine.BurnStubFile,
213 + "-o", bundleFile,
214 + });
215 + compileResult.AssertSuccess();
216 + var testEngine = new TestEngine();
217 +
218 + var result = testEngine.RunReloadEngine(bundleFile, baseFolder);
219 + var logMessages = result.Output;
220 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[0]);
221 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[1]);
222 + Assert.Equal("LatestCoreBA", logMessages[2]);
223 + Assert.Equal("Shutdown,ReloadBootstrapper,0", logMessages[3]);
224 + Assert.Equal("Loading .NET Core SCD bootstrapper application.", logMessages[4]);
225 + Assert.Equal("Reloaded 1 time(s)", logMessages[5]); // dnchost doesn't currently support unloading
226 + Assert.Equal("Creating BA thread to run asynchronously.", logMessages[6]);
227 + Assert.Equal("LatestCoreBA", logMessages[7]);
228 + Assert.Equal("Shutdown,Restart,0", logMessages[8]);
229 + }
230 + }
231 + }
232 +}
src/test/WixToolsetTest.ManagedHost/HarvestDirectoryToPayloadGroup.ps1 new
+42
@@ -0,0 +1,42 @@
1 +param([string]$RootFolder, [string]$HarvestFolder, [string]$OutputFile)
2 +
3 +function harvestFileToPayload {
4 + param([System.IO.FileInfo]$file, [string]$rootFolder, [string]$harvestFolder)
5 +
6 + $sourceFile = $file.FullName.Substring($rootFolder.Length + 1)
7 + $name = $sourceFile.Substring($harvestFolder.Length + 1)
8 + $payloadContents = "<Payload SourceFile='$sourceFile' Name='$name' />"
9 + $payloadContents
10 +}
11 +
12 +function harvestDirectoryToPayloadGroup {
13 + param([string]$rootFolder, [string]$harvestFolder, [string]$outputFile)
14 +
15 + $beginFileContents = @"
16 +<?xml version="1.0" encoding="utf-8"?>
17 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
18 + <Fragment>
19 + <PayloadGroup Id='
20 +"@
21 +
22 + $endFileContents = @"
23 + </PayloadGroup>
24 + </Fragment>
25 +</Wix>
26 +"@
27 +
28 + $fileContents = $beginFileContents
29 + $payloadGroupId = $harvestFolder.Replace("\", ".")
30 + $fileContents += "$payloadGroupId'>" + [System.Environment]::NewLine
31 +
32 + $targetFolder = [System.IO.Path]::Combine($rootFolder, $harvestFolder)
33 + Get-ChildItem -Path $targetFolder -Recurse -File | ForEach-Object {
34 + $fileContents += ' ' + (harvestFileToPayload -file $_ -rootFolder $rootFolder -harvestFolder $harvestFolder) + [System.Environment]::NewLine
35 + }
36 +
37 + $fileContents += $endFileContents
38 +
39 + [System.IO.File]::WriteAllText($outputFile, $fileContents)
40 +}
41 +
42 +harvestDirectoryToPayloadGroup -rootFolder $RootFolder -harvestFolder $HarvestFolder -outputFile $OutputFile
\ No newline at end of file
src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/HarvestedSCD.wxs new
+235
@@ -0,0 +1,235 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Fragment>
5 + <PayloadGroup Id='publish.Example.EarliestCoreMBA.scd'>
6 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-console-l1-1-0.dll' Name='api-ms-win-core-console-l1-1-0.dll' />
7 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-datetime-l1-1-0.dll' Name='api-ms-win-core-datetime-l1-1-0.dll' />
8 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-debug-l1-1-0.dll' Name='api-ms-win-core-debug-l1-1-0.dll' />
9 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-errorhandling-l1-1-0.dll' Name='api-ms-win-core-errorhandling-l1-1-0.dll' />
10 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-file-l1-1-0.dll' Name='api-ms-win-core-file-l1-1-0.dll' />
11 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-file-l1-2-0.dll' Name='api-ms-win-core-file-l1-2-0.dll' />
12 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-file-l2-1-0.dll' Name='api-ms-win-core-file-l2-1-0.dll' />
13 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-handle-l1-1-0.dll' Name='api-ms-win-core-handle-l1-1-0.dll' />
14 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-heap-l1-1-0.dll' Name='api-ms-win-core-heap-l1-1-0.dll' />
15 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-interlocked-l1-1-0.dll' Name='api-ms-win-core-interlocked-l1-1-0.dll' />
16 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-libraryloader-l1-1-0.dll' Name='api-ms-win-core-libraryloader-l1-1-0.dll' />
17 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-localization-l1-2-0.dll' Name='api-ms-win-core-localization-l1-2-0.dll' />
18 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-memory-l1-1-0.dll' Name='api-ms-win-core-memory-l1-1-0.dll' />
19 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-namedpipe-l1-1-0.dll' Name='api-ms-win-core-namedpipe-l1-1-0.dll' />
20 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-processenvironment-l1-1-0.dll' Name='api-ms-win-core-processenvironment-l1-1-0.dll' />
21 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-processthreads-l1-1-0.dll' Name='api-ms-win-core-processthreads-l1-1-0.dll' />
22 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-processthreads-l1-1-1.dll' Name='api-ms-win-core-processthreads-l1-1-1.dll' />
23 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-profile-l1-1-0.dll' Name='api-ms-win-core-profile-l1-1-0.dll' />
24 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-rtlsupport-l1-1-0.dll' Name='api-ms-win-core-rtlsupport-l1-1-0.dll' />
25 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-string-l1-1-0.dll' Name='api-ms-win-core-string-l1-1-0.dll' />
26 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-synch-l1-1-0.dll' Name='api-ms-win-core-synch-l1-1-0.dll' />
27 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-synch-l1-2-0.dll' Name='api-ms-win-core-synch-l1-2-0.dll' />
28 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-sysinfo-l1-1-0.dll' Name='api-ms-win-core-sysinfo-l1-1-0.dll' />
29 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-timezone-l1-1-0.dll' Name='api-ms-win-core-timezone-l1-1-0.dll' />
30 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-core-util-l1-1-0.dll' Name='api-ms-win-core-util-l1-1-0.dll' />
31 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\API-MS-Win-core-xstate-l2-1-0.dll' Name='API-MS-Win-core-xstate-l2-1-0.dll' />
32 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-conio-l1-1-0.dll' Name='api-ms-win-crt-conio-l1-1-0.dll' />
33 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-convert-l1-1-0.dll' Name='api-ms-win-crt-convert-l1-1-0.dll' />
34 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-environment-l1-1-0.dll' Name='api-ms-win-crt-environment-l1-1-0.dll' />
35 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-filesystem-l1-1-0.dll' Name='api-ms-win-crt-filesystem-l1-1-0.dll' />
36 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-heap-l1-1-0.dll' Name='api-ms-win-crt-heap-l1-1-0.dll' />
37 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-locale-l1-1-0.dll' Name='api-ms-win-crt-locale-l1-1-0.dll' />
38 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-math-l1-1-0.dll' Name='api-ms-win-crt-math-l1-1-0.dll' />
39 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-multibyte-l1-1-0.dll' Name='api-ms-win-crt-multibyte-l1-1-0.dll' />
40 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-private-l1-1-0.dll' Name='api-ms-win-crt-private-l1-1-0.dll' />
41 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-process-l1-1-0.dll' Name='api-ms-win-crt-process-l1-1-0.dll' />
42 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-runtime-l1-1-0.dll' Name='api-ms-win-crt-runtime-l1-1-0.dll' />
43 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-stdio-l1-1-0.dll' Name='api-ms-win-crt-stdio-l1-1-0.dll' />
44 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-string-l1-1-0.dll' Name='api-ms-win-crt-string-l1-1-0.dll' />
45 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-time-l1-1-0.dll' Name='api-ms-win-crt-time-l1-1-0.dll' />
46 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\api-ms-win-crt-utility-l1-1-0.dll' Name='api-ms-win-crt-utility-l1-1-0.dll' />
47 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\clrcompression.dll' Name='clrcompression.dll' />
48 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\clretwrc.dll' Name='clretwrc.dll' />
49 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\clrjit.dll' Name='clrjit.dll' />
50 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\coreclr.dll' Name='coreclr.dll' />
51 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\dbgshim.dll' Name='dbgshim.dll' />
52 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Example.EarliestCoreMBA.deps.json' Name='Example.EarliestCoreMBA.deps.json' />
53 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Example.EarliestCoreMBA.dll' Name='Example.EarliestCoreMBA.dll' bal:BAFactoryAssembly='yes' />
54 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Example.EarliestCoreMBA.pdb' Name='Example.EarliestCoreMBA.pdb' />
55 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Example.EarliestCoreMBA.runtimeconfig.json' Name='Example.EarliestCoreMBA.runtimeconfig.json' />
56 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\hostfxr.dll' Name='hostfxr.dll' />
57 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\hostpolicy.dll' Name='hostpolicy.dll' />
58 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mbanative.dll' Name='mbanative.dll' />
59 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.CSharp.dll' Name='Microsoft.CSharp.dll' />
60 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.DiaSymReader.Native.x86.dll' Name='Microsoft.DiaSymReader.Native.x86.dll' />
61 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.VisualBasic.Core.dll' Name='Microsoft.VisualBasic.Core.dll' />
62 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.VisualBasic.dll' Name='Microsoft.VisualBasic.dll' />
63 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.Win32.Primitives.dll' Name='Microsoft.Win32.Primitives.dll' />
64 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\Microsoft.Win32.Registry.dll' Name='Microsoft.Win32.Registry.dll' />
65 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscordaccore.dll' Name='mscordaccore.dll' />
66 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscordaccore_x86_x86_4.700.19.57202.dll' Name='mscordaccore_x86_x86_4.700.19.57202.dll' />
67 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscordbi.dll' Name='mscordbi.dll' />
68 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscorlib.dll' Name='mscorlib.dll' />
69 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscorrc.debug.dll' Name='mscorrc.debug.dll' />
70 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\mscorrc.dll' Name='mscorrc.dll' />
71 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\netstandard.dll' Name='netstandard.dll' />
72 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\SOS_README.md' Name='SOS_README.md' />
73 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.AppContext.dll' Name='System.AppContext.dll' />
74 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Buffers.dll' Name='System.Buffers.dll' />
75 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Collections.Concurrent.dll' Name='System.Collections.Concurrent.dll' />
76 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Collections.dll' Name='System.Collections.dll' />
77 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Collections.Immutable.dll' Name='System.Collections.Immutable.dll' />
78 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Collections.NonGeneric.dll' Name='System.Collections.NonGeneric.dll' />
79 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Collections.Specialized.dll' Name='System.Collections.Specialized.dll' />
80 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.Annotations.dll' Name='System.ComponentModel.Annotations.dll' />
81 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.DataAnnotations.dll' Name='System.ComponentModel.DataAnnotations.dll' />
82 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.dll' Name='System.ComponentModel.dll' />
83 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.EventBasedAsync.dll' Name='System.ComponentModel.EventBasedAsync.dll' />
84 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.Primitives.dll' Name='System.ComponentModel.Primitives.dll' />
85 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ComponentModel.TypeConverter.dll' Name='System.ComponentModel.TypeConverter.dll' />
86 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Configuration.dll' Name='System.Configuration.dll' />
87 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Console.dll' Name='System.Console.dll' />
88 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Core.dll' Name='System.Core.dll' />
89 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Data.Common.dll' Name='System.Data.Common.dll' />
90 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Data.DataSetExtensions.dll' Name='System.Data.DataSetExtensions.dll' />
91 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Data.dll' Name='System.Data.dll' />
92 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.Contracts.dll' Name='System.Diagnostics.Contracts.dll' />
93 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.Debug.dll' Name='System.Diagnostics.Debug.dll' />
94 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.DiagnosticSource.dll' Name='System.Diagnostics.DiagnosticSource.dll' />
95 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.FileVersionInfo.dll' Name='System.Diagnostics.FileVersionInfo.dll' />
96 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.Process.dll' Name='System.Diagnostics.Process.dll' />
97 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.StackTrace.dll' Name='System.Diagnostics.StackTrace.dll' />
98 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.TextWriterTraceListener.dll' Name='System.Diagnostics.TextWriterTraceListener.dll' />
99 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.Tools.dll' Name='System.Diagnostics.Tools.dll' />
100 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.TraceSource.dll' Name='System.Diagnostics.TraceSource.dll' />
101 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Diagnostics.Tracing.dll' Name='System.Diagnostics.Tracing.dll' />
102 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.dll' Name='System.dll' />
103 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Drawing.dll' Name='System.Drawing.dll' />
104 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Drawing.Primitives.dll' Name='System.Drawing.Primitives.dll' />
105 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Dynamic.Runtime.dll' Name='System.Dynamic.Runtime.dll' />
106 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Globalization.Calendars.dll' Name='System.Globalization.Calendars.dll' />
107 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Globalization.dll' Name='System.Globalization.dll' />
108 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Globalization.Extensions.dll' Name='System.Globalization.Extensions.dll' />
109 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Compression.Brotli.dll' Name='System.IO.Compression.Brotli.dll' />
110 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Compression.dll' Name='System.IO.Compression.dll' />
111 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Compression.FileSystem.dll' Name='System.IO.Compression.FileSystem.dll' />
112 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Compression.ZipFile.dll' Name='System.IO.Compression.ZipFile.dll' />
113 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.dll' Name='System.IO.dll' />
114 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.FileSystem.AccessControl.dll' Name='System.IO.FileSystem.AccessControl.dll' />
115 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.FileSystem.dll' Name='System.IO.FileSystem.dll' />
116 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.FileSystem.DriveInfo.dll' Name='System.IO.FileSystem.DriveInfo.dll' />
117 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.FileSystem.Primitives.dll' Name='System.IO.FileSystem.Primitives.dll' />
118 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.FileSystem.Watcher.dll' Name='System.IO.FileSystem.Watcher.dll' />
119 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.IsolatedStorage.dll' Name='System.IO.IsolatedStorage.dll' />
120 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.MemoryMappedFiles.dll' Name='System.IO.MemoryMappedFiles.dll' />
121 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Pipes.AccessControl.dll' Name='System.IO.Pipes.AccessControl.dll' />
122 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.Pipes.dll' Name='System.IO.Pipes.dll' />
123 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.IO.UnmanagedMemoryStream.dll' Name='System.IO.UnmanagedMemoryStream.dll' />
124 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Linq.dll' Name='System.Linq.dll' />
125 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Linq.Expressions.dll' Name='System.Linq.Expressions.dll' />
126 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Linq.Parallel.dll' Name='System.Linq.Parallel.dll' />
127 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Linq.Queryable.dll' Name='System.Linq.Queryable.dll' />
128 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Memory.dll' Name='System.Memory.dll' />
129 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.dll' Name='System.Net.dll' />
130 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Http.dll' Name='System.Net.Http.dll' />
131 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.HttpListener.dll' Name='System.Net.HttpListener.dll' />
132 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Mail.dll' Name='System.Net.Mail.dll' />
133 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.NameResolution.dll' Name='System.Net.NameResolution.dll' />
134 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.NetworkInformation.dll' Name='System.Net.NetworkInformation.dll' />
135 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Ping.dll' Name='System.Net.Ping.dll' />
136 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Primitives.dll' Name='System.Net.Primitives.dll' />
137 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Requests.dll' Name='System.Net.Requests.dll' />
138 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Security.dll' Name='System.Net.Security.dll' />
139 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.ServicePoint.dll' Name='System.Net.ServicePoint.dll' />
140 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.Sockets.dll' Name='System.Net.Sockets.dll' />
141 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.WebClient.dll' Name='System.Net.WebClient.dll' />
142 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.WebHeaderCollection.dll' Name='System.Net.WebHeaderCollection.dll' />
143 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.WebProxy.dll' Name='System.Net.WebProxy.dll' />
144 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.WebSockets.Client.dll' Name='System.Net.WebSockets.Client.dll' />
145 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Net.WebSockets.dll' Name='System.Net.WebSockets.dll' />
146 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Numerics.dll' Name='System.Numerics.dll' />
147 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Numerics.Vectors.dll' Name='System.Numerics.Vectors.dll' />
148 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ObjectModel.dll' Name='System.ObjectModel.dll' />
149 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Private.CoreLib.dll' Name='System.Private.CoreLib.dll' />
150 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Private.DataContractSerialization.dll' Name='System.Private.DataContractSerialization.dll' />
151 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Private.Uri.dll' Name='System.Private.Uri.dll' />
152 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Private.Xml.dll' Name='System.Private.Xml.dll' />
153 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Private.Xml.Linq.dll' Name='System.Private.Xml.Linq.dll' />
154 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.DispatchProxy.dll' Name='System.Reflection.DispatchProxy.dll' />
155 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.dll' Name='System.Reflection.dll' />
156 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Emit.dll' Name='System.Reflection.Emit.dll' />
157 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Emit.ILGeneration.dll' Name='System.Reflection.Emit.ILGeneration.dll' />
158 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Emit.Lightweight.dll' Name='System.Reflection.Emit.Lightweight.dll' />
159 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Extensions.dll' Name='System.Reflection.Extensions.dll' />
160 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Metadata.dll' Name='System.Reflection.Metadata.dll' />
161 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.Primitives.dll' Name='System.Reflection.Primitives.dll' />
162 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Reflection.TypeExtensions.dll' Name='System.Reflection.TypeExtensions.dll' />
163 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Resources.Reader.dll' Name='System.Resources.Reader.dll' />
164 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Resources.ResourceManager.dll' Name='System.Resources.ResourceManager.dll' />
165 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Resources.Writer.dll' Name='System.Resources.Writer.dll' />
166 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.CompilerServices.Unsafe.dll' Name='System.Runtime.CompilerServices.Unsafe.dll' />
167 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.CompilerServices.VisualC.dll' Name='System.Runtime.CompilerServices.VisualC.dll' />
168 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.dll' Name='System.Runtime.dll' />
169 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Extensions.dll' Name='System.Runtime.Extensions.dll' />
170 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Handles.dll' Name='System.Runtime.Handles.dll' />
171 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.InteropServices.dll' Name='System.Runtime.InteropServices.dll' />
172 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.InteropServices.RuntimeInformation.dll' Name='System.Runtime.InteropServices.RuntimeInformation.dll' />
173 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.InteropServices.WindowsRuntime.dll' Name='System.Runtime.InteropServices.WindowsRuntime.dll' />
174 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Intrinsics.dll' Name='System.Runtime.Intrinsics.dll' />
175 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Loader.dll' Name='System.Runtime.Loader.dll' />
176 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Numerics.dll' Name='System.Runtime.Numerics.dll' />
177 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Serialization.dll' Name='System.Runtime.Serialization.dll' />
178 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Serialization.Formatters.dll' Name='System.Runtime.Serialization.Formatters.dll' />
179 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Serialization.Json.dll' Name='System.Runtime.Serialization.Json.dll' />
180 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Serialization.Primitives.dll' Name='System.Runtime.Serialization.Primitives.dll' />
181 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.Serialization.Xml.dll' Name='System.Runtime.Serialization.Xml.dll' />
182 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.WindowsRuntime.dll' Name='System.Runtime.WindowsRuntime.dll' />
183 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Runtime.WindowsRuntime.UI.Xaml.dll' Name='System.Runtime.WindowsRuntime.UI.Xaml.dll' />
184 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.AccessControl.dll' Name='System.Security.AccessControl.dll' />
185 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Claims.dll' Name='System.Security.Claims.dll' />
186 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.Algorithms.dll' Name='System.Security.Cryptography.Algorithms.dll' />
187 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.Cng.dll' Name='System.Security.Cryptography.Cng.dll' />
188 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.Csp.dll' Name='System.Security.Cryptography.Csp.dll' />
189 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.Encoding.dll' Name='System.Security.Cryptography.Encoding.dll' />
190 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.OpenSsl.dll' Name='System.Security.Cryptography.OpenSsl.dll' />
191 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.Primitives.dll' Name='System.Security.Cryptography.Primitives.dll' />
192 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Cryptography.X509Certificates.dll' Name='System.Security.Cryptography.X509Certificates.dll' />
193 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.dll' Name='System.Security.dll' />
194 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Principal.dll' Name='System.Security.Principal.dll' />
195 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.Principal.Windows.dll' Name='System.Security.Principal.Windows.dll' />
196 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Security.SecureString.dll' Name='System.Security.SecureString.dll' />
197 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ServiceModel.Web.dll' Name='System.ServiceModel.Web.dll' />
198 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ServiceProcess.dll' Name='System.ServiceProcess.dll' />
199 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.Encoding.CodePages.dll' Name='System.Text.Encoding.CodePages.dll' />
200 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.Encoding.dll' Name='System.Text.Encoding.dll' />
201 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.Encoding.Extensions.dll' Name='System.Text.Encoding.Extensions.dll' />
202 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.Encodings.Web.dll' Name='System.Text.Encodings.Web.dll' />
203 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.Json.dll' Name='System.Text.Json.dll' />
204 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Text.RegularExpressions.dll' Name='System.Text.RegularExpressions.dll' />
205 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Channels.dll' Name='System.Threading.Channels.dll' />
206 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.dll' Name='System.Threading.dll' />
207 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Overlapped.dll' Name='System.Threading.Overlapped.dll' />
208 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Tasks.Dataflow.dll' Name='System.Threading.Tasks.Dataflow.dll' />
209 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Tasks.dll' Name='System.Threading.Tasks.dll' />
210 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Tasks.Extensions.dll' Name='System.Threading.Tasks.Extensions.dll' />
211 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Tasks.Parallel.dll' Name='System.Threading.Tasks.Parallel.dll' />
212 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Thread.dll' Name='System.Threading.Thread.dll' />
213 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.ThreadPool.dll' Name='System.Threading.ThreadPool.dll' />
214 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Threading.Timer.dll' Name='System.Threading.Timer.dll' />
215 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Transactions.dll' Name='System.Transactions.dll' />
216 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Transactions.Local.dll' Name='System.Transactions.Local.dll' />
217 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.ValueTuple.dll' Name='System.ValueTuple.dll' />
218 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Web.dll' Name='System.Web.dll' />
219 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Web.HttpUtility.dll' Name='System.Web.HttpUtility.dll' />
220 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Windows.dll' Name='System.Windows.dll' />
221 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.dll' Name='System.Xml.dll' />
222 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.Linq.dll' Name='System.Xml.Linq.dll' />
223 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.ReaderWriter.dll' Name='System.Xml.ReaderWriter.dll' />
224 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.Serialization.dll' Name='System.Xml.Serialization.dll' />
225 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.XDocument.dll' Name='System.Xml.XDocument.dll' />
226 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.XmlDocument.dll' Name='System.Xml.XmlDocument.dll' />
227 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.XmlSerializer.dll' Name='System.Xml.XmlSerializer.dll' />
228 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.XPath.dll' Name='System.Xml.XPath.dll' />
229 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\System.Xml.XPath.XDocument.dll' Name='System.Xml.XPath.XDocument.dll' />
230 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\ucrtbase.dll' Name='ucrtbase.dll' />
231 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\WindowsBase.dll' Name='WindowsBase.dll' />
232 + <Payload SourceFile='publish\Example.EarliestCoreMBA\scd\WixToolset.Mba.Core.dll' Name='WixToolset.Mba.Core.dll' />
233 + </PayloadGroup>
234 + </Fragment>
235 +</Wix>
\ No newline at end of file
src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/HarvestedTrimmedSCD.wxs new
+113
@@ -0,0 +1,113 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Fragment>
5 + <PayloadGroup Id='publish.Example.EarliestCoreMBA.trimmedscd'>
6 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-console-l1-1-0.dll' Name='api-ms-win-core-console-l1-1-0.dll' />
7 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-datetime-l1-1-0.dll' Name='api-ms-win-core-datetime-l1-1-0.dll' />
8 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-debug-l1-1-0.dll' Name='api-ms-win-core-debug-l1-1-0.dll' />
9 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-errorhandling-l1-1-0.dll' Name='api-ms-win-core-errorhandling-l1-1-0.dll' />
10 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-file-l1-1-0.dll' Name='api-ms-win-core-file-l1-1-0.dll' />
11 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-file-l1-2-0.dll' Name='api-ms-win-core-file-l1-2-0.dll' />
12 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-file-l2-1-0.dll' Name='api-ms-win-core-file-l2-1-0.dll' />
13 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-handle-l1-1-0.dll' Name='api-ms-win-core-handle-l1-1-0.dll' />
14 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-heap-l1-1-0.dll' Name='api-ms-win-core-heap-l1-1-0.dll' />
15 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-interlocked-l1-1-0.dll' Name='api-ms-win-core-interlocked-l1-1-0.dll' />
16 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-libraryloader-l1-1-0.dll' Name='api-ms-win-core-libraryloader-l1-1-0.dll' />
17 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-localization-l1-2-0.dll' Name='api-ms-win-core-localization-l1-2-0.dll' />
18 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-memory-l1-1-0.dll' Name='api-ms-win-core-memory-l1-1-0.dll' />
19 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-namedpipe-l1-1-0.dll' Name='api-ms-win-core-namedpipe-l1-1-0.dll' />
20 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-processenvironment-l1-1-0.dll' Name='api-ms-win-core-processenvironment-l1-1-0.dll' />
21 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-processthreads-l1-1-0.dll' Name='api-ms-win-core-processthreads-l1-1-0.dll' />
22 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-processthreads-l1-1-1.dll' Name='api-ms-win-core-processthreads-l1-1-1.dll' />
23 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-profile-l1-1-0.dll' Name='api-ms-win-core-profile-l1-1-0.dll' />
24 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-rtlsupport-l1-1-0.dll' Name='api-ms-win-core-rtlsupport-l1-1-0.dll' />
25 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-string-l1-1-0.dll' Name='api-ms-win-core-string-l1-1-0.dll' />
26 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-synch-l1-1-0.dll' Name='api-ms-win-core-synch-l1-1-0.dll' />
27 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-synch-l1-2-0.dll' Name='api-ms-win-core-synch-l1-2-0.dll' />
28 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-sysinfo-l1-1-0.dll' Name='api-ms-win-core-sysinfo-l1-1-0.dll' />
29 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-timezone-l1-1-0.dll' Name='api-ms-win-core-timezone-l1-1-0.dll' />
30 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-core-util-l1-1-0.dll' Name='api-ms-win-core-util-l1-1-0.dll' />
31 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\API-MS-Win-core-xstate-l2-1-0.dll' Name='API-MS-Win-core-xstate-l2-1-0.dll' />
32 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-conio-l1-1-0.dll' Name='api-ms-win-crt-conio-l1-1-0.dll' />
33 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-convert-l1-1-0.dll' Name='api-ms-win-crt-convert-l1-1-0.dll' />
34 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-environment-l1-1-0.dll' Name='api-ms-win-crt-environment-l1-1-0.dll' />
35 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-filesystem-l1-1-0.dll' Name='api-ms-win-crt-filesystem-l1-1-0.dll' />
36 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-heap-l1-1-0.dll' Name='api-ms-win-crt-heap-l1-1-0.dll' />
37 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-locale-l1-1-0.dll' Name='api-ms-win-crt-locale-l1-1-0.dll' />
38 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-math-l1-1-0.dll' Name='api-ms-win-crt-math-l1-1-0.dll' />
39 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-multibyte-l1-1-0.dll' Name='api-ms-win-crt-multibyte-l1-1-0.dll' />
40 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-private-l1-1-0.dll' Name='api-ms-win-crt-private-l1-1-0.dll' />
41 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-process-l1-1-0.dll' Name='api-ms-win-crt-process-l1-1-0.dll' />
42 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-runtime-l1-1-0.dll' Name='api-ms-win-crt-runtime-l1-1-0.dll' />
43 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-stdio-l1-1-0.dll' Name='api-ms-win-crt-stdio-l1-1-0.dll' />
44 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-string-l1-1-0.dll' Name='api-ms-win-crt-string-l1-1-0.dll' />
45 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-time-l1-1-0.dll' Name='api-ms-win-crt-time-l1-1-0.dll' />
46 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\api-ms-win-crt-utility-l1-1-0.dll' Name='api-ms-win-crt-utility-l1-1-0.dll' />
47 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\clrcompression.dll' Name='clrcompression.dll' />
48 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\clretwrc.dll' Name='clretwrc.dll' />
49 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\clrjit.dll' Name='clrjit.dll' />
50 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\coreclr.dll' Name='coreclr.dll' />
51 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\dbgshim.dll' Name='dbgshim.dll' />
52 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Example.EarliestCoreMBA.deps.json' Name='Example.EarliestCoreMBA.deps.json' />
53 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Example.EarliestCoreMBA.dll' Name='Example.EarliestCoreMBA.dll' bal:BAFactoryAssembly='yes' />
54 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Example.EarliestCoreMBA.pdb' Name='Example.EarliestCoreMBA.pdb' />
55 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Example.EarliestCoreMBA.runtimeconfig.json' Name='Example.EarliestCoreMBA.runtimeconfig.json' />
56 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\hostfxr.dll' Name='hostfxr.dll' />
57 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\hostpolicy.dll' Name='hostpolicy.dll' />
58 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mbanative.dll' Name='mbanative.dll' />
59 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Microsoft.DiaSymReader.Native.x86.dll' Name='Microsoft.DiaSymReader.Native.x86.dll' />
60 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\Microsoft.Win32.Primitives.dll' Name='Microsoft.Win32.Primitives.dll' />
61 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mscordaccore.dll' Name='mscordaccore.dll' />
62 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mscordaccore_x86_x86_4.700.19.57202.dll' Name='mscordaccore_x86_x86_4.700.19.57202.dll' />
63 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mscordbi.dll' Name='mscordbi.dll' />
64 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mscorrc.debug.dll' Name='mscorrc.debug.dll' />
65 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\mscorrc.dll' Name='mscorrc.dll' />
66 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\SOS_README.md' Name='SOS_README.md' />
67 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Collections.Concurrent.dll' Name='System.Collections.Concurrent.dll' />
68 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Collections.dll' Name='System.Collections.dll' />
69 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Collections.NonGeneric.dll' Name='System.Collections.NonGeneric.dll' />
70 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Collections.Specialized.dll' Name='System.Collections.Specialized.dll' />
71 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Diagnostics.DiagnosticSource.dll' Name='System.Diagnostics.DiagnosticSource.dll' />
72 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Diagnostics.StackTrace.dll' Name='System.Diagnostics.StackTrace.dll' />
73 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Diagnostics.Tools.dll' Name='System.Diagnostics.Tools.dll' />
74 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.IO.Compression.Brotli.dll' Name='System.IO.Compression.Brotli.dll' />
75 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.IO.Compression.dll' Name='System.IO.Compression.dll' />
76 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.IO.FileSystem.dll' Name='System.IO.FileSystem.dll' />
77 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Linq.dll' Name='System.Linq.dll' />
78 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.Http.dll' Name='System.Net.Http.dll' />
79 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.NameResolution.dll' Name='System.Net.NameResolution.dll' />
80 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.NetworkInformation.dll' Name='System.Net.NetworkInformation.dll' />
81 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.Primitives.dll' Name='System.Net.Primitives.dll' />
82 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.Requests.dll' Name='System.Net.Requests.dll' />
83 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.Security.dll' Name='System.Net.Security.dll' />
84 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.ServicePoint.dll' Name='System.Net.ServicePoint.dll' />
85 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.Sockets.dll' Name='System.Net.Sockets.dll' />
86 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Net.WebHeaderCollection.dll' Name='System.Net.WebHeaderCollection.dll' />
87 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.ObjectModel.dll' Name='System.ObjectModel.dll' />
88 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Private.CoreLib.dll' Name='System.Private.CoreLib.dll' />
89 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Private.Uri.dll' Name='System.Private.Uri.dll' />
90 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Private.Xml.dll' Name='System.Private.Xml.dll' />
91 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Private.Xml.Linq.dll' Name='System.Private.Xml.Linq.dll' />
92 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Reflection.Metadata.dll' Name='System.Reflection.Metadata.dll' />
93 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.CompilerServices.Unsafe.dll' Name='System.Runtime.CompilerServices.Unsafe.dll' />
94 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.dll' Name='System.Runtime.dll' />
95 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.Extensions.dll' Name='System.Runtime.Extensions.dll' />
96 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.Loader.dll' Name='System.Runtime.Loader.dll' />
97 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.Numerics.dll' Name='System.Runtime.Numerics.dll' />
98 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Runtime.Serialization.Formatters.dll' Name='System.Runtime.Serialization.Formatters.dll' />
99 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Claims.dll' Name='System.Security.Claims.dll' />
100 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.Algorithms.dll' Name='System.Security.Cryptography.Algorithms.dll' />
101 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.Cng.dll' Name='System.Security.Cryptography.Cng.dll' />
102 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.Csp.dll' Name='System.Security.Cryptography.Csp.dll' />
103 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.Encoding.dll' Name='System.Security.Cryptography.Encoding.dll' />
104 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.Primitives.dll' Name='System.Security.Cryptography.Primitives.dll' />
105 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Cryptography.X509Certificates.dll' Name='System.Security.Cryptography.X509Certificates.dll' />
106 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Principal.dll' Name='System.Security.Principal.dll' />
107 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Security.Principal.Windows.dll' Name='System.Security.Principal.Windows.dll' />
108 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\System.Text.RegularExpressions.dll' Name='System.Text.RegularExpressions.dll' />
109 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\ucrtbase.dll' Name='ucrtbase.dll' />
110 + <Payload SourceFile='publish\Example.EarliestCoreMBA\trimmedscd\WixToolset.Mba.Core.dll' Name='WixToolset.Mba.Core.dll' />
111 + </PayloadGroup>
112 + </Fragment>
113 +</Wix>
\ No newline at end of file
src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/SelfContainedBundle.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Bundle Name="SCDEarliestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
5 + <BootstrapperApplicationRef Id="DotNetCoreBootstrapperApplicationHost">
6 + <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.scd" />
7 + </BootstrapperApplicationRef>
8 + <Chain>
9 + <ExePackage SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
10 + </Chain>
11 + </Bundle>
12 +</Wix>
src/test/WixToolsetTest.ManagedHost/TestData/EarliestCoreMBA/TrimmedSelfContainedBundle.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Bundle Name="TrimmedSCDEarliestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
5 + <BootstrapperApplicationRef Id="DotNetCoreBootstrapperApplicationHost">
6 + <PayloadGroupRef Id="publish.Example.EarliestCoreMBA.trimmedscd" />
7 + </BootstrapperApplicationRef>
8 + <Chain>
9 + <ExePackage SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
10 + </Chain>
11 + </Bundle>
12 +</Wix>
src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/HarvestedSCD.wxs new
+235
@@ -0,0 +1,235 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Fragment>
5 + <PayloadGroup Id='publish.Example.LatestCoreMBA.scd'>
6 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-console-l1-1-0.dll' Name='api-ms-win-core-console-l1-1-0.dll' />
7 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-datetime-l1-1-0.dll' Name='api-ms-win-core-datetime-l1-1-0.dll' />
8 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-debug-l1-1-0.dll' Name='api-ms-win-core-debug-l1-1-0.dll' />
9 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-errorhandling-l1-1-0.dll' Name='api-ms-win-core-errorhandling-l1-1-0.dll' />
10 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-file-l1-1-0.dll' Name='api-ms-win-core-file-l1-1-0.dll' />
11 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-file-l1-2-0.dll' Name='api-ms-win-core-file-l1-2-0.dll' />
12 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-file-l2-1-0.dll' Name='api-ms-win-core-file-l2-1-0.dll' />
13 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-handle-l1-1-0.dll' Name='api-ms-win-core-handle-l1-1-0.dll' />
14 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-heap-l1-1-0.dll' Name='api-ms-win-core-heap-l1-1-0.dll' />
15 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-interlocked-l1-1-0.dll' Name='api-ms-win-core-interlocked-l1-1-0.dll' />
16 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-libraryloader-l1-1-0.dll' Name='api-ms-win-core-libraryloader-l1-1-0.dll' />
17 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-localization-l1-2-0.dll' Name='api-ms-win-core-localization-l1-2-0.dll' />
18 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-memory-l1-1-0.dll' Name='api-ms-win-core-memory-l1-1-0.dll' />
19 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-namedpipe-l1-1-0.dll' Name='api-ms-win-core-namedpipe-l1-1-0.dll' />
20 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-processenvironment-l1-1-0.dll' Name='api-ms-win-core-processenvironment-l1-1-0.dll' />
21 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-processthreads-l1-1-0.dll' Name='api-ms-win-core-processthreads-l1-1-0.dll' />
22 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-processthreads-l1-1-1.dll' Name='api-ms-win-core-processthreads-l1-1-1.dll' />
23 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-profile-l1-1-0.dll' Name='api-ms-win-core-profile-l1-1-0.dll' />
24 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-rtlsupport-l1-1-0.dll' Name='api-ms-win-core-rtlsupport-l1-1-0.dll' />
25 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-string-l1-1-0.dll' Name='api-ms-win-core-string-l1-1-0.dll' />
26 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-synch-l1-1-0.dll' Name='api-ms-win-core-synch-l1-1-0.dll' />
27 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-synch-l1-2-0.dll' Name='api-ms-win-core-synch-l1-2-0.dll' />
28 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-sysinfo-l1-1-0.dll' Name='api-ms-win-core-sysinfo-l1-1-0.dll' />
29 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-timezone-l1-1-0.dll' Name='api-ms-win-core-timezone-l1-1-0.dll' />
30 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-core-util-l1-1-0.dll' Name='api-ms-win-core-util-l1-1-0.dll' />
31 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\API-MS-Win-core-xstate-l2-1-0.dll' Name='API-MS-Win-core-xstate-l2-1-0.dll' />
32 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-conio-l1-1-0.dll' Name='api-ms-win-crt-conio-l1-1-0.dll' />
33 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-convert-l1-1-0.dll' Name='api-ms-win-crt-convert-l1-1-0.dll' />
34 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-environment-l1-1-0.dll' Name='api-ms-win-crt-environment-l1-1-0.dll' />
35 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-filesystem-l1-1-0.dll' Name='api-ms-win-crt-filesystem-l1-1-0.dll' />
36 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-heap-l1-1-0.dll' Name='api-ms-win-crt-heap-l1-1-0.dll' />
37 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-locale-l1-1-0.dll' Name='api-ms-win-crt-locale-l1-1-0.dll' />
38 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-math-l1-1-0.dll' Name='api-ms-win-crt-math-l1-1-0.dll' />
39 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-multibyte-l1-1-0.dll' Name='api-ms-win-crt-multibyte-l1-1-0.dll' />
40 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-private-l1-1-0.dll' Name='api-ms-win-crt-private-l1-1-0.dll' />
41 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-process-l1-1-0.dll' Name='api-ms-win-crt-process-l1-1-0.dll' />
42 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-runtime-l1-1-0.dll' Name='api-ms-win-crt-runtime-l1-1-0.dll' />
43 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-stdio-l1-1-0.dll' Name='api-ms-win-crt-stdio-l1-1-0.dll' />
44 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-string-l1-1-0.dll' Name='api-ms-win-crt-string-l1-1-0.dll' />
45 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-time-l1-1-0.dll' Name='api-ms-win-crt-time-l1-1-0.dll' />
46 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\api-ms-win-crt-utility-l1-1-0.dll' Name='api-ms-win-crt-utility-l1-1-0.dll' />
47 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\clrcompression.dll' Name='clrcompression.dll' />
48 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\clretwrc.dll' Name='clretwrc.dll' />
49 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\clrjit.dll' Name='clrjit.dll' />
50 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\coreclr.dll' Name='coreclr.dll' />
51 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\dbgshim.dll' Name='dbgshim.dll' />
52 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Example.LatestCoreMBA.deps.json' Name='Example.LatestCoreMBA.deps.json' />
53 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Example.LatestCoreMBA.dll' Name='Example.LatestCoreMBA.dll' bal:BAFactoryAssembly='yes' />
54 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Example.LatestCoreMBA.pdb' Name='Example.LatestCoreMBA.pdb' />
55 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Example.LatestCoreMBA.runtimeconfig.json' Name='Example.LatestCoreMBA.runtimeconfig.json' />
56 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\hostfxr.dll' Name='hostfxr.dll' />
57 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\hostpolicy.dll' Name='hostpolicy.dll' />
58 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mbanative.dll' Name='mbanative.dll' />
59 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.CSharp.dll' Name='Microsoft.CSharp.dll' />
60 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.DiaSymReader.Native.x86.dll' Name='Microsoft.DiaSymReader.Native.x86.dll' />
61 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.VisualBasic.Core.dll' Name='Microsoft.VisualBasic.Core.dll' />
62 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.VisualBasic.dll' Name='Microsoft.VisualBasic.dll' />
63 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.Win32.Primitives.dll' Name='Microsoft.Win32.Primitives.dll' />
64 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\Microsoft.Win32.Registry.dll' Name='Microsoft.Win32.Registry.dll' />
65 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscordaccore.dll' Name='mscordaccore.dll' />
66 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscordaccore_x86_x86_4.700.19.60701.dll' Name='mscordaccore_x86_x86_4.700.19.60701.dll' />
67 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscordbi.dll' Name='mscordbi.dll' />
68 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscorlib.dll' Name='mscorlib.dll' />
69 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscorrc.debug.dll' Name='mscorrc.debug.dll' />
70 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\mscorrc.dll' Name='mscorrc.dll' />
71 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\netstandard.dll' Name='netstandard.dll' />
72 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\SOS_README.md' Name='SOS_README.md' />
73 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.AppContext.dll' Name='System.AppContext.dll' />
74 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Buffers.dll' Name='System.Buffers.dll' />
75 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Collections.Concurrent.dll' Name='System.Collections.Concurrent.dll' />
76 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Collections.dll' Name='System.Collections.dll' />
77 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Collections.Immutable.dll' Name='System.Collections.Immutable.dll' />
78 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Collections.NonGeneric.dll' Name='System.Collections.NonGeneric.dll' />
79 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Collections.Specialized.dll' Name='System.Collections.Specialized.dll' />
80 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.Annotations.dll' Name='System.ComponentModel.Annotations.dll' />
81 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.DataAnnotations.dll' Name='System.ComponentModel.DataAnnotations.dll' />
82 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.dll' Name='System.ComponentModel.dll' />
83 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.EventBasedAsync.dll' Name='System.ComponentModel.EventBasedAsync.dll' />
84 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.Primitives.dll' Name='System.ComponentModel.Primitives.dll' />
85 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ComponentModel.TypeConverter.dll' Name='System.ComponentModel.TypeConverter.dll' />
86 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Configuration.dll' Name='System.Configuration.dll' />
87 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Console.dll' Name='System.Console.dll' />
88 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Core.dll' Name='System.Core.dll' />
89 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Data.Common.dll' Name='System.Data.Common.dll' />
90 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Data.DataSetExtensions.dll' Name='System.Data.DataSetExtensions.dll' />
91 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Data.dll' Name='System.Data.dll' />
92 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.Contracts.dll' Name='System.Diagnostics.Contracts.dll' />
93 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.Debug.dll' Name='System.Diagnostics.Debug.dll' />
94 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.DiagnosticSource.dll' Name='System.Diagnostics.DiagnosticSource.dll' />
95 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.FileVersionInfo.dll' Name='System.Diagnostics.FileVersionInfo.dll' />
96 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.Process.dll' Name='System.Diagnostics.Process.dll' />
97 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.StackTrace.dll' Name='System.Diagnostics.StackTrace.dll' />
98 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.TextWriterTraceListener.dll' Name='System.Diagnostics.TextWriterTraceListener.dll' />
99 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.Tools.dll' Name='System.Diagnostics.Tools.dll' />
100 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.TraceSource.dll' Name='System.Diagnostics.TraceSource.dll' />
101 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Diagnostics.Tracing.dll' Name='System.Diagnostics.Tracing.dll' />
102 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.dll' Name='System.dll' />
103 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Drawing.dll' Name='System.Drawing.dll' />
104 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Drawing.Primitives.dll' Name='System.Drawing.Primitives.dll' />
105 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Dynamic.Runtime.dll' Name='System.Dynamic.Runtime.dll' />
106 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Globalization.Calendars.dll' Name='System.Globalization.Calendars.dll' />
107 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Globalization.dll' Name='System.Globalization.dll' />
108 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Globalization.Extensions.dll' Name='System.Globalization.Extensions.dll' />
109 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Compression.Brotli.dll' Name='System.IO.Compression.Brotli.dll' />
110 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Compression.dll' Name='System.IO.Compression.dll' />
111 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Compression.FileSystem.dll' Name='System.IO.Compression.FileSystem.dll' />
112 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Compression.ZipFile.dll' Name='System.IO.Compression.ZipFile.dll' />
113 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.dll' Name='System.IO.dll' />
114 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.FileSystem.AccessControl.dll' Name='System.IO.FileSystem.AccessControl.dll' />
115 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.FileSystem.dll' Name='System.IO.FileSystem.dll' />
116 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.FileSystem.DriveInfo.dll' Name='System.IO.FileSystem.DriveInfo.dll' />
117 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.FileSystem.Primitives.dll' Name='System.IO.FileSystem.Primitives.dll' />
118 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.FileSystem.Watcher.dll' Name='System.IO.FileSystem.Watcher.dll' />
119 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.IsolatedStorage.dll' Name='System.IO.IsolatedStorage.dll' />
120 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.MemoryMappedFiles.dll' Name='System.IO.MemoryMappedFiles.dll' />
121 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Pipes.AccessControl.dll' Name='System.IO.Pipes.AccessControl.dll' />
122 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.Pipes.dll' Name='System.IO.Pipes.dll' />
123 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.IO.UnmanagedMemoryStream.dll' Name='System.IO.UnmanagedMemoryStream.dll' />
124 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Linq.dll' Name='System.Linq.dll' />
125 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Linq.Expressions.dll' Name='System.Linq.Expressions.dll' />
126 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Linq.Parallel.dll' Name='System.Linq.Parallel.dll' />
127 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Linq.Queryable.dll' Name='System.Linq.Queryable.dll' />
128 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Memory.dll' Name='System.Memory.dll' />
129 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.dll' Name='System.Net.dll' />
130 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Http.dll' Name='System.Net.Http.dll' />
131 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.HttpListener.dll' Name='System.Net.HttpListener.dll' />
132 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Mail.dll' Name='System.Net.Mail.dll' />
133 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.NameResolution.dll' Name='System.Net.NameResolution.dll' />
134 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.NetworkInformation.dll' Name='System.Net.NetworkInformation.dll' />
135 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Ping.dll' Name='System.Net.Ping.dll' />
136 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Primitives.dll' Name='System.Net.Primitives.dll' />
137 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Requests.dll' Name='System.Net.Requests.dll' />
138 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Security.dll' Name='System.Net.Security.dll' />
139 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.ServicePoint.dll' Name='System.Net.ServicePoint.dll' />
140 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.Sockets.dll' Name='System.Net.Sockets.dll' />
141 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.WebClient.dll' Name='System.Net.WebClient.dll' />
142 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.WebHeaderCollection.dll' Name='System.Net.WebHeaderCollection.dll' />
143 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.WebProxy.dll' Name='System.Net.WebProxy.dll' />
144 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.WebSockets.Client.dll' Name='System.Net.WebSockets.Client.dll' />
145 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Net.WebSockets.dll' Name='System.Net.WebSockets.dll' />
146 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Numerics.dll' Name='System.Numerics.dll' />
147 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Numerics.Vectors.dll' Name='System.Numerics.Vectors.dll' />
148 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ObjectModel.dll' Name='System.ObjectModel.dll' />
149 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Private.CoreLib.dll' Name='System.Private.CoreLib.dll' />
150 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Private.DataContractSerialization.dll' Name='System.Private.DataContractSerialization.dll' />
151 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Private.Uri.dll' Name='System.Private.Uri.dll' />
152 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Private.Xml.dll' Name='System.Private.Xml.dll' />
153 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Private.Xml.Linq.dll' Name='System.Private.Xml.Linq.dll' />
154 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.DispatchProxy.dll' Name='System.Reflection.DispatchProxy.dll' />
155 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.dll' Name='System.Reflection.dll' />
156 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Emit.dll' Name='System.Reflection.Emit.dll' />
157 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Emit.ILGeneration.dll' Name='System.Reflection.Emit.ILGeneration.dll' />
158 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Emit.Lightweight.dll' Name='System.Reflection.Emit.Lightweight.dll' />
159 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Extensions.dll' Name='System.Reflection.Extensions.dll' />
160 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Metadata.dll' Name='System.Reflection.Metadata.dll' />
161 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.Primitives.dll' Name='System.Reflection.Primitives.dll' />
162 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Reflection.TypeExtensions.dll' Name='System.Reflection.TypeExtensions.dll' />
163 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Resources.Reader.dll' Name='System.Resources.Reader.dll' />
164 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Resources.ResourceManager.dll' Name='System.Resources.ResourceManager.dll' />
165 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Resources.Writer.dll' Name='System.Resources.Writer.dll' />
166 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.CompilerServices.Unsafe.dll' Name='System.Runtime.CompilerServices.Unsafe.dll' />
167 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.CompilerServices.VisualC.dll' Name='System.Runtime.CompilerServices.VisualC.dll' />
168 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.dll' Name='System.Runtime.dll' />
169 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Extensions.dll' Name='System.Runtime.Extensions.dll' />
170 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Handles.dll' Name='System.Runtime.Handles.dll' />
171 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.InteropServices.dll' Name='System.Runtime.InteropServices.dll' />
172 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.InteropServices.RuntimeInformation.dll' Name='System.Runtime.InteropServices.RuntimeInformation.dll' />
173 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.InteropServices.WindowsRuntime.dll' Name='System.Runtime.InteropServices.WindowsRuntime.dll' />
174 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Intrinsics.dll' Name='System.Runtime.Intrinsics.dll' />
175 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Loader.dll' Name='System.Runtime.Loader.dll' />
176 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Numerics.dll' Name='System.Runtime.Numerics.dll' />
177 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Serialization.dll' Name='System.Runtime.Serialization.dll' />
178 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Serialization.Formatters.dll' Name='System.Runtime.Serialization.Formatters.dll' />
179 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Serialization.Json.dll' Name='System.Runtime.Serialization.Json.dll' />
180 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Serialization.Primitives.dll' Name='System.Runtime.Serialization.Primitives.dll' />
181 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.Serialization.Xml.dll' Name='System.Runtime.Serialization.Xml.dll' />
182 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.WindowsRuntime.dll' Name='System.Runtime.WindowsRuntime.dll' />
183 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Runtime.WindowsRuntime.UI.Xaml.dll' Name='System.Runtime.WindowsRuntime.UI.Xaml.dll' />
184 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.AccessControl.dll' Name='System.Security.AccessControl.dll' />
185 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Claims.dll' Name='System.Security.Claims.dll' />
186 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.Algorithms.dll' Name='System.Security.Cryptography.Algorithms.dll' />
187 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.Cng.dll' Name='System.Security.Cryptography.Cng.dll' />
188 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.Csp.dll' Name='System.Security.Cryptography.Csp.dll' />
189 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.Encoding.dll' Name='System.Security.Cryptography.Encoding.dll' />
190 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.OpenSsl.dll' Name='System.Security.Cryptography.OpenSsl.dll' />
191 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.Primitives.dll' Name='System.Security.Cryptography.Primitives.dll' />
192 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Cryptography.X509Certificates.dll' Name='System.Security.Cryptography.X509Certificates.dll' />
193 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.dll' Name='System.Security.dll' />
194 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Principal.dll' Name='System.Security.Principal.dll' />
195 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.Principal.Windows.dll' Name='System.Security.Principal.Windows.dll' />
196 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Security.SecureString.dll' Name='System.Security.SecureString.dll' />
197 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ServiceModel.Web.dll' Name='System.ServiceModel.Web.dll' />
198 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ServiceProcess.dll' Name='System.ServiceProcess.dll' />
199 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.Encoding.CodePages.dll' Name='System.Text.Encoding.CodePages.dll' />
200 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.Encoding.dll' Name='System.Text.Encoding.dll' />
201 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.Encoding.Extensions.dll' Name='System.Text.Encoding.Extensions.dll' />
202 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.Encodings.Web.dll' Name='System.Text.Encodings.Web.dll' />
203 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.Json.dll' Name='System.Text.Json.dll' />
204 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Text.RegularExpressions.dll' Name='System.Text.RegularExpressions.dll' />
205 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Channels.dll' Name='System.Threading.Channels.dll' />
206 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.dll' Name='System.Threading.dll' />
207 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Overlapped.dll' Name='System.Threading.Overlapped.dll' />
208 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Tasks.Dataflow.dll' Name='System.Threading.Tasks.Dataflow.dll' />
209 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Tasks.dll' Name='System.Threading.Tasks.dll' />
210 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Tasks.Extensions.dll' Name='System.Threading.Tasks.Extensions.dll' />
211 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Tasks.Parallel.dll' Name='System.Threading.Tasks.Parallel.dll' />
212 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Thread.dll' Name='System.Threading.Thread.dll' />
213 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.ThreadPool.dll' Name='System.Threading.ThreadPool.dll' />
214 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Threading.Timer.dll' Name='System.Threading.Timer.dll' />
215 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Transactions.dll' Name='System.Transactions.dll' />
216 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Transactions.Local.dll' Name='System.Transactions.Local.dll' />
217 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.ValueTuple.dll' Name='System.ValueTuple.dll' />
218 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Web.dll' Name='System.Web.dll' />
219 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Web.HttpUtility.dll' Name='System.Web.HttpUtility.dll' />
220 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Windows.dll' Name='System.Windows.dll' />
221 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.dll' Name='System.Xml.dll' />
222 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.Linq.dll' Name='System.Xml.Linq.dll' />
223 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.ReaderWriter.dll' Name='System.Xml.ReaderWriter.dll' />
224 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.Serialization.dll' Name='System.Xml.Serialization.dll' />
225 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.XDocument.dll' Name='System.Xml.XDocument.dll' />
226 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.XmlDocument.dll' Name='System.Xml.XmlDocument.dll' />
227 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.XmlSerializer.dll' Name='System.Xml.XmlSerializer.dll' />
228 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.XPath.dll' Name='System.Xml.XPath.dll' />
229 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\System.Xml.XPath.XDocument.dll' Name='System.Xml.XPath.XDocument.dll' />
230 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\ucrtbase.dll' Name='ucrtbase.dll' />
231 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\WindowsBase.dll' Name='WindowsBase.dll' />
232 + <Payload SourceFile='publish\Example.LatestCoreMBA\scd\WixToolset.Mba.Core.dll' Name='WixToolset.Mba.Core.dll' />
233 + </PayloadGroup>
234 + </Fragment>
235 +</Wix>
\ No newline at end of file
src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/HarvestedTrimmedSCD.wxs new
+113
@@ -0,0 +1,113 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Fragment>
5 + <PayloadGroup Id='publish.Example.LatestCoreMBA.trimmedscd'>
6 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-console-l1-1-0.dll' Name='api-ms-win-core-console-l1-1-0.dll' />
7 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-datetime-l1-1-0.dll' Name='api-ms-win-core-datetime-l1-1-0.dll' />
8 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-debug-l1-1-0.dll' Name='api-ms-win-core-debug-l1-1-0.dll' />
9 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-errorhandling-l1-1-0.dll' Name='api-ms-win-core-errorhandling-l1-1-0.dll' />
10 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-file-l1-1-0.dll' Name='api-ms-win-core-file-l1-1-0.dll' />
11 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-file-l1-2-0.dll' Name='api-ms-win-core-file-l1-2-0.dll' />
12 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-file-l2-1-0.dll' Name='api-ms-win-core-file-l2-1-0.dll' />
13 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-handle-l1-1-0.dll' Name='api-ms-win-core-handle-l1-1-0.dll' />
14 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-heap-l1-1-0.dll' Name='api-ms-win-core-heap-l1-1-0.dll' />
15 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-interlocked-l1-1-0.dll' Name='api-ms-win-core-interlocked-l1-1-0.dll' />
16 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-libraryloader-l1-1-0.dll' Name='api-ms-win-core-libraryloader-l1-1-0.dll' />
17 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-localization-l1-2-0.dll' Name='api-ms-win-core-localization-l1-2-0.dll' />
18 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-memory-l1-1-0.dll' Name='api-ms-win-core-memory-l1-1-0.dll' />
19 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-namedpipe-l1-1-0.dll' Name='api-ms-win-core-namedpipe-l1-1-0.dll' />
20 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-processenvironment-l1-1-0.dll' Name='api-ms-win-core-processenvironment-l1-1-0.dll' />
21 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-processthreads-l1-1-0.dll' Name='api-ms-win-core-processthreads-l1-1-0.dll' />
22 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-processthreads-l1-1-1.dll' Name='api-ms-win-core-processthreads-l1-1-1.dll' />
23 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-profile-l1-1-0.dll' Name='api-ms-win-core-profile-l1-1-0.dll' />
24 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-rtlsupport-l1-1-0.dll' Name='api-ms-win-core-rtlsupport-l1-1-0.dll' />
25 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-string-l1-1-0.dll' Name='api-ms-win-core-string-l1-1-0.dll' />
26 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-synch-l1-1-0.dll' Name='api-ms-win-core-synch-l1-1-0.dll' />
27 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-synch-l1-2-0.dll' Name='api-ms-win-core-synch-l1-2-0.dll' />
28 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-sysinfo-l1-1-0.dll' Name='api-ms-win-core-sysinfo-l1-1-0.dll' />
29 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-timezone-l1-1-0.dll' Name='api-ms-win-core-timezone-l1-1-0.dll' />
30 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-core-util-l1-1-0.dll' Name='api-ms-win-core-util-l1-1-0.dll' />
31 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\API-MS-Win-core-xstate-l2-1-0.dll' Name='API-MS-Win-core-xstate-l2-1-0.dll' />
32 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-conio-l1-1-0.dll' Name='api-ms-win-crt-conio-l1-1-0.dll' />
33 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-convert-l1-1-0.dll' Name='api-ms-win-crt-convert-l1-1-0.dll' />
34 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-environment-l1-1-0.dll' Name='api-ms-win-crt-environment-l1-1-0.dll' />
35 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-filesystem-l1-1-0.dll' Name='api-ms-win-crt-filesystem-l1-1-0.dll' />
36 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-heap-l1-1-0.dll' Name='api-ms-win-crt-heap-l1-1-0.dll' />
37 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-locale-l1-1-0.dll' Name='api-ms-win-crt-locale-l1-1-0.dll' />
38 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-math-l1-1-0.dll' Name='api-ms-win-crt-math-l1-1-0.dll' />
39 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-multibyte-l1-1-0.dll' Name='api-ms-win-crt-multibyte-l1-1-0.dll' />
40 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-private-l1-1-0.dll' Name='api-ms-win-crt-private-l1-1-0.dll' />
41 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-process-l1-1-0.dll' Name='api-ms-win-crt-process-l1-1-0.dll' />
42 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-runtime-l1-1-0.dll' Name='api-ms-win-crt-runtime-l1-1-0.dll' />
43 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-stdio-l1-1-0.dll' Name='api-ms-win-crt-stdio-l1-1-0.dll' />
44 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-string-l1-1-0.dll' Name='api-ms-win-crt-string-l1-1-0.dll' />
45 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-time-l1-1-0.dll' Name='api-ms-win-crt-time-l1-1-0.dll' />
46 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\api-ms-win-crt-utility-l1-1-0.dll' Name='api-ms-win-crt-utility-l1-1-0.dll' />
47 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\clrcompression.dll' Name='clrcompression.dll' />
48 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\clretwrc.dll' Name='clretwrc.dll' />
49 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\clrjit.dll' Name='clrjit.dll' />
50 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\coreclr.dll' Name='coreclr.dll' />
51 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\dbgshim.dll' Name='dbgshim.dll' />
52 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Example.LatestCoreMBA.deps.json' Name='Example.LatestCoreMBA.deps.json' />
53 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Example.LatestCoreMBA.dll' Name='Example.LatestCoreMBA.dll' bal:BAFactoryAssembly='yes' />
54 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Example.LatestCoreMBA.pdb' Name='Example.LatestCoreMBA.pdb' />
55 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Example.LatestCoreMBA.runtimeconfig.json' Name='Example.LatestCoreMBA.runtimeconfig.json' />
56 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\hostfxr.dll' Name='hostfxr.dll' />
57 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\hostpolicy.dll' Name='hostpolicy.dll' />
58 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mbanative.dll' Name='mbanative.dll' />
59 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Microsoft.DiaSymReader.Native.x86.dll' Name='Microsoft.DiaSymReader.Native.x86.dll' />
60 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\Microsoft.Win32.Primitives.dll' Name='Microsoft.Win32.Primitives.dll' />
61 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mscordaccore.dll' Name='mscordaccore.dll' />
62 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mscordaccore_x86_x86_4.700.19.60701.dll' Name='mscordaccore_x86_x86_4.700.19.60701.dll' />
63 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mscordbi.dll' Name='mscordbi.dll' />
64 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mscorrc.debug.dll' Name='mscorrc.debug.dll' />
65 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\mscorrc.dll' Name='mscorrc.dll' />
66 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\SOS_README.md' Name='SOS_README.md' />
67 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Collections.Concurrent.dll' Name='System.Collections.Concurrent.dll' />
68 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Collections.dll' Name='System.Collections.dll' />
69 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Collections.NonGeneric.dll' Name='System.Collections.NonGeneric.dll' />
70 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Collections.Specialized.dll' Name='System.Collections.Specialized.dll' />
71 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Diagnostics.DiagnosticSource.dll' Name='System.Diagnostics.DiagnosticSource.dll' />
72 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Diagnostics.StackTrace.dll' Name='System.Diagnostics.StackTrace.dll' />
73 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Diagnostics.Tools.dll' Name='System.Diagnostics.Tools.dll' />
74 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.IO.Compression.Brotli.dll' Name='System.IO.Compression.Brotli.dll' />
75 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.IO.Compression.dll' Name='System.IO.Compression.dll' />
76 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.IO.FileSystem.dll' Name='System.IO.FileSystem.dll' />
77 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Linq.dll' Name='System.Linq.dll' />
78 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.Http.dll' Name='System.Net.Http.dll' />
79 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.NameResolution.dll' Name='System.Net.NameResolution.dll' />
80 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.NetworkInformation.dll' Name='System.Net.NetworkInformation.dll' />
81 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.Primitives.dll' Name='System.Net.Primitives.dll' />
82 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.Requests.dll' Name='System.Net.Requests.dll' />
83 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.Security.dll' Name='System.Net.Security.dll' />
84 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.ServicePoint.dll' Name='System.Net.ServicePoint.dll' />
85 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.Sockets.dll' Name='System.Net.Sockets.dll' />
86 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Net.WebHeaderCollection.dll' Name='System.Net.WebHeaderCollection.dll' />
87 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.ObjectModel.dll' Name='System.ObjectModel.dll' />
88 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Private.CoreLib.dll' Name='System.Private.CoreLib.dll' />
89 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Private.Uri.dll' Name='System.Private.Uri.dll' />
90 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Private.Xml.dll' Name='System.Private.Xml.dll' />
91 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Private.Xml.Linq.dll' Name='System.Private.Xml.Linq.dll' />
92 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Reflection.Metadata.dll' Name='System.Reflection.Metadata.dll' />
93 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.CompilerServices.Unsafe.dll' Name='System.Runtime.CompilerServices.Unsafe.dll' />
94 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.dll' Name='System.Runtime.dll' />
95 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.Extensions.dll' Name='System.Runtime.Extensions.dll' />
96 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.Loader.dll' Name='System.Runtime.Loader.dll' />
97 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.Numerics.dll' Name='System.Runtime.Numerics.dll' />
98 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Runtime.Serialization.Formatters.dll' Name='System.Runtime.Serialization.Formatters.dll' />
99 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Claims.dll' Name='System.Security.Claims.dll' />
100 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.Algorithms.dll' Name='System.Security.Cryptography.Algorithms.dll' />
101 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.Cng.dll' Name='System.Security.Cryptography.Cng.dll' />
102 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.Csp.dll' Name='System.Security.Cryptography.Csp.dll' />
103 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.Encoding.dll' Name='System.Security.Cryptography.Encoding.dll' />
104 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.Primitives.dll' Name='System.Security.Cryptography.Primitives.dll' />
105 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Cryptography.X509Certificates.dll' Name='System.Security.Cryptography.X509Certificates.dll' />
106 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Principal.dll' Name='System.Security.Principal.dll' />
107 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Security.Principal.Windows.dll' Name='System.Security.Principal.Windows.dll' />
108 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\System.Text.RegularExpressions.dll' Name='System.Text.RegularExpressions.dll' />
109 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\ucrtbase.dll' Name='ucrtbase.dll' />
110 + <Payload SourceFile='publish\Example.LatestCoreMBA\trimmedscd\WixToolset.Mba.Core.dll' Name='WixToolset.Mba.Core.dll' />
111 + </PayloadGroup>
112 + </Fragment>
113 +</Wix>
\ No newline at end of file
src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/SelfContainedBundle.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Bundle Name="SCDLatestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
5 + <BootstrapperApplicationRef Id="DotNetCoreBootstrapperApplicationHost">
6 + <PayloadGroupRef Id="publish.Example.LatestCoreMBA.scd" />
7 + </BootstrapperApplicationRef>
8 + <Chain>
9 + <ExePackage SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
10 + </Chain>
11 + </Bundle>
12 +</Wix>
src/test/WixToolsetTest.ManagedHost/TestData/LatestCoreMBA/TrimmedSelfContainedBundle.wxs new
+12
@@ -0,0 +1,12 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
3 + xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
4 + <Bundle Name="TrimmedSCDLatestCoreMBA" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="5CE5B5C7-4B6B-4B95-B297-731F1F956533">
5 + <BootstrapperApplicationRef Id="DotNetCoreBootstrapperApplicationHost">
6 + <PayloadGroupRef Id="publish.Example.LatestCoreMBA.trimmedscd" />
7 + </BootstrapperApplicationRef>
8 + <Chain>
9 + <ExePackage SourceFile="c:\windows\system32\kernel32.dll" PerMachine="yes" />
10 + </Chain>
11 + </Bundle>
12 +</Wix>
src/test/WixToolsetTest.ManagedHost/WixToolsetTest.ManagedHost.csproj
+30
@@ -11,9 +11,23 @@
11 <NoWarn>NU1701</NoWarn>
12 </PropertyGroup>
13
14 + <PropertyGroup>
15 + <EarliestCoreMBAProjectPath>..\examples\EarliestCoreMBA\Example.EarliestCoreMBA.csproj</EarliestCoreMBAProjectPath>
16 + <LatestCoreMBAProjectPath>..\examples\LatestCoreMBA\Example.LatestCoreMBA.csproj</LatestCoreMBAProjectPath>
17 + <MBAPublishPath>$(OutputPath)examples\publish\</MBAPublishPath>
18 + </PropertyGroup>
19 +
20 <ItemGroup>
21 + <Content Include="TestData\EarliestCoreMBA\HarvestedSCD.wxs" CopyToOutputDirectory="PreserveNewest"/>
22 + <Content Include="TestData\EarliestCoreMBA\HarvestedTrimmedSCD.wxs" CopyToOutputDirectory="PreserveNewest"/>
23 + <Content Include="TestData\EarliestCoreMBA\SelfContainedBundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
24 + <Content Include="TestData\EarliestCoreMBA\TrimmedSelfContainedBundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
25 <Content Include="TestData\FullFramework2MBA\Bundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
26 <Content Include="TestData\FullFramework4MBA\Bundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
27 + <Content Include="TestData\LatestCoreMBA\HarvestedSCD.wxs" CopyToOutputDirectory="PreserveNewest"/>
28 + <Content Include="TestData\LatestCoreMBA\HarvestedTrimmedSCD.wxs" CopyToOutputDirectory="PreserveNewest"/>
29 + <Content Include="TestData\LatestCoreMBA\SelfContainedBundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
30 + <Content Include="TestData\LatestCoreMBA\TrimmedSelfContainedBundle.wxs" CopyToOutputDirectory="PreserveNewest"/>
31 </ItemGroup>
32
33 <Target Name="CopyExtensions" AfterTargets="Build">
@@ -21,6 +35,17 @@
35 </Target>
36
37 <ItemGroup>
38 + <CoreMBAProject Include="$(EarliestCoreMBAProjectPath)">
39 + <PublishPath>$(MBAPublishPath)Example.EarliestCoreMBA</PublishPath>
40 + </CoreMBAProject>
41 + <CoreMBAProject Include="$(LatestCoreMBAProjectPath)">
42 + <PublishPath>$(MBAPublishPath)Example.LatestCoreMBA</PublishPath>
43 + </CoreMBAProject>
44 + </ItemGroup>
45 +
46 + <ItemGroup>
47 + <ProjectReference Include="$(EarliestCoreMBAProjectPath)" />
48 + <ProjectReference Include="$(LatestCoreMBAProjectPath)" />
49 <ProjectReference Include="..\examples\FullFramework2MBA\Example.FullFramework2MBA.csproj" />
50 <ProjectReference Include="..\examples\FullFramework4MBA\Example.FullFramework4MBA.csproj" />
51 <ProjectReference Include="..\examples\TestEngine\Example.TestEngine.vcxproj" />
@@ -40,4 +65,9 @@
65 <PackageReference Include="xunit" Version="2.4.1" />
66 <PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" PrivateAssets="All" />
67 </ItemGroup>
68 +
69 + <Target Name="PublishExamples" AfterTargets="Build">
70 + <Exec Command='dotnet publish -o "%(CoreMBAProject.PublishPath)\scd" -r win-x86 -c $(Configuration) --self-contained true "%(CoreMBAProject.Identity)"' />
71 + <Exec Command='dotnet publish -o "%(CoreMBAProject.PublishPath)\trimmedscd" -r win-x86 -c $(Configuration) --self-contained true -p:PublishTrimmed=true "%(CoreMBAProject.Identity)"' />
72 + </Target>
73 </Project>
src/test/examples/EarliestCoreMBA/EarliestCoreBA.cs new
+34
@@ -0,0 +1,34 @@
1 +// 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.
2 +
3 +namespace Example.EarliestCoreMBA
4 +{
5 + using WixToolset.Mba.Core;
6 +
7 + public class EarliestCoreBA : BootstrapperApplication
8 + {
9 + public EarliestCoreBA(IEngine engine)
10 + : base(engine)
11 + {
12 +
13 + }
14 +
15 + protected override void Run()
16 + {
17 + }
18 +
19 + protected override void OnStartup(StartupEventArgs args)
20 + {
21 + base.OnStartup(args);
22 +
23 + this.engine.Log(LogLevel.Standard, nameof(EarliestCoreBA));
24 + }
25 +
26 + protected override void OnShutdown(ShutdownEventArgs args)
27 + {
28 + base.OnShutdown(args);
29 +
30 + var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
31 + this.engine.Log(LogLevel.Standard, message);
32 + }
33 + }
34 +}
src/test/examples/EarliestCoreMBA/EarliestCoreBAFactory.cs new
+22
@@ -0,0 +1,22 @@
1 +// 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.
2 +
3 +[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.EarliestCoreMBA.EarliestCoreBAFactory))]
4 +namespace Example.EarliestCoreMBA
5 +{
6 + using WixToolset.Mba.Core;
7 +
8 + public class EarliestCoreBAFactory : BaseBootstrapperApplicationFactory
9 + {
10 + private static int loadCount = 0;
11 +
12 + protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 + {
14 + if (loadCount > 0)
15 + {
16 + engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 + }
18 + ++loadCount;
19 + return new EarliestCoreBA(engine);
20 + }
21 + }
22 +}
src/test/examples/EarliestCoreMBA/Example.EarliestCoreMBA.csproj new
+18
@@ -0,0 +1,18 @@
1 +<Project Sdk="Microsoft.NET.Sdk">
2 +
3 + <PropertyGroup>
4 + <TargetFramework>netcoreapp3.0</TargetFramework>
5 + <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
6 + <EnableDynamicLoading>true</EnableDynamicLoading>
7 + <Description>Earliest .NET Core MBA</Description>
8 + </PropertyGroup>
9 +
10 + <ItemGroup>
11 + <TrimmerRootAssembly Include="System.Runtime.Loader" />
12 + </ItemGroup>
13 +
14 + <ItemGroup>
15 + <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
16 + <PackageReference Include="WixToolset.Mba.Core" Version="4.0.19" />
17 + </ItemGroup>
18 +</Project>
\ No newline at end of file
src/test/examples/LatestCoreMBA/Example.LatestCoreMBA.csproj new
+23
@@ -0,0 +1,23 @@
1 +<Project Sdk="Microsoft.NET.Sdk">
2 +
3 + <PropertyGroup>
4 + <TargetFramework>netcoreapp3.1</TargetFramework>
5 + <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
6 + <EnableDynamicLoading>true</EnableDynamicLoading>
7 + <Description>Latest .NET Core MBA</Description>
8 + </PropertyGroup>
9 +
10 + <PropertyGroup Condition="'$(PublishTrimmed)'=='true'">
11 + <PublishReadyToRunShowWarnings>false</PublishReadyToRunShowWarnings>
12 + <PublishReadyToRun>true</PublishReadyToRun>
13 + </PropertyGroup>
14 +
15 + <ItemGroup>
16 + <TrimmerRootAssembly Include="System.Runtime.Loader" />
17 + </ItemGroup>
18 +
19 + <ItemGroup>
20 + <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.65" PrivateAssets="all" />
21 + <PackageReference Include="WixToolset.Mba.Core" Version="4.0.19" />
22 + </ItemGroup>
23 +</Project>
\ No newline at end of file
src/test/examples/LatestCoreMBA/LatestCoreBA.cs new
+33
@@ -0,0 +1,33 @@
1 +// 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.
2 +
3 +namespace Example.LatestCoreMBA
4 +{
5 + using WixToolset.Mba.Core;
6 +
7 + public class LatestCoreBA : BootstrapperApplication
8 + {
9 + public LatestCoreBA(IEngine engine)
10 + : base(engine)
11 + {
12 + }
13 +
14 + protected override void Run()
15 + {
16 + }
17 +
18 + protected override void OnStartup(StartupEventArgs args)
19 + {
20 + base.OnStartup(args);
21 +
22 + this.engine.Log(LogLevel.Standard, nameof(LatestCoreBA));
23 + }
24 +
25 + protected override void OnShutdown(ShutdownEventArgs args)
26 + {
27 + base.OnShutdown(args);
28 +
29 + var message = "Shutdown," + args.Action.ToString() + "," + args.HResult.ToString();
30 + this.engine.Log(LogLevel.Standard, message);
31 + }
32 + }
33 +}
src/test/examples/LatestCoreMBA/LatestCoreBAFactory.cs new
+22
@@ -0,0 +1,22 @@
1 +// 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.
2 +
3 +[assembly: WixToolset.Mba.Core.BootstrapperApplicationFactory(typeof(Example.LatestCoreMBA.LatestCoreBAFactory))]
4 +namespace Example.LatestCoreMBA
5 +{
6 + using WixToolset.Mba.Core;
7 +
8 + public class LatestCoreBAFactory : BaseBootstrapperApplicationFactory
9 + {
10 + private static int loadCount = 0;
11 +
12 + protected override IBootstrapperApplication Create(IEngine engine, IBootstrapperCommand bootstrapperCommand)
13 + {
14 + if (loadCount > 0)
15 + {
16 + engine.Log(LogLevel.Standard, $"Reloaded {loadCount} time(s)");
17 + }
18 + ++loadCount;
19 + return new LatestCoreBA(engine);
20 + }
21 + }
22 +}
src/test/examples/TestEngine/TestEngine.cpp
+15 -1
@@ -35,6 +35,12 @@ HRESULT TestEngine::LoadBA(
35
36 command.cbSize = sizeof(BOOTSTRAPPER_COMMAND);
37
38 + hr = PathGetDirectory(wzBAFilePath, &command.wzBootstrapperWorkingFolder);
39 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to allocate wzBootstrapperWorkingFolder");
40 +
41 + hr = PathConcat(command.wzBootstrapperWorkingFolder, L"BootstrapperApplicationData.xml", &command.wzBootstrapperApplicationDataPath);
42 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to allocate wzBootstrapperApplicationDataPath");
43 +
44 args.cbSize = sizeof(BOOTSTRAPPER_CREATE_ARGS);
45 args.pCommand = &command;
46 args.pfnBootstrapperEngineProc = TestEngine::EngineProc;
@@ -53,6 +59,9 @@ HRESULT TestEngine::LoadBA(
59 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "BA returned failure on BootstrapperApplicationCreate.");
60
61 LExit:
62 + ReleaseStr(command.wzBootstrapperApplicationDataPath);
63 + ReleaseStr(command.wzBootstrapperWorkingFolder);
64 +
65 return hr;
66 }
67
@@ -92,6 +101,7 @@ HRESULT TestEngine::SendStartupEvent()
101 void TestEngine::UnloadBA()
102 {
103 PFN_BOOTSTRAPPER_APPLICATION_DESTROY pfnDestroy = NULL;
104 + BOOL fDisableUnloading = m_pCreateResults && m_pCreateResults->fDisableUnloading;
105
106 ReleaseNullMem(m_pCreateResults);
107
@@ -104,7 +114,11 @@ void TestEngine::UnloadBA()
114
115 if (m_hBAModule)
116 {
107 - ::FreeLibrary(m_hBAModule);
117 + if (!fDisableUnloading)
118 + {
119 + ::FreeLibrary(m_hBAModule);
120 + }
121 +
122 m_hBAModule = NULL;
123 }
124 }
src/test/examples/TestEngine/precomp.h
+1
@@ -9,6 +9,7 @@
9 #include "logutil.h"
10 #include "memutil.h"
11 #include "pathutil.h"
12 +#include "strutil.h"
13
14 #include "BootstrapperEngine.h"
15 #include "BootstrapperApplication.h"
src/wixext/BalCompiler.cs
+9
@@ -197,6 +197,15 @@ namespace WixToolset.Bal
197 {
198 switch (attribute.Name.LocalName)
199 {
200 + case "BAFactoryAssembly":
201 + if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
202 + {
203 + section.AddTuple(new WixBalBAFactoryAssemblyTuple(sourceLineNumbers)
204 + {
205 + PayloadId = payloadId,
206 + });
207 + }
208 + break;
209 case "BAFunctions":
210 if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attribute))
211 {
src/wixext/Tuples/BalTupleDefinitions.cs
+15
@@ -4,9 +4,11 @@ namespace WixToolset.Bal
4 {
5 using System;
6 using WixToolset.Data;
7 + using WixToolset.Data.Burn;
8
9 public enum BalTupleDefinitionType
10 {
11 + WixBalBAFactoryAssembly,
12 WixBalBAFunctions,
13 WixBalCondition,
14 WixMbaPrereqInformation,
@@ -32,6 +34,9 @@ namespace WixToolset.Bal
34 {
35 switch (type)
36 {
37 + case BalTupleDefinitionType.WixBalBAFactoryAssembly:
38 + return BalTupleDefinitions.WixBalBAFactoryAssembly;
39 +
40 case BalTupleDefinitionType.WixBalBAFunctions:
41 return BalTupleDefinitions.WixBalBAFunctions;
42
@@ -51,5 +56,15 @@ namespace WixToolset.Bal
56 throw new ArgumentOutOfRangeException(nameof(type));
57 }
58 }
59 +
60 + static BalTupleDefinitions()
61 + {
62 + WixBalBAFactoryAssembly.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
63 + WixBalBAFunctions.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
64 + WixBalCondition.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
65 + WixMbaPrereqInformation.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
66 + WixStdbaOptions.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
67 + WixStdbaOverridableVariable.AddTag(BurnConstants.BootstrapperApplicationDataTupleDefinitionTag);
68 + }
69 }
70 }
src/wixext/Tuples/WixBalBAFactoryAssemblyTuple.cs new
+47
@@ -0,0 +1,47 @@
1 +// 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.
2 +
3 +namespace WixToolset.Bal
4 +{
5 + using WixToolset.Data;
6 + using WixToolset.Bal.Tuples;
7 +
8 + public static partial class BalTupleDefinitions
9 + {
10 + public static readonly IntermediateTupleDefinition WixBalBAFactoryAssembly = new IntermediateTupleDefinition(
11 + BalTupleDefinitionType.WixBalBAFactoryAssembly.ToString(),
12 + new[]
13 + {
14 + new IntermediateFieldDefinition(nameof(WixBalBAFactoryTupleFields.PayloadId), IntermediateFieldType.String),
15 + },
16 + typeof(WixBalBAFactoryAssemblyTuple));
17 + }
18 +}
19 +
20 +namespace WixToolset.Bal.Tuples
21 +{
22 + using WixToolset.Data;
23 +
24 + public enum WixBalBAFactoryTupleFields
25 + {
26 + PayloadId,
27 + }
28 +
29 + public class WixBalBAFactoryAssemblyTuple : IntermediateTuple
30 + {
31 + public WixBalBAFactoryAssemblyTuple() : base(BalTupleDefinitions.WixBalBAFactoryAssembly, null, null)
32 + {
33 + }
34 +
35 + public WixBalBAFactoryAssemblyTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(BalTupleDefinitions.WixBalBAFactoryAssembly, sourceLineNumber, id)
36 + {
37 + }
38 +
39 + public IntermediateField this[WixBalBAFactoryTupleFields index] => this.Fields[(int)index];
40 +
41 + public string PayloadId
42 + {
43 + get => this.Fields[(int)WixBalBAFactoryTupleFields.PayloadId].AsString();
44 + set => this.Set((int)WixBalBAFactoryTupleFields.PayloadId, value);
45 + }
46 + }
47 +}
\ No newline at end of file
src/wixext/bal.xsd
+16 -1
@@ -9,7 +9,7 @@
9 xmlns="http://wixtoolset.org/schemas/v4/wxs/bal">
10 <xs:annotation>
11 <xs:documentation>
12 - The source code schema for the WiX Toolset Burn User Experience Extension.
12 + The source code schema for the WiX Toolset Bootstrapper Application Layer Extension.
13 </xs:documentation>
14 </xs:annotation>
15
@@ -215,10 +215,25 @@
215 </xs:complexType>
216 </xs:element>
217
218 + <xs:attribute name="BAFactoryAssembly" type="YesNoType">
219 + <xs:annotation>
220 + <xs:documentation>
221 + When set to "yes", DotNetCoreBootstrapperApplicationHost will load the DLL and instantiate the type with the BootstrapperApplicationFactoryAttribute.
222 + There must be corresponding deps.json and runtimeconfig.json files (set EnableDynamicLoading to True in the .NET Core project).
223 + The .NET Core project must have been published, not just built.
224 + Only one payload may be marked with this attribute set to "yes".
225 + </xs:documentation>
226 + <xs:appinfo>
227 + <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Payload" />
228 + </xs:appinfo>
229 + </xs:annotation>
230 + </xs:attribute>
231 +
232 <xs:attribute name="BAFunctions" type="YesNoType">
233 <xs:annotation>
234 <xs:documentation>
235 When set to "yes", WixStdBA will load the DLL and work with it to handle BA messages.
236 + Only one payload may be marked with this attribute set to "yes".
237 </xs:documentation>
238 <xs:appinfo>
239 <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="Payload" />
src/wixlib/Dnc.wxs new
+21
@@ -0,0 +1,21 @@
1 +<?xml version='1.0' encoding='utf-8'?>
2 +<!-- 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. -->
3 +
4 +
5 +<Wix xmlns='http://wixtoolset.org/schemas/v4/wxs'>
6 + <!--
7 + Dnc.wxs - .NET Core BA resources.
8 + -->
9 + <Fragment>
10 + <BootstrapperApplication Id='DotNetCoreBootstrapperApplicationHost' SourceFile='dnchost.dll'>
11 + <PayloadGroupRef Id='Dnc' />
12 + </BootstrapperApplication>
13 + </Fragment>
14 +
15 + <Fragment>
16 + <PayloadGroup Id='Dnc'>
17 + <Payload Compressed='yes' SourceFile='nethost.dll' />
18 + <Payload Compressed='yes' SourceFile='WixToolset.Dnc.Host.dll' />
19 + </PayloadGroup>
20 + </Fragment>
21 +</Wix>
src/wixlib/bal.wixproj
+5
@@ -14,6 +14,7 @@
14
15 <ItemGroup>
16 <Compile Include="BalExtension.wxs" />
17 + <Compile Include="Dnc.wxs" />
18 <Compile Include="Mba.wxs" />
19 <Compile Include="wixstdba.wxs" />
20 <Compile Include="wixstdba_x86.wxs" />
@@ -33,6 +34,10 @@
34 </ItemGroup>
35
36 <ItemGroup>
37 + <ProjectReference Include="..\dnchost\dnchost.vcxproj">
38 + <Name>dnchost</Name>
39 + <Project>{B6F70281-6583-4138-BB7F-AABFEBBB3CA2}</Project>
40 + </ProjectReference>
41 <ProjectReference Include="..\mbahost\mbahost.vcxproj">
42 <Name>mbahost</Name>
43 <Project>{12C87C77-3547-44F8-8134-29BC915CB19D}</Project>