aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2023-12-06 19:48:54 -0800
committerRob Mensching <rob@firegiant.com>2023-12-16 14:32:21 -0800
commiteff9d4204880535f821827e5aece5068402358f6 (patch)
tree11b8158605bf2853242321fbaf2880792cb8d6b5 /src
parent379926377524951c692e8c342a49fb03da61345f (diff)
downloadwix-eff9d4204880535f821827e5aece5068402358f6.tar.gz
wix-eff9d4204880535f821827e5aece5068402358f6.tar.bz2
wix-eff9d4204880535f821827e5aece5068402358f6.zip
Introducing the WiX Standard Library
Completes 7914
Diffstat (limited to 'src')
-rw-r--r--src/api/wix/WixToolset.Data/Intermediate.cs4
-rw-r--r--src/api/wix/WixToolset.Data/IntermediateSection.cs4
-rw-r--r--src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs115
-rw-r--r--src/api/wix/WixToolset.Data/WixStandardLibrary.cs152
-rw-r--r--src/api/wix/WixToolset.Data/WixStandardLibraryIdentifiers.cs20
-rw-r--r--src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs10
-rw-r--r--src/ext/UI/wixlib/WixUI_Minimal.wxs1
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs6
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs4
-rw-r--r--src/wix/WixToolset.Core/CommandLine/BuildCommand.cs9
-rw-r--r--src/wix/WixToolset.Core/Compiler.cs2
-rw-r--r--src/wix/WixToolset.Core/Compiler_Module.cs2
-rw-r--r--src/wix/WixToolset.Core/Compiler_Package.cs2
-rw-r--r--src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs130
-rw-r--r--src/wix/WixToolset.Core/LinkContext.cs4
-rw-r--r--src/wix/WixToolset.Core/Linker.cs86
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs1
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs7
18 files changed, 292 insertions, 267 deletions
diff --git a/src/api/wix/WixToolset.Data/Intermediate.cs b/src/api/wix/WixToolset.Data/Intermediate.cs
index 64f9810d..977f894a 100644
--- a/src/api/wix/WixToolset.Data/Intermediate.cs
+++ b/src/api/wix/WixToolset.Data/Intermediate.cs
@@ -215,9 +215,11 @@ namespace WixToolset.Data
215 /// Updates the intermediate level to the specified level. 215 /// Updates the intermediate level to the specified level.
216 /// </summary> 216 /// </summary>
217 /// <param name="level">Intermediate level.</param> 217 /// <param name="level">Intermediate level.</param>
218 public void UpdateLevel(string level) 218 public Intermediate UpdateLevel(string level)
219 { 219 {
220 this.Level = String.IsNullOrEmpty(this.Level) ? level : String.Concat(this.Level, ";", level); 220 this.Level = String.IsNullOrEmpty(this.Level) ? level : String.Concat(this.Level, ";", level);
221
222 return this;
221 } 223 }
222 224
223 /// <summary> 225 /// <summary>
diff --git a/src/api/wix/WixToolset.Data/IntermediateSection.cs b/src/api/wix/WixToolset.Data/IntermediateSection.cs
index b9157875..16d63a4c 100644
--- a/src/api/wix/WixToolset.Data/IntermediateSection.cs
+++ b/src/api/wix/WixToolset.Data/IntermediateSection.cs
@@ -70,9 +70,11 @@ namespace WixToolset.Data
70 /// Assigns the section to a library. 70 /// Assigns the section to a library.
71 /// </summary> 71 /// </summary>
72 /// <param name="libraryId">Identifier of the library.</param> 72 /// <param name="libraryId">Identifier of the library.</param>
73 public void AssignToLibrary(string libraryId) 73 public IntermediateSection AssignToLibrary(string libraryId)
74 { 74 {
75 this.LibraryId = libraryId; 75 this.LibraryId = libraryId;
76
77 return this;
76 } 78 }
77 79
78 /// <summary> 80 /// <summary>
diff --git a/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs b/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
index 17267cf7..971a0416 100644
--- a/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
+++ b/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
@@ -11,7 +11,6 @@ namespace WixToolset.Data.WindowsInstaller
11 { 11 {
12 private static readonly Dictionary<string, WixActionSymbol> standardActionsById; 12 private static readonly Dictionary<string, WixActionSymbol> standardActionsById;
13 private static readonly HashSet<string> standardActionNames; 13 private static readonly HashSet<string> standardActionNames;
14 private static readonly Dictionary<string, DirectorySymbol> standardDirectoriesById;
15 14
16 /// <summary> 15 /// <summary>
17 /// References: 16 /// References:
@@ -208,6 +207,41 @@ namespace WixToolset.Data.WindowsInstaller
208 "WindowsVolume", 207 "WindowsVolume",
209 }; 208 };
210 209
210 private static readonly Dictionary<string, string> standardDirectoryNamesById = new Dictionary<string, string>
211 {
212 ["TARGETDIR"] = "SourceDir",
213 ["AdminToolsFolder"] = "Admin",
214 ["AppDataFolder"] = "AppData",
215 ["CommonAppDataFolder"] = "CommApp",
216 ["CommonFilesFolder"] = "CFiles",
217 ["CommonFiles64Folder"] = "CFiles64",
218 ["CommonFiles6432Folder"] = ".",
219 ["DesktopFolder"] = "Desktop",
220 ["FavoritesFolder"] = "Favs",
221 ["FontsFolder"] = "Fonts",
222 ["LocalAppDataFolder"] = "LocalApp",
223 ["MyPicturesFolder"] = "Pictures",
224 ["NetHoodFolder"] = "NetHood",
225 ["PersonalFolder"] = "Personal",
226 ["PrintHoodFolder"] = "Printers",
227 ["ProgramFilesFolder"] = "PFiles",
228 ["ProgramFiles64Folder"] = "PFiles64",
229 ["ProgramFiles6432Folder"] = ".",
230 ["ProgramMenuFolder"] = "PMenu",
231 ["RecentFolder"] = "Recent",
232 ["SendToFolder"] = "SendTo",
233 ["StartMenuFolder"] = "StrtMenu",
234 ["StartupFolder"] = "StartUp",
235 ["SystemFolder"] = "System",
236 ["System16Folder"] = "System16",
237 ["System64Folder"] = "System64",
238 ["System6432Folder"] = ".",
239 ["TempFolder"] = "Temp",
240 ["TemplateFolder"] = "Template",
241 ["WindowsFolder"] = "Windows",
242 };
243
244
211 static WindowsInstallerStandard() 245 static WindowsInstallerStandard()
212 { 246 {
213 var standardActions = new[] 247 var standardActions = new[]
@@ -332,43 +366,8 @@ namespace WixToolset.Data.WindowsInstaller
332 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence }, 366 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence },
333 }; 367 };
334 368
335 var standardDirectories = new[]
336 {
337 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TARGETDIR")) { Name = "SourceDir" },
338 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AdminToolsFolder")) { Name = "Admin" },
339 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AppDataFolder")) { Name = "AppData" },
340 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonAppDataFolder")) { Name = "CommApp" },
341 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFilesFolder")) { Name = "CFiles" },
342 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles64Folder")) { Name = "CFiles64" },
343 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles6432Folder")) { Name = "." },
344 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "DesktopFolder")) { Name = "Desktop" },
345 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FavoritesFolder")) { Name = "Favs" },
346 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FontsFolder")) { Name = "Fonts" },
347 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "LocalAppDataFolder")) { Name = "LocalApp" },
348 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "MyPicturesFolder")) { Name = "Pictures" },
349 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "NetHoodFolder")) { Name = "NetHood" },
350 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PersonalFolder")) { Name = "Personal" },
351 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PrintHoodFolder")) { Name = "Printers" },
352 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFilesFolder")) { Name = "PFiles" },
353 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles64Folder")) { Name = "PFiles64" },
354 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles6432Folder")) { Name = "." },
355 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramMenuFolder")) { Name = "PMenu" },
356 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "RecentFolder")) { Name = "Recent" },
357 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SendToFolder")) { Name = "SendTo" },
358 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartMenuFolder")) { Name = "StrtMenu" },
359 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartupFolder")) { Name = "StartUp" },
360 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SystemFolder")) { Name = "System" },
361 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System16Folder")) { Name = "System16" },
362 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System64Folder")) { Name = "System64" },
363 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System6432Folder")) { Name = "." },
364 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TempFolder")) { Name = "Temp" },
365 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TemplateFolder")) { Name = "Template" },
366 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "WindowsFolder")) { Name = "Windows" },
367 };
368
369 standardActionNames = new HashSet<string>(standardActions.Select(a => a.Action)); 369 standardActionNames = new HashSet<string>(standardActions.Select(a => a.Action));
370 standardActionsById = standardActions.ToDictionary(a => a.Id.Id); 370 standardActionsById = standardActions.ToDictionary(a => a.Id.Id);
371 standardDirectoriesById = standardDirectories.ToDictionary(d => d.Id.Id);
372 } 371 }
373 372
374 /// <summary> 373 /// <summary>
@@ -376,17 +375,26 @@ namespace WixToolset.Data.WindowsInstaller
376 /// </summary> 375 /// </summary>
377 /// <param name="actionName">Name of the action.</param> 376 /// <param name="actionName">Name of the action.</param>
378 /// <returns>true if the action is standard, false otherwise.</returns> 377 /// <returns>true if the action is standard, false otherwise.</returns>
379 public static bool IsStandardAction(string actionName) => standardActionNames.Contains(actionName); 378 public static bool IsStandardAction(string actionName)
379 {
380 return standardActionNames.Contains(actionName);
381 }
380 382
381 /// <summary> 383 /// <summary>
382 /// Standard actions. 384 /// Standard actions.
383 /// </summary> 385 /// </summary>
384 public static IReadOnlyCollection<WixActionSymbol> StandardActions() => standardActionsById.Values; 386 public static IReadOnlyCollection<WixActionSymbol> StandardActions()
387 {
388 return standardActionsById.Values;
389 }
385 390
386 /// <summary> 391 /// <summary>
387 /// Standard directories. 392 /// Standard directory identifiers.
388 /// </summary> 393 /// </summary>
389 public static IReadOnlyCollection<DirectorySymbol> StandardDirectories() => standardDirectoriesById.Values; 394 public static IReadOnlyCollection<string> StandardDirectoryIds()
395 {
396 return standardDirectoryNamesById.Keys;
397 }
390 398
391 /// <summary> 399 /// <summary>
392 /// Gets the platform specific directory id for a directory. Most directories are not platform 400 /// Gets the platform specific directory id for a directory. Most directories are not platform
@@ -418,28 +426,43 @@ namespace WixToolset.Data.WindowsInstaller
418 /// </summary> 426 /// </summary>
419 /// <param name="directoryId">Name of the directory.</param> 427 /// <param name="directoryId">Name of the directory.</param>
420 /// <returns>true if the directory is standard, false otherwise.</returns> 428 /// <returns>true if the directory is standard, false otherwise.</returns>
421 public static bool IsStandardDirectory(string directoryId) => standardDirectoriesById.ContainsKey(directoryId); 429 public static bool IsStandardDirectory(string directoryId)
430 {
431 return standardDirectoryNamesById.ContainsKey(directoryId);
432 }
422 433
423 /// <summary> 434 /// <summary>
424 /// Find out if a property is a standard property. 435 /// Find out if a property is a standard property.
425 /// </summary> 436 /// </summary>
426 /// <param name="propertyName">Name of the property.</param> 437 /// <param name="propertyName">Name of the property.</param>
427 /// <returns>true if a property is standard, false otherwise.</returns> 438 /// <returns>true if a property is standard, false otherwise.</returns>
428 public static bool IsStandardProperty(string propertyName) => standardProperties.Contains(propertyName); 439 public static bool IsStandardProperty(string propertyName)
440 {
441 return standardProperties.Contains(propertyName);
442 }
429 443
430 /// <summary> 444 /// <summary>
431 /// Try to get standard action by id. 445 /// Try to get standard action by id.
432 /// </summary> 446 /// </summary>
433 public static bool TryGetStandardAction(string id, out WixActionSymbol standardAction) => standardActionsById.TryGetValue(id, out standardAction); 447 public static bool TryGetStandardAction(string id, out WixActionSymbol standardAction)
448 {
449 return standardActionsById.TryGetValue(id, out standardAction);
450 }
434 451
435 /// <summary> 452 /// <summary>
436 /// Try to get standard action by sequence and action name. 453 /// Try to get standard action by sequence and action name.
437 /// </summary> 454 /// </summary>
438 public static bool TryGetStandardAction(string sequenceName, string actioname, out WixActionSymbol standardAction) => standardActionsById.TryGetValue(String.Concat(sequenceName, "/", actioname), out standardAction); 455 public static bool TryGetStandardAction(string sequenceName, string actioname, out WixActionSymbol standardAction)
456 {
457 return standardActionsById.TryGetValue(String.Concat(sequenceName, "/", actioname), out standardAction);
458 }
439 459
440 /// <summary> 460 /// <summary>
441 /// Try to get standard directory symbol by id. 461 /// Try to get standard directory name by id.
442 /// </summary> 462 /// </summary>
443 public static bool TryGetStandardDirectory(string directoryId, out DirectorySymbol symbol) => standardDirectoriesById.TryGetValue(directoryId, out symbol); 463 public static bool TryGetStandardDirectoryName(string directoryId, out string name)
464 {
465 return standardDirectoryNamesById.TryGetValue(directoryId, out name);
466 }
444 } 467 }
445} 468}
diff --git a/src/api/wix/WixToolset.Data/WixStandardLibrary.cs b/src/api/wix/WixToolset.Data/WixStandardLibrary.cs
new file mode 100644
index 00000000..c5c9d8d4
--- /dev/null
+++ b/src/api/wix/WixToolset.Data/WixStandardLibrary.cs
@@ -0,0 +1,152 @@
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
3namespace WixToolset.Data
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using WixToolset.Data.Bind;
9 using WixToolset.Data.Symbols;
10 using WixToolset.Data.WindowsInstaller;
11
12 /// <summary>
13 /// WiX Standard Library implementation.
14 /// </summary>
15 public static class WixStandardLibrary
16 {
17 private const string WixStandardLibraryId = "wixstd";
18
19 /// <summary>
20 /// Build the wixstd.wixlib Intermediate.
21 /// </summary>
22 /// <param name="platform">Target platform for the wixstd.wixlib</param>
23 /// <returns>Intermediate containing the wixstd.wixlib.</returns>
24 public static Intermediate Build(Platform platform)
25 {
26 var localizations = YieldLocalizations();
27
28 var sections = YieldSections(platform);
29
30 return new Intermediate(WixStandardLibraryId, IntermediateLevels.Combined, sections, localizations.ToDictionary(l => l.Culture, StringComparer.OrdinalIgnoreCase));
31 }
32
33 private static IEnumerable<Localization> YieldLocalizations()
34 {
35 var strings = new BindVariable[0];
36
37 var localizedControls = new LocalizedControl[0];
38
39 yield return new Localization(LocalizationLocation.Library, null, null, String.Empty, strings.ToDictionary(s => s.Id), localizedControls.ToDictionary(l => l.GetKey()));
40 }
41
42 private static IEnumerable<IntermediateSection> YieldSections(Platform platform)
43 {
44 var sourceLineNumber = new SourceLineNumber("wixstd.wixlib");
45
46 // Actions.
47 foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
48 {
49 var symbol = new WixActionSymbol(sourceLineNumber, new Identifier(actionSymbol.Id.Access, actionSymbol.Id.Id))
50 {
51 Action = actionSymbol.Action,
52 SequenceTable = actionSymbol.SequenceTable,
53 Sequence = actionSymbol.Sequence,
54 Condition = actionSymbol.Condition,
55 };
56
57 var section = CreateSectionAroundSymbol(symbol);
58
59 yield return section;
60 }
61
62 // Directories.
63 foreach (var id in WindowsInstallerStandard.StandardDirectoryIds())
64 {
65 var symbol = new DirectorySymbol(sourceLineNumber, new Identifier(AccessModifier.Virtual, id))
66 {
67 ParentDirectoryRef = GetStandardDirectoryParent(id, platform),
68 Name = WindowsInstallerStandard.TryGetStandardDirectoryName(id, out var name) ? name : throw new InvalidOperationException("Standard directories must have a default name")
69 };
70
71 var section = CreateSectionAroundSymbol(symbol);
72
73 // Add a reference for the more complicated parent directory references.
74 if (symbol.ParentDirectoryRef != null && symbol.ParentDirectoryRef != "TARGEDIR")
75 {
76 section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
77 {
78 Table = "Directory",
79 PrimaryKeys = symbol.ParentDirectoryRef
80 });
81 }
82
83 yield return section;
84 }
85
86 // Package References.
87 {
88 var section = CreateSection(WixStandardLibraryIdentifiers.WixStandardPackageReferences);
89
90 section.AddSymbol(new WixFragmentSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardLibraryIdentifiers.WixStandardPackageReferences)));
91
92 section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
93 {
94 Table = SymbolDefinitions.Directory.Name,
95 PrimaryKeys = "TARGETDIR"
96 });
97
98 yield return section;
99 }
100
101 // Module References.
102 {
103 var section = CreateSection(WixStandardLibraryIdentifiers.WixStandardModuleReferences);
104
105 section.AddSymbol(new WixFragmentSymbol(sourceLineNumber, new Identifier(AccessModifier.Global, WixStandardLibraryIdentifiers.WixStandardModuleReferences)));
106
107 section.AddSymbol(new WixSimpleReferenceSymbol(sourceLineNumber)
108 {
109 Table = SymbolDefinitions.Directory.Name,
110 PrimaryKeys = "TARGETDIR"
111 });
112
113 yield return section;
114 }
115 }
116
117 private static IntermediateSection CreateSection(string sectionId)
118 {
119 return new IntermediateSection(sectionId, SectionType.Fragment, WixStandardLibraryId).AssignToLibrary(WixStandardLibraryId);
120 }
121
122 private static IntermediateSection CreateSectionAroundSymbol(IntermediateSymbol symbol)
123 {
124 var section = CreateSection(symbol.Id.Id);
125
126 section.AddSymbol(symbol);
127
128 return section;
129 }
130
131 private static string GetStandardDirectoryParent(string directoryId, Platform platform)
132 {
133 switch (directoryId)
134 {
135 case "TARGETDIR":
136 return null;
137
138 case "CommonFiles6432Folder":
139 return platform == Platform.X86 ? "CommonFilesFolder" : "CommonFiles64Folder";
140
141 case "ProgramFiles6432Folder":
142 return platform == Platform.X86 ? "ProgramFilesFolder" : "ProgramFiles64Folder";
143
144 case "System6432Folder":
145 return platform == Platform.X86 ? "SystemFolder" : "System64Folder";
146
147 default:
148 return "TARGETDIR";
149 }
150 }
151 }
152}
diff --git a/src/api/wix/WixToolset.Data/WixStandardLibraryIdentifiers.cs b/src/api/wix/WixToolset.Data/WixStandardLibraryIdentifiers.cs
new file mode 100644
index 00000000..8c4ac08e
--- /dev/null
+++ b/src/api/wix/WixToolset.Data/WixStandardLibraryIdentifiers.cs
@@ -0,0 +1,20 @@
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
3namespace WixToolset.Data
4{
5 /// <summary>
6 /// Well-known identifier names from the wixstd.wixlib.
7 /// </summary>
8 public static class WixStandardLibraryIdentifiers
9 {
10 /// <summary>
11 /// WiX Standard references for packages.
12 /// </summary>
13 public static readonly string WixStandardPackageReferences = "WixStandardPackageReferences";
14
15 /// <summary>
16 /// WiX Standard references for modules.
17 /// </summary>
18 public static readonly string WixStandardModuleReferences = "WixStandardModuleReferences";
19 }
20}
diff --git a/src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs b/src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs
index 8556d9eb..402d78fe 100644
--- a/src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs
+++ b/src/api/wix/WixToolset.Extensibility/Data/ILinkContext.cs
@@ -48,6 +48,16 @@ namespace WixToolset.Extensibility.Data
48 string OutputPath { get; set; } 48 string OutputPath { get; set; }
49 49
50 /// <summary> 50 /// <summary>
51 /// Gets or sets the platform for the output.
52 /// </summary>
53 Platform Platform { get; set; }
54
55 /// <summary>
56 /// Gets or sets whether to skip the standard wixlib.
57 /// </summary>
58 bool SkipStdWixlib { get; set; }
59
60 /// <summary>
51 /// Symbol definition creator used to load extension data. 61 /// Symbol definition creator used to load extension data.
52 /// </summary> 62 /// </summary>
53 ISymbolDefinitionCreator SymbolDefinitionCreator { get; set; } 63 ISymbolDefinitionCreator SymbolDefinitionCreator { get; set; }
diff --git a/src/ext/UI/wixlib/WixUI_Minimal.wxs b/src/ext/UI/wixlib/WixUI_Minimal.wxs
index e6f3437a..80a011e6 100644
--- a/src/ext/UI/wixlib/WixUI_Minimal.wxs
+++ b/src/ext/UI/wixlib/WixUI_Minimal.wxs
@@ -59,7 +59,6 @@ Patch dialog sequence:
59 59
60 <InstallUISequence> 60 <InstallUISequence>
61 <Show Dialog="override WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" /> 61 <Show Dialog="override WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" />
62 <Show Dialog="override WelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" />
63 </InstallUISequence> 62 </InstallUISequence>
64 63
65 <Property Id="ARPNOMODIFY" Value="1" /> 64 <Property Id="ARPNOMODIFY" Value="1" />
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
index 234cad4a..5c2c40d1 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/CreateWindowsInstallerDataFromIRCommand.cs
@@ -550,11 +550,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
550 } 550 }
551 else 551 else
552 { 552 {
553 foreach (var standardDirectory in WindowsInstallerStandard.StandardDirectories()) 553 foreach (var standardDirectoryId in WindowsInstallerStandard.StandardDirectoryIds())
554 { 554 {
555 if (directoryId.StartsWith(standardDirectory.Id.Id, StringComparison.Ordinal)) 555 if (directoryId.StartsWith(standardDirectoryId, StringComparison.Ordinal))
556 { 556 {
557 this.Messaging.Write(WarningMessages.StandardDirectoryConflictInMergeModule(symbol.SourceLineNumbers, directoryId, standardDirectory.Id.Id)); 557 this.Messaging.Write(WarningMessages.StandardDirectoryConflictInMergeModule(symbol.SourceLineNumbers, directoryId, standardDirectoryId));
558 } 558 }
559 } 559 }
560 } 560 }
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
index 9701f958..71e1b22b 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Decompile/Decompiler.cs
@@ -2280,10 +2280,10 @@ namespace WixToolset.Core.WindowsInstaller.Decompile
2280 xDirectory = xDirectory.Parent; 2280 xDirectory = xDirectory.Parent;
2281 } 2281 }
2282 2282
2283 if (xDirectory?.Name.LocalName == "StandardDirectory" && WindowsInstallerStandard.TryGetStandardDirectory(xDirectory.Attribute("Id").Value, out var standardDirectory)) 2283 if (xDirectory?.Name.LocalName == "StandardDirectory" && WindowsInstallerStandard.TryGetStandardDirectoryName(xDirectory.Attribute("Id").Value, out var standardDirectoryName))
2284 { 2284 {
2285 sourcePath.Insert(0, Path.DirectorySeparatorChar); 2285 sourcePath.Insert(0, Path.DirectorySeparatorChar);
2286 sourcePath.Insert(0, standardDirectory.Name); 2286 sourcePath.Insert(0, standardDirectoryName);
2287 } 2287 }
2288 2288
2289 return sourcePath.ToString(); 2289 return sourcePath.ToString();
diff --git a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
index 2ad18073..b0cd174a 100644
--- a/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
+++ b/src/wix/WixToolset.Core/CommandLine/BuildCommand.cs
@@ -61,6 +61,7 @@ namespace WixToolset.Core.CommandLine
61 new CommandLineHelpSwitch("-loc", "Localization file to use in the build. By default, .wxl files are recognized as localization."), 61 new CommandLineHelpSwitch("-loc", "Localization file to use in the build. By default, .wxl files are recognized as localization."),
62 new CommandLineHelpSwitch("-lib", "Library file to use in the build. By default, .wixlib files are recognized as libraries."), 62 new CommandLineHelpSwitch("-lib", "Library file to use in the build. By default, .wixlib files are recognized as libraries."),
63 new CommandLineHelpSwitch("-src", "Source file to use in the build. By default, .wxs files are recognized as source code."), 63 new CommandLineHelpSwitch("-src", "Source file to use in the build. By default, .wxs files are recognized as source code."),
64 new CommandLineHelpSwitch("-nostdlib", "Skip use of WiX standard wixlib."),
64 new CommandLineHelpSwitch("-out", "-o", "Path to output the build to."), 65 new CommandLineHelpSwitch("-out", "-o", "Path to output the build to."),
65 new CommandLineHelpSwitch("-outputtype", "Explicitly set the output type if it cannot be determined from the output."), 66 new CommandLineHelpSwitch("-outputtype", "Explicitly set the output type if it cannot be determined from the output."),
66 new CommandLineHelpSwitch("-pdb", "Optional path to output .wixpdb. Default will write .wixpdb beside output path."), 67 new CommandLineHelpSwitch("-pdb", "Optional path to output .wixpdb. Default will write .wixpdb beside output path."),
@@ -278,6 +279,8 @@ namespace WixToolset.Core.CommandLine
278 context.IntermediateFolder = this.IntermediateFolder; 279 context.IntermediateFolder = this.IntermediateFolder;
279 context.Intermediates = intermediates.Concat(libraries).ToList(); 280 context.Intermediates = intermediates.Concat(libraries).ToList();
280 context.OutputPath = this.OutputPath; 281 context.OutputPath = this.OutputPath;
282 context.Platform = this.Platform;
283 context.SkipStdWixlib = this.commandLine.SkipStdWixlib;
281 context.SymbolDefinitionCreator = creator; 284 context.SymbolDefinitionCreator = creator;
282 context.CancellationToken = cancellationToken; 285 context.CancellationToken = cancellationToken;
283 286
@@ -530,6 +533,8 @@ namespace WixToolset.Core.CommandLine
530 533
531 public string TrackingFile { get; private set; } 534 public string TrackingFile { get; private set; }
532 535
536 public bool SkipStdWixlib { get; set; }
537
533 public bool ResetAcls { get; set; } 538 public bool ResetAcls { get; set; }
534 539
535 public CommandLine(IServiceProvider serviceProvider, IMessaging messaging) 540 public CommandLine(IServiceProvider serviceProvider, IMessaging messaging)
@@ -685,6 +690,10 @@ namespace WixToolset.Core.CommandLine
685 parser.GetNextArgumentAsFilePathOrError(arg, "source code", this.SourceFilePaths); 690 parser.GetNextArgumentAsFilePathOrError(arg, "source code", this.SourceFilePaths);
686 return true; 691 return true;
687 692
693 case "nostdlib":
694 this.SkipStdWixlib = true;
695 return true;
696
688 case "o": 697 case "o":
689 case "out": 698 case "out":
690 this.OutputFile = parser.GetNextArgumentAsFilePathOrError(arg, "output file"); 699 this.OutputFile = parser.GetNextArgumentAsFilePathOrError(arg, "output file");
diff --git a/src/wix/WixToolset.Core/Compiler.cs b/src/wix/WixToolset.Core/Compiler.cs
index 73fd494d..6a01b0ef 100644
--- a/src/wix/WixToolset.Core/Compiler.cs
+++ b/src/wix/WixToolset.Core/Compiler.cs
@@ -7129,7 +7129,7 @@ namespace WixToolset.Core
7129 } 7129 }
7130 else if (!WindowsInstallerStandard.IsStandardDirectory(id)) 7130 else if (!WindowsInstallerStandard.IsStandardDirectory(id))
7131 { 7131 {
7132 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Id", id, String.Join(", \"", WindowsInstallerStandard.StandardDirectories().Select(d => d.Id.Id)))); 7132 this.Core.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, node.Name.LocalName, "Id", id, String.Join(", \"", WindowsInstallerStandard.StandardDirectoryIds())));
7133 } 7133 }
7134 7134
7135 foreach (var child in node.Elements()) 7135 foreach (var child in node.Elements())
diff --git a/src/wix/WixToolset.Core/Compiler_Module.cs b/src/wix/WixToolset.Core/Compiler_Module.cs
index 0a547ad7..092f3473 100644
--- a/src/wix/WixToolset.Core/Compiler_Module.cs
+++ b/src/wix/WixToolset.Core/Compiler_Module.cs
@@ -285,6 +285,8 @@ namespace WixToolset.Core
285 } 285 }
286 286
287 this.ValidateAndAddCommonSummaryInformationSymbols(sourceLineNumbers, msiVersion, platform, this.activeLanguage); 287 this.ValidateAndAddCommonSummaryInformationSymbols(sourceLineNumbers, msiVersion, platform, this.activeLanguage);
288
289 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFragment, WixStandardLibraryIdentifiers.WixStandardModuleReferences);
288 } 290 }
289 } 291 }
290 finally 292 finally
diff --git a/src/wix/WixToolset.Core/Compiler_Package.cs b/src/wix/WixToolset.Core/Compiler_Package.cs
index bfc59c75..02ed9092 100644
--- a/src/wix/WixToolset.Core/Compiler_Package.cs
+++ b/src/wix/WixToolset.Core/Compiler_Package.cs
@@ -423,6 +423,8 @@ namespace WixToolset.Core
423 SymbolPaths = symbols, 423 SymbolPaths = symbols,
424 }); 424 });
425 } 425 }
426
427 this.Core.CreateSimpleReference(sourceLineNumbers, SymbolDefinitions.WixFragment, WixStandardLibraryIdentifiers.WixStandardPackageReferences);
426 } 428 }
427 } 429 }
428 finally 430 finally
diff --git a/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs b/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs
deleted file mode 100644
index 38493648..00000000
--- a/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs
+++ /dev/null
@@ -1,130 +0,0 @@
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
3namespace WixToolset.Core.Link
4{
5 using System;
6 using System.Collections.Generic;
7 using System.Linq;
8 using WixToolset.Data;
9 using WixToolset.Data.Symbols;
10 using WixToolset.Data.WindowsInstaller;
11
12 /// <summary>
13 /// Add referenced standard directory symbols, if not already present.
14 /// </summary>
15 internal class AddRequiredStandardDirectories
16 {
17 public AddRequiredStandardDirectories(IntermediateSection section, List<WixSimpleReferenceSymbol> references)
18 {
19 this.Section = section;
20 this.References = references;
21 }
22
23 private IntermediateSection Section { get; }
24
25 private List<WixSimpleReferenceSymbol> References { get; }
26
27 public void Execute()
28 {
29 var platform = this.GetPlatformFromSection();
30
31 var directories = this.Section.Symbols.OfType<DirectorySymbol>().ToList();
32 var directoryIds = new SortedSet<string>(directories.Select(d => d.Id.Id));
33
34 // Ensure any standard directory references symbols are added.
35 foreach (var directoryReference in this.References.Where(r => r.Table == "Directory"))
36 {
37 this.EnsureStandardDirectoryAdded(directoryIds, directoryReference.PrimaryKeys, directoryReference.SourceLineNumbers, platform);
38 }
39
40 foreach (var directory in directories)
41 {
42 var parentDirectoryId = directory.ParentDirectoryRef;
43
44 if (String.IsNullOrEmpty(parentDirectoryId))
45 {
46 parentDirectoryId = this.GetStandardDirectoryParent(directory.Id.Id, platform);
47
48 directory.ParentDirectoryRef = parentDirectoryId;
49
50 //if (directory.Id.Id != "TARGETDIR")
51 //{
52 // directory.ParentDirectoryRef = "TARGETDIR";
53 //}
54 }
55
56 if (!String.IsNullOrEmpty(parentDirectoryId))
57 {
58 this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, directory.SourceLineNumbers, platform);
59 }
60 }
61
62 if (!directoryIds.Contains("TARGETDIR") && WindowsInstallerStandard.TryGetStandardDirectory("TARGETDIR", out var targetDir))
63 {
64 directoryIds.Add(targetDir.Id.Id);
65 this.Section.AddSymbol(targetDir);
66 }
67 }
68
69 private void EnsureStandardDirectoryAdded(ISet<string> directoryIds, string directoryId, SourceLineNumber sourceLineNumbers, Platform platform)
70 {
71 if (!directoryIds.Contains(directoryId) && WindowsInstallerStandard.TryGetStandardDirectory(directoryId, out var standardDirectory))
72 {
73 var parentDirectoryId = this.GetStandardDirectoryParent(directoryId, platform);
74
75 var directory = new DirectorySymbol(sourceLineNumbers, standardDirectory.Id)
76 {
77 Name = standardDirectory.Name,
78 ParentDirectoryRef = parentDirectoryId,
79 };
80
81 directoryIds.Add(directory.Id.Id);
82 this.Section.AddSymbol(directory);
83
84 if (!String.IsNullOrEmpty(parentDirectoryId))
85 {
86 this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, sourceLineNumbers, platform);
87 }
88 }
89 }
90
91 private string GetStandardDirectoryParent(string directoryId, Platform platform)
92 {
93 switch (directoryId)
94 {
95 case "TARGETDIR":
96 return null;
97
98 case "CommonFiles6432Folder":
99 case "ProgramFiles6432Folder":
100 case "System6432Folder":
101 return WindowsInstallerStandard.GetPlatformSpecificDirectoryId(directoryId, platform);
102
103 default:
104 return "TARGETDIR";
105 }
106 }
107
108 private Platform GetPlatformFromSection()
109 {
110 var symbol = this.Section.Symbols.OfType<SummaryInformationSymbol>().First(p => p.PropertyId == SummaryInformationType.PlatformAndLanguage);
111
112 var value = symbol.Value;
113 var separatorIndex = value.IndexOf(';');
114 var platformValue = separatorIndex > 0 ? value.Substring(0, separatorIndex) : value;
115
116 switch (platformValue)
117 {
118 case "x64":
119 return Platform.X64;
120
121 case "Arm64":
122 return Platform.ARM64;
123
124 case "Intel":
125 default:
126 return Platform.X86;
127 }
128 }
129 }
130}
diff --git a/src/wix/WixToolset.Core/LinkContext.cs b/src/wix/WixToolset.Core/LinkContext.cs
index 10223171..dd004817 100644
--- a/src/wix/WixToolset.Core/LinkContext.cs
+++ b/src/wix/WixToolset.Core/LinkContext.cs
@@ -30,6 +30,10 @@ namespace WixToolset.Core
30 30
31 public string OutputPath { get; set; } 31 public string OutputPath { get; set; }
32 32
33 public Platform Platform { get; set; }
34
35 public bool SkipStdWixlib { get; set; }
36
33 public ISymbolDefinitionCreator SymbolDefinitionCreator { get; set; } 37 public ISymbolDefinitionCreator SymbolDefinitionCreator { get; set; }
34 38
35 public CancellationToken CancellationToken { get; set; } 39 public CancellationToken CancellationToken { get; set; }
diff --git a/src/wix/WixToolset.Core/Linker.cs b/src/wix/WixToolset.Core/Linker.cs
index 85333da4..0cef88d2 100644
--- a/src/wix/WixToolset.Core/Linker.cs
+++ b/src/wix/WixToolset.Core/Linker.cs
@@ -11,7 +11,6 @@ namespace WixToolset.Core
11 using WixToolset.Core.Link; 11 using WixToolset.Core.Link;
12 using WixToolset.Data; 12 using WixToolset.Data;
13 using WixToolset.Data.Symbols; 13 using WixToolset.Data.Symbols;
14 using WixToolset.Data.WindowsInstaller;
15 using WixToolset.Extensibility.Data; 14 using WixToolset.Extensibility.Data;
16 using WixToolset.Extensibility.Services; 15 using WixToolset.Extensibility.Services;
17 16
@@ -98,8 +97,13 @@ namespace WixToolset.Core
98 } 97 }
99 } 98 }
100 99
101 // TODO: Replace this with "std.wixlib" 100 // Load the standard wixlib.
102 this.LoadStandardSymbols(sections); 101 if (!this.Context.SkipStdWixlib)
102 {
103 var stdlib = WixStandardLibrary.Build(this.Context.Platform);
104
105 sections.AddRange(stdlib.Sections);
106 }
103 107
104 var multipleFeatureComponents = new Hashtable(); 108 var multipleFeatureComponents = new Hashtable();
105 109
@@ -122,9 +126,6 @@ namespace WixToolset.Core
122 } 126 }
123 } 127 }
124 128
125 ////// Add the missing standard action and directory symbols.
126 ////this.LoadStandardSymbols(find.SymbolsByName);
127
128 // Resolve the symbol references to find the set of sections we care about for linking. 129 // Resolve the symbol references to find the set of sections we care about for linking.
129 // Of course, we start with the entry section (that's how it got its name after all). 130 // Of course, we start with the entry section (that's how it got its name after all).
130 var resolve = new ResolveReferencesCommand(this.Messaging, find.EntrySection, find.SymbolsByName); 131 var resolve = new ResolveReferencesCommand(this.Messaging, find.EntrySection, find.SymbolsByName);
@@ -187,7 +188,6 @@ namespace WixToolset.Core
187 // Create a new section to hold the linked content. Start with the entry section's 188 // Create a new section to hold the linked content. Start with the entry section's
188 // metadata. 189 // metadata.
189 var resolvedSection = new IntermediateSection(find.EntrySection.Id, find.EntrySection.Type); 190 var resolvedSection = new IntermediateSection(find.EntrySection.Id, find.EntrySection.Type);
190 var references = new List<WixSimpleReferenceSymbol>();
191 var identicalDirectoryIds = new HashSet<string>(StringComparer.Ordinal); 191 var identicalDirectoryIds = new HashSet<string>(StringComparer.Ordinal);
192 192
193 foreach (var section in sections) 193 foreach (var section in sections)
@@ -263,13 +263,9 @@ namespace WixToolset.Core
263 } 263 }
264 break; 264 break;
265 265
266 case SymbolDefinitionType.WixComplexReference:
267 copySymbol = false;
268 break;
269
270 case SymbolDefinitionType.WixSimpleReference: 266 case SymbolDefinitionType.WixSimpleReference:
267 case SymbolDefinitionType.WixComplexReference:
271 copySymbol = false; 268 copySymbol = false;
272 references.Add(symbol as WixSimpleReferenceSymbol);
273 break; 269 break;
274 270
275 case SymbolDefinitionType.WixVariable: 271 case SymbolDefinitionType.WixVariable:
@@ -310,12 +306,6 @@ namespace WixToolset.Core
310 var command = new FlattenAndProcessBundleTablesCommand(resolvedSection, this.Messaging); 306 var command = new FlattenAndProcessBundleTablesCommand(resolvedSection, this.Messaging);
311 command.Execute(); 307 command.Execute();
312 } 308 }
313 else if (resolvedSection.Type == SectionType.Package || resolvedSection.Type == SectionType.Module)
314 {
315 // Packages and modules get standard directories add.
316 var command = new AddRequiredStandardDirectories(resolvedSection, references);
317 command.Execute();
318 }
319 309
320 if (this.Messaging.EncounteredError) 310 if (this.Messaging.EncounteredError)
321 { 311 {
@@ -365,66 +355,6 @@ namespace WixToolset.Core
365 } 355 }
366 356
367 /// <summary> 357 /// <summary>
368 /// Load the standard action and directory symbols.
369 /// </summary>
370 /// <param name="symbolsByName">Collection of symbols.</param>
371 //private void LoadStandardSymbols(IDictionary<string, SymbolWithSection> symbolsByName)
372 //{
373 // foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
374 // {
375 // var symbolWithSection = new SymbolWithSection(null, actionSymbol);
376 // var fullName = symbolWithSection.GetFullName();
377
378 // // If the action's symbol has not already been defined (i.e. overriden by the user), add it now.
379 // if (!symbolsByName.ContainsKey(fullName))
380 // {
381 // symbolsByName.Add(fullName, symbolWithSection);
382 // }
383 // }
384
385 // foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories())
386 // {
387 // var symbolWithSection = new SymbolWithSection(null, directorySymbol);
388 // var fullName = symbolWithSection.GetFullName();
389
390 // // If the directory's symbol has not already been defined (i.e. overriden by the user), add it now.
391 // if (!symbolsByName.ContainsKey(fullName))
392 // {
393 // symbolsByName.Add(fullName, symbolWithSection);
394 // }
395 // }
396 //}
397
398 private void LoadStandardSymbols(List<IntermediateSection> sections)
399 {
400 foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
401 {
402 var section = new IntermediateSection(actionSymbol.Id.Id, SectionType.Fragment);
403 section.AddSymbol(new WixActionSymbol(null, new Identifier(actionSymbol.Id.Access, actionSymbol.Id.Id))
404 {
405 Action = actionSymbol.Action,
406 SequenceTable = actionSymbol.SequenceTable,
407 Sequence = actionSymbol.Sequence,
408 Condition = actionSymbol.Condition,
409 });
410
411 sections.Add(section);
412 }
413
414 foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories())
415 {
416 var section = new IntermediateSection(directorySymbol.Id.Id, SectionType.Fragment);
417 section.AddSymbol(new DirectorySymbol(null, new Identifier(directorySymbol.Id.Access, directorySymbol.Id.Id))
418 {
419 Name = directorySymbol.Name
420 });
421
422 sections.Add(section);
423 }
424 }
425
426
427 /// <summary>
428 /// Process the complex references. 358 /// Process the complex references.
429 /// </summary> 359 /// </summary>
430 /// <param name="resolvedSection">Active section to add symbols to.</param> 360 /// <param name="resolvedSection">Active section to add symbols to.</param>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
index 3667a2f2..e42c7810 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
@@ -35,6 +35,7 @@ namespace WixToolsetTest.CoreIntegration
35 context.IntermediateFolder = Path.GetTempPath(); 35 context.IntermediateFolder = Path.GetTempPath();
36 context.Intermediates = new[] { intermediate1, intermediate2 }; 36 context.Intermediates = new[] { intermediate1, intermediate2 };
37 context.OutputPath = Path.Combine(context.IntermediateFolder, "test.msi"); 37 context.OutputPath = Path.Combine(context.IntermediateFolder, "test.msi");
38 context.Platform = Platform.X64;
38 context.SymbolDefinitionCreator = creator; 39 context.SymbolDefinitionCreator = creator;
39 40
40 var linker = serviceProvider.GetService<ILinker>(); 41 var linker = serviceProvider.GetService<ILinker>();
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs
index 7de55810..bcbdb00f 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/Variables/Package.wxs
@@ -1,4 +1,4 @@
1<?define Foo = "Foo" ?> 1<?define Foo = "Foo" ?>
2<?define Foo = "Foo" ?> 2<?define Foo = "Foo" ?>
3 3
4<?define Bar = "Bar" ?> 4<?define Bar = "Bar" ?>
@@ -12,7 +12,6 @@
12 12
13<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 13<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
14 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine"> 14 <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="no" InstallerVersion="200" Scope="perMachine">
15
16 15
17 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> 16 <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
18 17
@@ -22,8 +21,8 @@
22 </Package> 21 </Package>
23 22
24 <Fragment> 23 <Fragment>
25 <Directory Id="TARGETDIR" Name="SourceDir"> 24 <Directory Id="override TARGETDIR" Name="SourceDir">
26 <Directory Id="ProgramFilesFolder"> 25 <Directory Id="override ProgramFilesFolder">
27 <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> 26 <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
28 </Directory> 27 </Directory>
29 </Directory> 28 </Directory>