aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2023-12-05 16:11:05 -0800
committerRob Mensching <rob@firegiant.com>2023-12-16 14:32:21 -0800
commit379926377524951c692e8c342a49fb03da61345f (patch)
tree2dad2c9b622cd871fd69a2968e11bfbcc5bd751d
parent7be5d94529c8419b4bd5da4dcd838795622643cb (diff)
downloadwix-379926377524951c692e8c342a49fb03da61345f.tar.gz
wix-379926377524951c692e8c342a49fb03da61345f.tar.bz2
wix-379926377524951c692e8c342a49fb03da61345f.zip
Initial support for virtual symbols.
Completes 7913
-rw-r--r--src/api/wix/WixToolset.Data/AccessModifier.cs24
-rw-r--r--src/api/wix/WixToolset.Data/ErrorMessages.cs4
-rw-r--r--src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs278
-rw-r--r--src/api/wix/test/WixToolsetTest.Data/SerializeFixture.cs27
-rw-r--r--src/ext/UI/wixlib/WixUI_Minimal.wxs4
-rw-r--r--src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs4
-rw-r--r--src/wix/WixToolset.Core/Compiler_Package.cs21
-rw-r--r--src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs8
-rw-r--r--src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs15
-rw-r--r--src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs47
-rw-r--r--src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs16
-rw-r--r--src/wix/WixToolset.Core/Link/SymbolWithSection.cs19
-rw-r--r--src/wix/WixToolset.Core/Linker.cs71
-rw-r--r--src/wix/WixToolset.Core/LinkerErrors.cs6
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs159
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/RollbackBoundaryFixture.cs2
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs14
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicatedOverrideVirtualSymbol.wxs17
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/HasVirtualSymbol.wxs8
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/InvalidCrossFragmentReference.wxs10
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbol.wxs13
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs20
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideWithoutVirtualSymbol.wxs8
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolOverridden.wxs12
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/OverridableActions/Package.wxs2
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/TestData/UI/DialogsInInstallUISequence.wxs4
-rw-r--r--src/wix/test/WixToolsetTest.CoreIntegration/UIFixture.cs8
27 files changed, 621 insertions, 200 deletions
diff --git a/src/api/wix/WixToolset.Data/AccessModifier.cs b/src/api/wix/WixToolset.Data/AccessModifier.cs
index 191558b5..3a125f14 100644
--- a/src/api/wix/WixToolset.Data/AccessModifier.cs
+++ b/src/api/wix/WixToolset.Data/AccessModifier.cs
@@ -28,11 +28,21 @@ namespace WixToolset.Data
28 Protected = File, 28 Protected = File,
29 29
30 /// <summary> 30 /// <summary>
31 /// Indicates the identifiers is visible only to the section where it is defined. 31 /// Indicates the identifier is visible only to the section where it is defined.
32 /// </summary> 32 /// </summary>
33 Section, 33 Section,
34 [Obsolete] 34 [Obsolete]
35 Private = Section, 35 Private = Section,
36
37 /// <summary>
38 /// Indicates the identifier can be overridden by another symbol.
39 /// </summary>
40 Virtual,
41
42 /// <summary>
43 /// Indicates the identifier overrides a virtual symbol.
44 /// </summary>
45 Override,
36 } 46 }
37 47
38 /// <summary> 48 /// <summary>
@@ -65,6 +75,12 @@ namespace WixToolset.Data
65 case "private": 75 case "private":
66 return AccessModifier.Section; 76 return AccessModifier.Section;
67 77
78 case "virtual":
79 return AccessModifier.Virtual;
80
81 case "override":
82 return AccessModifier.Override;
83
68 default: 84 default:
69 throw new ArgumentException($"Unknown AccessModifier: {access}", nameof(access)); 85 throw new ArgumentException($"Unknown AccessModifier: {access}", nameof(access));
70 } 86 }
@@ -91,6 +107,12 @@ namespace WixToolset.Data
91 case AccessModifier.Section: 107 case AccessModifier.Section:
92 return "section"; 108 return "section";
93 109
110 case AccessModifier.Virtual:
111 return "virtual";
112
113 case AccessModifier.Override:
114 return "override";
115
94 default: 116 default:
95 throw new ArgumentException($"Unknown AccessModifier: {access}", nameof(access)); 117 throw new ArgumentException($"Unknown AccessModifier: {access}", nameof(access));
96 } 118 }
diff --git a/src/api/wix/WixToolset.Data/ErrorMessages.cs b/src/api/wix/WixToolset.Data/ErrorMessages.cs
index 7cb0f4f9..889d1762 100644
--- a/src/api/wix/WixToolset.Data/ErrorMessages.cs
+++ b/src/api/wix/WixToolset.Data/ErrorMessages.cs
@@ -325,12 +325,12 @@ namespace WixToolset.Data
325 325
326 public static Message DuplicateSymbol(SourceLineNumber sourceLineNumbers, string symbolName) 326 public static Message DuplicateSymbol(SourceLineNumber sourceLineNumbers, string symbolName)
327 { 327 {
328 return Message(sourceLineNumbers, Ids.DuplicateSymbol, "Duplicate symbol '{0}' found. This typically means that an Id is duplicated. Access modifiers (internal, protected, private) cannot prevent these conflicts. Ensure all your identifiers of a given type (File, Component, Feature) are unique.", symbolName); 328 return Message(sourceLineNumbers, Ids.DuplicateSymbol, "Duplicate symbol '{0}' found. This typically means that an Id is duplicated. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.", symbolName);
329 } 329 }
330 330
331 public static Message DuplicateSymbol(SourceLineNumber sourceLineNumbers, string symbolName, string referencingSourceLineNumber) 331 public static Message DuplicateSymbol(SourceLineNumber sourceLineNumbers, string symbolName, string referencingSourceLineNumber)
332 { 332 {
333 return Message(sourceLineNumbers, Ids.DuplicateSymbol, "Duplicate symbol '{0}' referenced by {1}. This typically means that an Id is duplicated. Ensure all your identifiers of a given type (File, Component, Feature) are unique or use an access modifier to scope the identfier.", symbolName, referencingSourceLineNumber); 333 return Message(sourceLineNumbers, Ids.DuplicateSymbol, "Duplicate symbol '{0}' referenced by {1}. This typically means that an Id is duplicated. Ensure all your identifiers of a given type (Directory, File, etc.) are unique or use an access modifier to scope the identfier.", symbolName, referencingSourceLineNumber);
334 } 334 }
335 335
336 public static Message DuplicateSymbol2(SourceLineNumber sourceLineNumbers) 336 public static Message DuplicateSymbol2(SourceLineNumber sourceLineNumbers)
diff --git a/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs b/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
index 0fe7601e..17267cf7 100644
--- a/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
+++ b/src/api/wix/WixToolset.Data/WindowsInstaller/WindowsInstallerStandard.cs
@@ -213,157 +213,157 @@ namespace WixToolset.Data.WindowsInstaller
213 var standardActions = new[] 213 var standardActions = new[]
214 { 214 {
215 // AdminExecuteSequence 215 // AdminExecuteSequence
216 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 216 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminExecuteSequence },
217 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 217 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminExecuteSequence },
218 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 218 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminExecuteSequence },
219 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 219 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminExecuteSequence },
220 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 220 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdminExecuteSequence },
221 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 221 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdminExecuteSequence },
222 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/InstallAdminPackage")) { Action="InstallAdminPackage",Sequence=3900, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 222 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/InstallAdminPackage")) { Action="InstallAdminPackage",Sequence=3900, SequenceTable=SequenceTable.AdminExecuteSequence },
223 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/InstallFiles")) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 223 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/InstallFiles")) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.AdminExecuteSequence },
224 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/PatchFiles")) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 224 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/PatchFiles")) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.AdminExecuteSequence },
225 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdminExecuteSequence, Overridable = true }, 225 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdminExecuteSequence },
226 226
227 // AdminUISequence 227 // AdminUISequence
228 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminUISequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminUISequence, Overridable = true }, 228 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminUISequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.AdminUISequence },
229 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminUISequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminUISequence, Overridable = true }, 229 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminUISequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdminUISequence },
230 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminUISequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminUISequence, Overridable = true }, 230 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminUISequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.AdminUISequence },
231 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminUISequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminUISequence, Overridable = true }, 231 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminUISequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdminUISequence },
232 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdminUISequence/ExecuteAction")) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.AdminUISequence, Overridable = true }, 232 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdminUISequence/ExecuteAction")) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.AdminUISequence },
233 233
234 // AdvertiseExecuteSequence 234 // AdvertiseExecuteSequence
235 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 235 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
236 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 236 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
237 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 237 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
238 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 238 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
239 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/CreateShortcuts")) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 239 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/CreateShortcuts")) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
240 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/RegisterClassInfo")) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 240 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/RegisterClassInfo")) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
241 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/RegisterExtensionInfo")) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 241 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/RegisterExtensionInfo")) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
242 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/RegisterProgIdInfo")) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 242 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/RegisterProgIdInfo")) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
243 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/RegisterMIMEInfo")) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 243 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/RegisterMIMEInfo")) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
244 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/PublishComponents")) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 244 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/PublishComponents")) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
245 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/MsiPublishAssemblies")) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 245 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/MsiPublishAssemblies")) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
246 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/PublishFeatures")) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 246 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/PublishFeatures")) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
247 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/PublishProduct")) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 247 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/PublishProduct")) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
248 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "AdvertiseExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdvertiseExecuteSequence, Overridable = true }, 248 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "AdvertiseExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.AdvertiseExecuteSequence },
249 249
250 // InstallUISequence 250 // InstallUISequence
251 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/FindRelatedProducts")) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 251 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/FindRelatedProducts")) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallUISequence },
252 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/AppSearch")) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 252 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/AppSearch")) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallUISequence },
253 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 253 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallUISequence },
254 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/CCPSearch")) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallUISequence, Overridable = true, Condition="NOT Installed" }, 254 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/CCPSearch")) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallUISequence, Condition="NOT Installed" },
255 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/RMCCPSearch")) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallUISequence, Overridable = true, Condition="NOT Installed" }, 255 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/RMCCPSearch")) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallUISequence, Condition="NOT Installed" },
256 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/ValidateProductID")) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 256 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/ValidateProductID")) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallUISequence },
257 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 257 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallUISequence },
258 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 258 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallUISequence },
259 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/IsolateComponents")) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 259 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/IsolateComponents")) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallUISequence },
260 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 260 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallUISequence },
261 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/MigrateFeatureStates")) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 261 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/MigrateFeatureStates")) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallUISequence },
262 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallUISequence/ExecuteAction")) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.InstallUISequence, Overridable = true }, 262 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallUISequence/ExecuteAction")) { Action="ExecuteAction", Sequence=1300, SequenceTable=SequenceTable.InstallUISequence },
263 263
264 // InstallExecuteSequence 264 // InstallExecuteSequence
265 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/FindRelatedProducts")) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 265 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/FindRelatedProducts")) { Action="FindRelatedProducts", Sequence=25, SequenceTable=SequenceTable.InstallExecuteSequence },
266 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/AppSearch")) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 266 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/AppSearch")) { Action="AppSearch", Sequence=50, SequenceTable=SequenceTable.InstallExecuteSequence },
267 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 267 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/LaunchConditions")) { Action="LaunchConditions", Sequence=100, SequenceTable=SequenceTable.InstallExecuteSequence },
268 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/CCPSearch")) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="NOT Installed" }, 268 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/CCPSearch")) { Action="CCPSearch", Sequence=500, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
269 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RMCCPSearch")) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="NOT Installed" }, 269 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RMCCPSearch")) { Action="RMCCPSearch", Sequence=600, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
270 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/ValidateProductID")) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 270 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/ValidateProductID")) { Action="ValidateProductID", Sequence=700, SequenceTable=SequenceTable.InstallExecuteSequence },
271 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 271 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/CostInitialize")) { Action="CostInitialize", Sequence=800, SequenceTable=SequenceTable.InstallExecuteSequence },
272 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 272 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/FileCost")) { Action="FileCost", Sequence=900, SequenceTable=SequenceTable.InstallExecuteSequence },
273 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/IsolateComponents")) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 273 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/IsolateComponents")) { Action="IsolateComponents", Sequence=950, SequenceTable=SequenceTable.InstallExecuteSequence },
274 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 274 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/CostFinalize")) { Action="CostFinalize", Sequence=1000, SequenceTable=SequenceTable.InstallExecuteSequence },
275 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/SetODBCFolders")) { Action="SetODBCFolders", Sequence=1100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 275 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/SetODBCFolders")) { Action="SetODBCFolders", Sequence=1100, SequenceTable=SequenceTable.InstallExecuteSequence },
276 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/MigrateFeatureStates")) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 276 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/MigrateFeatureStates")) { Action="MigrateFeatureStates", Sequence=1200, SequenceTable=SequenceTable.InstallExecuteSequence },
277 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 277 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallValidate")) { Action="InstallValidate", Sequence=1400, SequenceTable=SequenceTable.InstallExecuteSequence },
278 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 278 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallInitialize")) { Action="InstallInitialize", Sequence=1500, SequenceTable=SequenceTable.InstallExecuteSequence },
279 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/AllocateRegistrySpace")) { Action="AllocateRegistrySpace", Sequence=1550, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 279 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/AllocateRegistrySpace")) { Action="AllocateRegistrySpace", Sequence=1550, SequenceTable=SequenceTable.InstallExecuteSequence },
280 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/ProcessComponents")) { Action="ProcessComponents", Sequence=1600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 280 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/ProcessComponents")) { Action="ProcessComponents", Sequence=1600, SequenceTable=SequenceTable.InstallExecuteSequence },
281 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnpublishComponents")) { Action="UnpublishComponents", Sequence=1700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 281 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnpublishComponents")) { Action="UnpublishComponents", Sequence=1700, SequenceTable=SequenceTable.InstallExecuteSequence },
282 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/MsiUnpublishAssemblies")) { Action="MsiUnpublishAssemblies", Sequence=1750, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 282 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/MsiUnpublishAssemblies")) { Action="MsiUnpublishAssemblies", Sequence=1750, SequenceTable=SequenceTable.InstallExecuteSequence },
283 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnpublishFeatures")) { Action="UnpublishFeatures", Sequence=1800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 283 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnpublishFeatures")) { Action="UnpublishFeatures", Sequence=1800, SequenceTable=SequenceTable.InstallExecuteSequence },
284 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/StopServices")) { Action="StopServices", Sequence=1900, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="VersionNT" }, 284 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/StopServices")) { Action="StopServices", Sequence=1900, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
285 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/DeleteServices")) { Action="DeleteServices", Sequence=2000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="VersionNT" }, 285 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/DeleteServices")) { Action="DeleteServices", Sequence=2000, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
286 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterComPlus")) { Action="UnregisterComPlus", Sequence=2100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 286 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterComPlus")) { Action="UnregisterComPlus", Sequence=2100, SequenceTable=SequenceTable.InstallExecuteSequence },
287 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/SelfUnregModules")) { Action="SelfUnregModules", Sequence=2200, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 287 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/SelfUnregModules")) { Action="SelfUnregModules", Sequence=2200, SequenceTable=SequenceTable.InstallExecuteSequence },
288 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterTypeLibraries")) { Action="UnregisterTypeLibraries", Sequence=2300, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 288 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterTypeLibraries")) { Action="UnregisterTypeLibraries", Sequence=2300, SequenceTable=SequenceTable.InstallExecuteSequence },
289 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveODBC")) { Action="RemoveODBC", Sequence=2400, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 289 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveODBC")) { Action="RemoveODBC", Sequence=2400, SequenceTable=SequenceTable.InstallExecuteSequence },
290 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterFonts")) { Action="UnregisterFonts", Sequence=2500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 290 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterFonts")) { Action="UnregisterFonts", Sequence=2500, SequenceTable=SequenceTable.InstallExecuteSequence },
291 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveRegistryValues")) { Action="RemoveRegistryValues", Sequence=2600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 291 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveRegistryValues")) { Action="RemoveRegistryValues", Sequence=2600, SequenceTable=SequenceTable.InstallExecuteSequence },
292 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterClassInfo")) { Action="UnregisterClassInfo", Sequence=2700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 292 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterClassInfo")) { Action="UnregisterClassInfo", Sequence=2700, SequenceTable=SequenceTable.InstallExecuteSequence },
293 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterExtensionInfo")) { Action="UnregisterExtensionInfo", Sequence=2800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 293 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterExtensionInfo")) { Action="UnregisterExtensionInfo", Sequence=2800, SequenceTable=SequenceTable.InstallExecuteSequence },
294 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterProgIdInfo")) { Action="UnregisterProgIdInfo", Sequence=2900, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 294 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterProgIdInfo")) { Action="UnregisterProgIdInfo", Sequence=2900, SequenceTable=SequenceTable.InstallExecuteSequence },
295 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/UnregisterMIMEInfo")) { Action="UnregisterMIMEInfo", Sequence=3000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 295 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/UnregisterMIMEInfo")) { Action="UnregisterMIMEInfo", Sequence=3000, SequenceTable=SequenceTable.InstallExecuteSequence },
296 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveIniValues")) { Action="RemoveIniValues", Sequence=3100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 296 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveIniValues")) { Action="RemoveIniValues", Sequence=3100, SequenceTable=SequenceTable.InstallExecuteSequence },
297 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveShortcuts")) { Action="RemoveShortcuts", Sequence=3200, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 297 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveShortcuts")) { Action="RemoveShortcuts", Sequence=3200, SequenceTable=SequenceTable.InstallExecuteSequence },
298 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveEnvironmentStrings")) { Action="RemoveEnvironmentStrings", Sequence=3300, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 298 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveEnvironmentStrings")) { Action="RemoveEnvironmentStrings", Sequence=3300, SequenceTable=SequenceTable.InstallExecuteSequence },
299 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveDuplicateFiles")) { Action="RemoveDuplicateFiles", Sequence=3400, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 299 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveDuplicateFiles")) { Action="RemoveDuplicateFiles", Sequence=3400, SequenceTable=SequenceTable.InstallExecuteSequence },
300 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveFiles")) { Action="RemoveFiles", Sequence=3500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 300 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveFiles")) { Action="RemoveFiles", Sequence=3500, SequenceTable=SequenceTable.InstallExecuteSequence },
301 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RemoveFolders")) { Action="RemoveFolders", Sequence=3600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 301 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RemoveFolders")) { Action="RemoveFolders", Sequence=3600, SequenceTable=SequenceTable.InstallExecuteSequence },
302 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/CreateFolders")) { Action="CreateFolders", Sequence=3700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 302 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/CreateFolders")) { Action="CreateFolders", Sequence=3700, SequenceTable=SequenceTable.InstallExecuteSequence },
303 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/MoveFiles")) { Action="MoveFiles", Sequence=3800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 303 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/MoveFiles")) { Action="MoveFiles", Sequence=3800, SequenceTable=SequenceTable.InstallExecuteSequence },
304 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallFiles")) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 304 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallFiles")) { Action="InstallFiles", Sequence=4000, SequenceTable=SequenceTable.InstallExecuteSequence },
305 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/PatchFiles")) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 305 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/PatchFiles")) { Action="PatchFiles", Sequence=4090, SequenceTable=SequenceTable.InstallExecuteSequence },
306 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/DuplicateFiles")) { Action="DuplicateFiles", Sequence=4210, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 306 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/DuplicateFiles")) { Action="DuplicateFiles", Sequence=4210, SequenceTable=SequenceTable.InstallExecuteSequence },
307 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/BindImage")) { Action="BindImage", Sequence=4300, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 307 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/BindImage")) { Action="BindImage", Sequence=4300, SequenceTable=SequenceTable.InstallExecuteSequence },
308 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/CreateShortcuts")) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 308 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/CreateShortcuts")) { Action="CreateShortcuts", Sequence=4500, SequenceTable=SequenceTable.InstallExecuteSequence },
309 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterClassInfo")) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 309 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterClassInfo")) { Action="RegisterClassInfo", Sequence=4600, SequenceTable=SequenceTable.InstallExecuteSequence },
310 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterExtensionInfo")) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 310 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterExtensionInfo")) { Action="RegisterExtensionInfo", Sequence=4700, SequenceTable=SequenceTable.InstallExecuteSequence },
311 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterProgIdInfo")) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 311 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterProgIdInfo")) { Action="RegisterProgIdInfo", Sequence=4800, SequenceTable=SequenceTable.InstallExecuteSequence },
312 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterMIMEInfo")) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 312 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterMIMEInfo")) { Action="RegisterMIMEInfo", Sequence=4900, SequenceTable=SequenceTable.InstallExecuteSequence },
313 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/WriteRegistryValues")) { Action="WriteRegistryValues", Sequence=5000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 313 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/WriteRegistryValues")) { Action="WriteRegistryValues", Sequence=5000, SequenceTable=SequenceTable.InstallExecuteSequence },
314 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/WriteIniValues")) { Action="WriteIniValues", Sequence=5100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 314 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/WriteIniValues")) { Action="WriteIniValues", Sequence=5100, SequenceTable=SequenceTable.InstallExecuteSequence },
315 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/WriteEnvironmentStrings")) { Action="WriteEnvironmentStrings", Sequence=5200, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 315 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/WriteEnvironmentStrings")) { Action="WriteEnvironmentStrings", Sequence=5200, SequenceTable=SequenceTable.InstallExecuteSequence },
316 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterFonts")) { Action="RegisterFonts", Sequence=5300, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 316 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterFonts")) { Action="RegisterFonts", Sequence=5300, SequenceTable=SequenceTable.InstallExecuteSequence },
317 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallODBC")) { Action="InstallODBC", Sequence=5400, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 317 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallODBC")) { Action="InstallODBC", Sequence=5400, SequenceTable=SequenceTable.InstallExecuteSequence },
318 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterTypeLibraries")) { Action="RegisterTypeLibraries", Sequence=5500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 318 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterTypeLibraries")) { Action="RegisterTypeLibraries", Sequence=5500, SequenceTable=SequenceTable.InstallExecuteSequence },
319 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/SelfRegModules")) { Action="SelfRegModules", Sequence=5600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 319 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/SelfRegModules")) { Action="SelfRegModules", Sequence=5600, SequenceTable=SequenceTable.InstallExecuteSequence },
320 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterComPlus")) { Action="RegisterComPlus", Sequence=5700, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 320 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterComPlus")) { Action="RegisterComPlus", Sequence=5700, SequenceTable=SequenceTable.InstallExecuteSequence },
321 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallServices")) { Action="InstallServices", Sequence=5800, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="VersionNT" }, 321 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallServices")) { Action="InstallServices", Sequence=5800, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
322 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/MsiConfigureServices")) { Action="MsiConfigureServices", Sequence=5850, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="VersionNT>=600" }, 322 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/MsiConfigureServices")) { Action="MsiConfigureServices", Sequence=5850, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT>=600" },
323 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/StartServices")) { Action="StartServices", Sequence=5900, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="VersionNT" }, 323 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/StartServices")) { Action="StartServices", Sequence=5900, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="VersionNT" },
324 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterUser")) { Action="RegisterUser", Sequence=6000, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 324 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterUser")) { Action="RegisterUser", Sequence=6000, SequenceTable=SequenceTable.InstallExecuteSequence },
325 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/RegisterProduct")) { Action="RegisterProduct", Sequence=6100, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 325 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/RegisterProduct")) { Action="RegisterProduct", Sequence=6100, SequenceTable=SequenceTable.InstallExecuteSequence },
326 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/PublishComponents")) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 326 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/PublishComponents")) { Action="PublishComponents", Sequence=6200, SequenceTable=SequenceTable.InstallExecuteSequence },
327 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/MsiPublishAssemblies")) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 327 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/MsiPublishAssemblies")) { Action="MsiPublishAssemblies", Sequence=6250, SequenceTable=SequenceTable.InstallExecuteSequence },
328 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/PublishFeatures")) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 328 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/PublishFeatures")) { Action="PublishFeatures", Sequence=6300, SequenceTable=SequenceTable.InstallExecuteSequence },
329 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/PublishProduct")) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 329 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/PublishProduct")) { Action="PublishProduct", Sequence=6400, SequenceTable=SequenceTable.InstallExecuteSequence },
330 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallExecute")) { Action="InstallExecute", Sequence=6500, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="NOT Installed" }, 330 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallExecute")) { Action="InstallExecute", Sequence=6500, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
331 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallExecuteAgain")) { Action="InstallExecuteAgain", Sequence=6550, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true, Condition="NOT Installed" }, 331 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallExecuteAgain")) { Action="InstallExecuteAgain", Sequence=6550, SequenceTable=SequenceTable.InstallExecuteSequence, Condition="NOT Installed" },
332 new WixActionSymbol(null, new Identifier(AccessModifier.Global, "InstallExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence, Overridable = true }, 332 new WixActionSymbol(null, new Identifier(AccessModifier.Virtual, "InstallExecuteSequence/InstallFinalize")) { Action="InstallFinalize", Sequence=6600, SequenceTable=SequenceTable.InstallExecuteSequence },
333 }; 333 };
334 334
335 var standardDirectories = new[] 335 var standardDirectories = new[]
336 { 336 {
337 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "TARGETDIR")) { Name = "SourceDir" }, 337 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TARGETDIR")) { Name = "SourceDir" },
338 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "AdminToolsFolder")) { Name = "Admin" }, 338 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AdminToolsFolder")) { Name = "Admin" },
339 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "AppDataFolder")) { Name = "AppData" }, 339 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "AppDataFolder")) { Name = "AppData" },
340 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "CommonAppDataFolder")) { Name = "CommApp" }, 340 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonAppDataFolder")) { Name = "CommApp" },
341 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "CommonFilesFolder")) { Name = "CFiles" }, 341 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFilesFolder")) { Name = "CFiles" },
342 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "CommonFiles64Folder")) { Name = "CFiles64" }, 342 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles64Folder")) { Name = "CFiles64" },
343 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "CommonFiles6432Folder")) { Name = "." }, 343 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "CommonFiles6432Folder")) { Name = "." },
344 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "DesktopFolder")) { Name = "Desktop" }, 344 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "DesktopFolder")) { Name = "Desktop" },
345 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "FavoritesFolder")) { Name = "Favs" }, 345 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FavoritesFolder")) { Name = "Favs" },
346 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "FontsFolder")) { Name = "Fonts" }, 346 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "FontsFolder")) { Name = "Fonts" },
347 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "LocalAppDataFolder")) { Name = "LocalApp" }, 347 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "LocalAppDataFolder")) { Name = "LocalApp" },
348 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "MyPicturesFolder")) { Name = "Pictures" }, 348 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "MyPicturesFolder")) { Name = "Pictures" },
349 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "NetHoodFolder")) { Name = "NetHood" }, 349 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "NetHoodFolder")) { Name = "NetHood" },
350 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "PersonalFolder")) { Name = "Personal" }, 350 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PersonalFolder")) { Name = "Personal" },
351 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "PrintHoodFolder")) { Name = "Printers" }, 351 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "PrintHoodFolder")) { Name = "Printers" },
352 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "ProgramFilesFolder")) { Name = "PFiles" }, 352 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFilesFolder")) { Name = "PFiles" },
353 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "ProgramFiles64Folder")) { Name = "PFiles64" }, 353 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles64Folder")) { Name = "PFiles64" },
354 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "ProgramFiles6432Folder")) { Name = "." }, 354 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramFiles6432Folder")) { Name = "." },
355 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "ProgramMenuFolder")) { Name = "PMenu" }, 355 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "ProgramMenuFolder")) { Name = "PMenu" },
356 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "RecentFolder")) { Name = "Recent" }, 356 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "RecentFolder")) { Name = "Recent" },
357 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "SendToFolder")) { Name = "SendTo" }, 357 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SendToFolder")) { Name = "SendTo" },
358 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "StartMenuFolder")) { Name = "StrtMenu" }, 358 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartMenuFolder")) { Name = "StrtMenu" },
359 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "StartupFolder")) { Name = "StartUp" }, 359 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "StartupFolder")) { Name = "StartUp" },
360 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "SystemFolder")) { Name = "System" }, 360 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "SystemFolder")) { Name = "System" },
361 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "System16Folder")) { Name = "System16" }, 361 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System16Folder")) { Name = "System16" },
362 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "System64Folder")) { Name = "System64" }, 362 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System64Folder")) { Name = "System64" },
363 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "System6432Folder")) { Name = "." }, 363 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "System6432Folder")) { Name = "." },
364 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "TempFolder")) { Name = "Temp" }, 364 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TempFolder")) { Name = "Temp" },
365 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "TemplateFolder")) { Name = "Template" }, 365 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "TemplateFolder")) { Name = "Template" },
366 new DirectorySymbol(null, new Identifier(AccessModifier.Global, "WindowsFolder")) { Name = "Windows" }, 366 new DirectorySymbol(null, new Identifier(AccessModifier.Virtual, "WindowsFolder")) { Name = "Windows" },
367 }; 367 };
368 368
369 standardActionNames = new HashSet<string>(standardActions.Select(a => a.Action)); 369 standardActionNames = new HashSet<string>(standardActions.Select(a => a.Action));
diff --git a/src/api/wix/test/WixToolsetTest.Data/SerializeFixture.cs b/src/api/wix/test/WixToolsetTest.Data/SerializeFixture.cs
index 8c8a23b4..29ce1985 100644
--- a/src/api/wix/test/WixToolsetTest.Data/SerializeFixture.cs
+++ b/src/api/wix/test/WixToolsetTest.Data/SerializeFixture.cs
@@ -31,6 +31,12 @@ namespace WixToolsetTest.Data
31 KeyPath = null, 31 KeyPath = null,
32 }); 32 });
33 33
34 section.AddSymbol(new DirectorySymbol(sln, new Identifier(AccessModifier.Virtual, "TestFolder"))
35 {
36 ParentDirectoryRef = String.Empty,
37 Name = "Test Folder",
38 });
39
34 var intermediate = new Intermediate("TestIntermediate", IntermediateLevels.Compiled, new[] { section }, null); 40 var intermediate = new Intermediate("TestIntermediate", IntermediateLevels.Compiled, new[] { section }, null);
35 41
36 intermediate.UpdateLevel(IntermediateLevels.Linked); 42 intermediate.UpdateLevel(IntermediateLevels.Linked);
@@ -47,14 +53,21 @@ namespace WixToolsetTest.Data
47 Assert.True(loaded.HasLevel(IntermediateLevels.Linked)); 53 Assert.True(loaded.HasLevel(IntermediateLevels.Linked));
48 Assert.True(loaded.HasLevel(IntermediateLevels.Resolved)); 54 Assert.True(loaded.HasLevel(IntermediateLevels.Resolved));
49 55
50 var symbol = (ComponentSymbol)loaded.Sections.Single().Symbols.Single(); 56 var componentSymbol = loaded.Sections.Single().Symbols.OfType<ComponentSymbol>().Single();
57
58 Assert.Equal("TestComponent", componentSymbol.Id.Id);
59 Assert.Equal(AccessModifier.Global, componentSymbol.Id.Access);
60 Assert.Equal(String.Empty, componentSymbol.ComponentId);
61 Assert.Equal("TestFolder", componentSymbol.DirectoryRef);
62 Assert.Equal(ComponentLocation.Either, componentSymbol.Location);
63 Assert.Null(componentSymbol.KeyPath);
64
65 var directorySymbol = loaded.Sections.Single().Symbols.OfType<DirectorySymbol>().Single();
51 66
52 Assert.Equal("TestComponent", symbol.Id.Id); 67 Assert.Equal("TestFolder", directorySymbol.Id.Id);
53 Assert.Equal(AccessModifier.Global, symbol.Id.Access); 68 Assert.Equal(AccessModifier.Virtual, directorySymbol.Id.Access);
54 Assert.Equal(String.Empty, symbol.ComponentId); 69 Assert.Equal(String.Empty, directorySymbol.ParentDirectoryRef);
55 Assert.Equal("TestFolder", symbol.DirectoryRef); 70 Assert.Equal("Test Folder", directorySymbol.Name);
56 Assert.Equal(ComponentLocation.Either, symbol.Location);
57 Assert.Null(symbol.KeyPath);
58 } 71 }
59 finally 72 finally
60 { 73 {
diff --git a/src/ext/UI/wixlib/WixUI_Minimal.wxs b/src/ext/UI/wixlib/WixUI_Minimal.wxs
index 0c69d8f8..e6f3437a 100644
--- a/src/ext/UI/wixlib/WixUI_Minimal.wxs
+++ b/src/ext/UI/wixlib/WixUI_Minimal.wxs
@@ -58,8 +58,8 @@ Patch dialog sequence:
58 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="Installed AND PATCH" /> 58 <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2" Condition="Installed AND PATCH" />
59 59
60 <InstallUISequence> 60 <InstallUISequence>
61 <Show Dialog="WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" /> 61 <Show Dialog="override WelcomeDlg" Before="WelcomeEulaDlg" Condition="Installed AND PATCH" />
62 <Show Dialog="WelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" /> 62 <Show Dialog="override WelcomeEulaDlg" Before="ProgressDlg" Condition="NOT Installed" />
63 </InstallUISequence> 63 </InstallUISequence>
64 64
65 <Property Id="ARPNOMODIFY" Value="1" /> 65 <Property Id="ARPNOMODIFY" Value="1" />
diff --git a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
index 39d5680b..3cda47ae 100644
--- a/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
+++ b/src/wix/WixToolset.Core.WindowsInstaller/Bind/SequenceActionsCommand.cs
@@ -108,7 +108,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
108 // the binder. 108 // the binder.
109 if (requiredActionSymbols.TryGetValue(key, out var requiredActionSymbol)) 109 if (requiredActionSymbols.TryGetValue(key, out var requiredActionSymbol))
110 { 110 {
111 if (requiredActionSymbol.Overridable) 111 if (requiredActionSymbol.Overridable || requiredActionSymbol.Id.Access == AccessModifier.Virtual)
112 { 112 {
113 this.Messaging.Write(WarningMessages.SuppressAction(suppressActionSymbol.SourceLineNumbers, suppressActionSymbol.Action, suppressActionSymbol.SequenceTable.ToString())); 113 this.Messaging.Write(WarningMessages.SuppressAction(suppressActionSymbol.SourceLineNumbers, suppressActionSymbol.Action, suppressActionSymbol.SequenceTable.ToString()));
114 if (null != requiredActionSymbol.SourceLineNumbers) 114 if (null != requiredActionSymbol.SourceLineNumbers)
@@ -240,7 +240,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
240 // Schedule the relatively scheduled actions (by resolving the dependency trees). 240 // Schedule the relatively scheduled actions (by resolving the dependency trees).
241 var previousUsedSequence = 0; 241 var previousUsedSequence = 0;
242 var relativeActionSymbols = new List<WixActionSymbol>(); 242 var relativeActionSymbols = new List<WixActionSymbol>();
243 for (int j = 0; j < absoluteActionSymbols.Count; j++) 243 for (var j = 0; j < absoluteActionSymbols.Count; j++)
244 { 244 {
245 var absoluteActionSymbol = absoluteActionSymbols[j]; 245 var absoluteActionSymbol = absoluteActionSymbols[j];
246 246
diff --git a/src/wix/WixToolset.Core/Compiler_Package.cs b/src/wix/WixToolset.Core/Compiler_Package.cs
index c8a1ae59..bfc59c75 100644
--- a/src/wix/WixToolset.Core/Compiler_Package.cs
+++ b/src/wix/WixToolset.Core/Compiler_Package.cs
@@ -2463,6 +2463,7 @@ namespace WixToolset.Core
2463 foreach (var child in node.Elements()) 2463 foreach (var child in node.Elements())
2464 { 2464 {
2465 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child); 2465 var childSourceLineNumbers = Preprocessor.GetSourceLineNumbers(child);
2466 Identifier actionIdentifier = null;
2466 var actionName = child.Name.LocalName; 2467 var actionName = child.Name.LocalName;
2467 string afterAction = null; 2468 string afterAction = null;
2468 string beforeAction = null; 2469 string beforeAction = null;
@@ -2485,8 +2486,9 @@ namespace WixToolset.Core
2485 case "Action": 2486 case "Action":
2486 if (customAction) 2487 if (customAction)
2487 { 2488 {
2488 actionName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, attrib); 2489 actionIdentifier = this.Core.GetAttributeIdentifier(childSourceLineNumbers, attrib);
2489 this.Core.CreateSimpleReference(childSourceLineNumbers, SymbolDefinitions.CustomAction, actionName); 2490 actionName = actionIdentifier.Id;
2491 this.Core.CreateSimpleReference(childSourceLineNumbers, SymbolDefinitions.CustomAction, actionIdentifier.Id);
2490 } 2492 }
2491 else 2493 else
2492 { 2494 {
@@ -2521,7 +2523,8 @@ namespace WixToolset.Core
2521 case "Dialog": 2523 case "Dialog":
2522 if (showDialog) 2524 if (showDialog)
2523 { 2525 {
2524 actionName = this.Core.GetAttributeIdentifierValue(childSourceLineNumbers, attrib); 2526 actionIdentifier = this.Core.GetAttributeIdentifier(childSourceLineNumbers, attrib);
2527 actionName = actionIdentifier.Id;
2525 this.Core.CreateSimpleReference(childSourceLineNumbers, SymbolDefinitions.Dialog, actionName); 2528 this.Core.CreateSimpleReference(childSourceLineNumbers, SymbolDefinitions.Dialog, actionName);
2526 } 2529 }
2527 else 2530 else
@@ -2645,7 +2648,17 @@ namespace WixToolset.Core
2645 } 2648 }
2646 else 2649 else
2647 { 2650 {
2648 var symbol = this.Core.AddSymbol(new WixActionSymbol(childSourceLineNumbers, new Identifier(AccessModifier.Global, sequenceTable, actionName)) 2651 var access = AccessModifier.Global;
2652 if (overridable)
2653 {
2654 access = AccessModifier.Virtual;
2655 }
2656 else if (actionIdentifier != null)
2657 {
2658 access = actionIdentifier.Access;
2659 }
2660
2661 var symbol = this.Core.AddSymbol(new WixActionSymbol(childSourceLineNumbers, new Identifier(access, sequenceTable, actionName))
2649 { 2662 {
2650 SequenceTable = sequenceTable, 2663 SequenceTable = sequenceTable,
2651 Action = actionName, 2664 Action = actionName,
diff --git a/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs b/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
index 9c507dff..5ccaffdc 100644
--- a/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
+++ b/src/wix/WixToolset.Core/ExtensibilityServices/ParseHelper.cs
@@ -423,6 +423,14 @@ namespace WixToolset.Core.ExtensibilityServices
423 access = AccessModifier.Section; 423 access = AccessModifier.Section;
424 break; 424 break;
425 425
426 case "virtual":
427 access = AccessModifier.Virtual;
428 break;
429
430 case "override":
431 access = AccessModifier.Override;
432 break;
433
426 default: 434 default:
427 return null; 435 return null;
428 } 436 }
diff --git a/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs b/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs
index 49483552..38493648 100644
--- a/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs
+++ b/src/wix/WixToolset.Core/Link/AddRequiredStandardDirectories.cs
@@ -43,12 +43,17 @@ namespace WixToolset.Core.Link
43 43
44 if (String.IsNullOrEmpty(parentDirectoryId)) 44 if (String.IsNullOrEmpty(parentDirectoryId))
45 { 45 {
46 if (directory.Id.Id != "TARGETDIR") 46 parentDirectoryId = this.GetStandardDirectoryParent(directory.Id.Id, platform);
47 { 47
48 directory.ParentDirectoryRef = "TARGETDIR"; 48 directory.ParentDirectoryRef = parentDirectoryId;
49 } 49
50 //if (directory.Id.Id != "TARGETDIR")
51 //{
52 // directory.ParentDirectoryRef = "TARGETDIR";
53 //}
50 } 54 }
51 else 55
56 if (!String.IsNullOrEmpty(parentDirectoryId))
52 { 57 {
53 this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, directory.SourceLineNumbers, platform); 58 this.EnsureStandardDirectoryAdded(directoryIds, parentDirectoryId, directory.SourceLineNumbers, platform);
54 } 59 }
diff --git a/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs b/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
index 496c6178..e614d4eb 100644
--- a/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
+++ b/src/wix/WixToolset.Core/Link/FindEntrySectionAndLoadSymbolsCommand.cs
@@ -44,11 +44,19 @@ namespace WixToolset.Core.Link
44 /// </summary> 44 /// </summary>
45 public ISet<IntermediateSymbol> IdenticalDirectorySymbols { get; private set; } 45 public ISet<IntermediateSymbol> IdenticalDirectorySymbols { get; private set; }
46 46
47 /// <summary>
48 /// Gets the collection of overridden symbols that should not be included
49 /// in the final output.
50 /// </summary>
51 public ISet<IntermediateSymbol> OverriddenSymbols { get; private set; }
52
47 public void Execute() 53 public void Execute()
48 { 54 {
49 var symbolsByName = new Dictionary<string, SymbolWithSection>(); 55 var symbolsByName = new Dictionary<string, SymbolWithSection>();
50 var possibleConflicts = new HashSet<SymbolWithSection>(); 56 var possibleConflicts = new HashSet<SymbolWithSection>();
51 var identicalDirectorySymbols = new HashSet<IntermediateSymbol>(); 57 var identicalDirectorySymbols = new HashSet<IntermediateSymbol>();
58 var overrideSymbols = new List<SymbolWithSection>();
59 var overriddenSymbols = new HashSet<IntermediateSymbol>();
52 60
53 if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out SectionType expectedEntrySectionType)) 61 if (!Enum.TryParse(this.ExpectedOutputType.ToString(), out SectionType expectedEntrySectionType))
54 { 62 {
@@ -84,15 +92,34 @@ namespace WixToolset.Core.Link
84 92
85 if (!symbolsByName.TryGetValue(fullName, out var existingSymbol)) 93 if (!symbolsByName.TryGetValue(fullName, out var existingSymbol))
86 { 94 {
95 if (symbolWithSection.Access == AccessModifier.Override)
96 {
97 overrideSymbols.Add(symbolWithSection);
98 }
99
87 symbolsByName.Add(fullName, symbolWithSection); 100 symbolsByName.Add(fullName, symbolWithSection);
88 } 101 }
89 else // uh-oh, duplicate symbols. 102 else // uh-oh, duplicate symbols.
90 { 103 {
104 if (AccessModifier.Virtual == existingSymbol.Access && AccessModifier.Override == symbolWithSection.Access)
105 {
106 symbolWithSection.OverrideVirtualSymbol(existingSymbol);
107 symbolsByName[fullName] = symbolWithSection; // replace the virtual symbol with the override symbol.
108
109 overrideSymbols.Add(symbolWithSection);
110 overriddenSymbols.Add(existingSymbol.Symbol);
111 }
112 else if (AccessModifier.Override == existingSymbol.Access && AccessModifier.Virtual == symbolWithSection.Access)
113 {
114 existingSymbol.OverrideVirtualSymbol(symbolWithSection);
115
116 overriddenSymbols.Add(symbolWithSection.Symbol);
117 }
91 // If the duplicate symbols are both private directories, there is a chance that they 118 // If the duplicate symbols are both private directories, there is a chance that they
92 // point to identical symbols. Identical directory symbols should be treated as redundant. 119 // point to identical symbols. Identical directory symbols are redundant and will not cause
93 // and not cause conflicts. 120 // conflicts.
94 if (AccessModifier.Section == existingSymbol.Access && AccessModifier.Section == symbolWithSection.Access && 121 else if (AccessModifier.Section == existingSymbol.Access && AccessModifier.Section == symbolWithSection.Access &&
95 SymbolDefinitionType.Directory == existingSymbol.Symbol.Definition.Type && existingSymbol.Symbol.IsIdentical(symbolWithSection.Symbol)) 122 SymbolDefinitionType.Directory == existingSymbol.Symbol.Definition.Type && existingSymbol.Symbol.IsIdentical(symbolWithSection.Symbol))
96 { 123 {
97 // Ensure identical symbols are tracked to ensure that only one symbol will end up in linked intermediate. 124 // Ensure identical symbols are tracked to ensure that only one symbol will end up in linked intermediate.
98 identicalDirectorySymbols.Add(existingSymbol.Symbol); 125 identicalDirectorySymbols.Add(existingSymbol.Symbol);
@@ -108,9 +135,21 @@ namespace WixToolset.Core.Link
108 } 135 }
109 } 136 }
110 137
138 // Ensure override symbols actually overrode a virtual symbol.
139 foreach (var symbolWithSection in overrideSymbols)
140 {
141 if (symbolWithSection.Overrides is null)
142 {
143 var fullName = symbolWithSection.GetFullName();
144
145 this.Messaging.Write(LinkerErrors.VirtualSymbolNotFoundForOverride(symbolWithSection.Symbol.SourceLineNumbers, fullName));
146 }
147 }
148
111 this.SymbolsByName = symbolsByName; 149 this.SymbolsByName = symbolsByName;
112 this.PossibleConflicts = possibleConflicts; 150 this.PossibleConflicts = possibleConflicts;
113 this.IdenticalDirectorySymbols = identicalDirectorySymbols; 151 this.IdenticalDirectorySymbols = identicalDirectorySymbols;
152 this.OverriddenSymbols = overriddenSymbols;
114 } 153 }
115 } 154 }
116} 155}
diff --git a/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs b/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs
index d95d648f..0edbf39c 100644
--- a/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs
+++ b/src/wix/WixToolset.Core/Link/ResolveReferencesCommand.cs
@@ -133,13 +133,13 @@ namespace WixToolset.Core.Link
133 133
134 foreach (var dupe in symbolWithSection.PossiblyConflicts) 134 foreach (var dupe in symbolWithSection.PossiblyConflicts)
135 { 135 {
136 // don't count overridable WixActionSymbols 136 //// don't count overridable WixActionSymbols
137 var symbolAction = symbolWithSection.Symbol as WixActionSymbol; 137 //var symbolAction = symbolWithSection.Symbol as WixActionSymbol;
138 var dupeAction = dupe.Symbol as WixActionSymbol; 138 //var dupeAction = dupe.Symbol as WixActionSymbol;
139 if (symbolAction?.Overridable != dupeAction?.Overridable) 139 //if (symbolAction?.Overridable != dupeAction?.Overridable)
140 { 140 //{
141 continue; 141 // continue;
142 } 142 //}
143 143
144 if (this.AccessibleSymbol(referencingSection, dupe)) 144 if (this.AccessibleSymbol(referencingSection, dupe))
145 { 145 {
@@ -161,6 +161,8 @@ namespace WixToolset.Core.Link
161 switch (symbolWithSection.Access) 161 switch (symbolWithSection.Access)
162 { 162 {
163 case AccessModifier.Global: 163 case AccessModifier.Global:
164 case AccessModifier.Virtual:
165 case AccessModifier.Override:
164 return true; 166 return true;
165 case AccessModifier.Library: 167 case AccessModifier.Library:
166 return symbolWithSection.Section.CompilationId == referencingSection.CompilationId || (null != symbolWithSection.Section.LibraryId && symbolWithSection.Section.LibraryId == referencingSection.LibraryId); 168 return symbolWithSection.Section.CompilationId == referencingSection.CompilationId || (null != symbolWithSection.Section.LibraryId && symbolWithSection.Section.LibraryId == referencingSection.LibraryId);
diff --git a/src/wix/WixToolset.Core/Link/SymbolWithSection.cs b/src/wix/WixToolset.Core/Link/SymbolWithSection.cs
index dbaceb28..979aa44f 100644
--- a/src/wix/WixToolset.Core/Link/SymbolWithSection.cs
+++ b/src/wix/WixToolset.Core/Link/SymbolWithSection.cs
@@ -49,6 +49,11 @@ namespace WixToolset.Core.Link
49 public IEnumerable<SymbolWithSection> PossiblyConflicts => this.possibleConflicts ?? Enumerable.Empty<SymbolWithSection>(); 49 public IEnumerable<SymbolWithSection> PossiblyConflicts => this.possibleConflicts ?? Enumerable.Empty<SymbolWithSection>();
50 50
51 /// <summary> 51 /// <summary>
52 /// Gets the virtual symbol that is overridden by this symbol.
53 /// </summary>
54 public SymbolWithSection Overrides { get; private set; }
55
56 /// <summary>
52 /// Adds a duplicate symbol with sections that is a possible conflict. 57 /// Adds a duplicate symbol with sections that is a possible conflict.
53 /// </summary> 58 /// </summary>
54 /// <param name="symbolWithSection">Symbol with section that is a possible conflict of this symbol.</param> 59 /// <param name="symbolWithSection">Symbol with section that is a possible conflict of this symbol.</param>
@@ -63,6 +68,20 @@ namespace WixToolset.Core.Link
63 } 68 }
64 69
65 /// <summary> 70 /// <summary>
71 /// Override a virtual symbol.
72 /// </summary>
73 /// <param name="virtualSymbolWithSection">Virtual symbol with section that is being overridden.</param>
74 public void OverrideVirtualSymbol(SymbolWithSection virtualSymbolWithSection)
75 {
76 if (virtualSymbolWithSection.Access != AccessModifier.Virtual)
77 {
78 throw new InvalidOperationException("Cannot override non-virtual symbols");
79 }
80
81 this.Overrides = virtualSymbolWithSection;
82 }
83
84 /// <summary>
66 /// Gets the full name of the symbol. 85 /// Gets the full name of the symbol.
67 /// </summary> 86 /// </summary>
68 public string GetFullName() 87 public string GetFullName()
diff --git a/src/wix/WixToolset.Core/Linker.cs b/src/wix/WixToolset.Core/Linker.cs
index 59728741..85333da4 100644
--- a/src/wix/WixToolset.Core/Linker.cs
+++ b/src/wix/WixToolset.Core/Linker.cs
@@ -98,6 +98,9 @@ namespace WixToolset.Core
98 } 98 }
99 } 99 }
100 100
101 // TODO: Replace this with "std.wixlib"
102 this.LoadStandardSymbols(sections);
103
101 var multipleFeatureComponents = new Hashtable(); 104 var multipleFeatureComponents = new Hashtable();
102 105
103 var wixVariables = new Dictionary<string, WixVariableSymbol>(); 106 var wixVariables = new Dictionary<string, WixVariableSymbol>();
@@ -119,8 +122,8 @@ namespace WixToolset.Core
119 } 122 }
120 } 123 }
121 124
122 // Add the missing standard action and directory symbols. 125 ////// Add the missing standard action and directory symbols.
123 this.LoadStandardSymbols(find.SymbolsByName); 126 ////this.LoadStandardSymbols(find.SymbolsByName);
124 127
125 // Resolve the symbol references to find the set of sections we care about for linking. 128 // Resolve the symbol references to find the set of sections we care about for linking.
126 // Of course, we start with the entry section (that's how it got its name after all). 129 // Of course, we start with the entry section (that's how it got its name after all).
@@ -200,6 +203,11 @@ namespace WixToolset.Core
200 continue; 203 continue;
201 } 204 }
202 } 205 }
206 else if (find.OverriddenSymbols.Contains(symbol))
207 {
208 // Skip the symbols that were overridden.
209 continue;
210 }
203 211
204 var copySymbol = true; // by default, copy symbols. 212 var copySymbol = true; // by default, copy symbols.
205 213
@@ -360,33 +368,62 @@ namespace WixToolset.Core
360 /// Load the standard action and directory symbols. 368 /// Load the standard action and directory symbols.
361 /// </summary> 369 /// </summary>
362 /// <param name="symbolsByName">Collection of symbols.</param> 370 /// <param name="symbolsByName">Collection of symbols.</param>
363 private void LoadStandardSymbols(IDictionary<string, SymbolWithSection> symbolsByName) 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)
364 { 399 {
365 foreach (var actionSymbol in WindowsInstallerStandard.StandardActions()) 400 foreach (var actionSymbol in WindowsInstallerStandard.StandardActions())
366 { 401 {
367 var symbolWithSection = new SymbolWithSection(null, actionSymbol); 402 var section = new IntermediateSection(actionSymbol.Id.Id, SectionType.Fragment);
368 var fullName = symbolWithSection.GetFullName(); 403 section.AddSymbol(new WixActionSymbol(null, new Identifier(actionSymbol.Id.Access, actionSymbol.Id.Id))
369
370 // If the action's symbol has not already been defined (i.e. overriden by the user), add it now.
371 if (!symbolsByName.ContainsKey(fullName))
372 { 404 {
373 symbolsByName.Add(fullName, symbolWithSection); 405 Action = actionSymbol.Action,
374 } 406 SequenceTable = actionSymbol.SequenceTable,
407 Sequence = actionSymbol.Sequence,
408 Condition = actionSymbol.Condition,
409 });
410
411 sections.Add(section);
375 } 412 }
376 413
377 foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories()) 414 foreach (var directorySymbol in WindowsInstallerStandard.StandardDirectories())
378 { 415 {
379 var symbolWithSection = new SymbolWithSection(null, directorySymbol); 416 var section = new IntermediateSection(directorySymbol.Id.Id, SectionType.Fragment);
380 var fullName = symbolWithSection.GetFullName(); 417 section.AddSymbol(new DirectorySymbol(null, new Identifier(directorySymbol.Id.Access, directorySymbol.Id.Id))
381
382 // If the directory's symbol has not already been defined (i.e. overriden by the user), add it now.
383 if (!symbolsByName.ContainsKey(fullName))
384 { 418 {
385 symbolsByName.Add(fullName, symbolWithSection); 419 Name = directorySymbol.Name
386 } 420 });
421
422 sections.Add(section);
387 } 423 }
388 } 424 }
389 425
426
390 /// <summary> 427 /// <summary>
391 /// Process the complex references. 428 /// Process the complex references.
392 /// </summary> 429 /// </summary>
diff --git a/src/wix/WixToolset.Core/LinkerErrors.cs b/src/wix/WixToolset.Core/LinkerErrors.cs
index cb13a344..78cd76f0 100644
--- a/src/wix/WixToolset.Core/LinkerErrors.cs
+++ b/src/wix/WixToolset.Core/LinkerErrors.cs
@@ -46,6 +46,11 @@ namespace WixToolset.Core
46 return Message(sourceLineNumbers, Ids.UncompressedPayloadInContainer, "The payload '{0}' is uncompressed and cannot be added to container '{1}'. Remove its Compressed attribute and provide a @SourceFile value to allow it to be added to a container.", payloadId, containerId); 46 return Message(sourceLineNumbers, Ids.UncompressedPayloadInContainer, "The payload '{0}' is uncompressed and cannot be added to container '{1}'. Remove its Compressed attribute and provide a @SourceFile value to allow it to be added to a container.", payloadId, containerId);
47 } 47 }
48 48
49 public static Message VirtualSymbolNotFoundForOverride(SourceLineNumber sourceLineNumbers, string id)
50 {
51 return Message(sourceLineNumbers, Ids.VirtualSymbolNotFoundForOverride, "Did not find virtual symbol for override symbol '{0}'",id);
52 }
53
49 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args) 54 private static Message Message(SourceLineNumber sourceLineNumber, Ids id, string format, params object[] args)
50 { 55 {
51 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args); 56 return new Message(sourceLineNumber, MessageLevel.Error, (int)id, format, args);
@@ -61,6 +66,7 @@ namespace WixToolset.Core
61 UncompressedPayloadInContainer = 7005, 66 UncompressedPayloadInContainer = 7005,
62 BAContainerCannotContainRemotePayload = 7006, 67 BAContainerCannotContainRemotePayload = 7006,
63 DuplicateBindPathVariableOnCommandLine = 7007, 68 DuplicateBindPathVariableOnCommandLine = 7007,
69 VirtualSymbolNotFoundForOverride = 7008,
64 } // last available is 7099. 7100 is WindowsInstallerBackendWarnings. 70 } // last available is 7099. 7100 is WindowsInstallerBackendWarnings.
65 } 71 }
66} 72}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs
new file mode 100644
index 00000000..d0e31760
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/AccessModifierFixture.cs
@@ -0,0 +1,159 @@
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 WixToolsetTest.CoreIntegration
4{
5 using System.Collections.Generic;
6 using System.IO;
7 using System.Linq;
8 using WixInternal.Core.TestPackage;
9 using WixInternal.TestSupport;
10 using WixToolset.Data;
11 using WixToolset.Data.Symbols;
12 using Xunit;
13
14 public class AccessModifierFixture
15 {
16 [Fact]
17 public void CanCompileVirtualSymbol()
18 {
19 var dirSymbols = BuildToGetDirectorySymbols("TestData", "AccessModifier", "HasVirtualSymbol.wxs");
20 WixAssert.CompareLineByLine(new[]
21 {
22 "virtual:ProgramFilesFolder:TARGETDIR:PFiles",
23 "virtual:TARGETDIR::SourceDir",
24 "virtual:TestFolder:ProgramFilesFolder:Test Folder",
25 }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Access.AsString() + ":" + d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray());
26 }
27
28 [Fact]
29 public void CanCompileOverrideVirtualSymbol()
30 {
31 var dirSymbols = BuildToGetDirectorySymbols("TestData", "AccessModifier", "OverrideVirtualSymbol.wxs");
32 WixAssert.CompareLineByLine(new[]
33 {
34 "virtual:ProgramFilesFolder:TARGETDIR:PFiles",
35 "virtual:TARGETDIR::SourceDir",
36 "override:TestFolder:ProgramFilesFolder:Override Test Folder",
37 }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Access.AsString() + ":" + d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray());
38 }
39
40 [Fact]
41 public void CanCompileVirtualSymbolOverridden()
42 {
43 var dirSymbols = BuildToGetDirectorySymbols("TestData", "AccessModifier", "VirtualSymbolOverridden.wxs");
44 WixAssert.CompareLineByLine(new[]
45 {
46 "virtual:ProgramFilesFolder:TARGETDIR:PFiles",
47 "virtual:TARGETDIR::SourceDir",
48 "override:TestFolder:ProgramFilesFolder:Test Folder Overrode Virtual",
49 }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Access.AsString() + ":" + d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray());
50 }
51
52 [Fact]
53 public void CanCompileVirtualSymbolWithFragments()
54 {
55 var dirSymbols = BuildToGetDirectorySymbols("TestData", "AccessModifier", "OverrideVirtualSymbolWithFragments.wxs");
56 WixAssert.CompareLineByLine(new[]
57 {
58 "global:AlsoIncluded:ProgramFilesFolder:Also Included",
59 "virtual:ProgramFilesFolder:TARGETDIR:PFiles",
60 "virtual:TARGETDIR::SourceDir",
61 "override:TestFolder:ProgramFilesFolder:Override Test Folder Includes Another",
62 }, dirSymbols.OrderBy(d => d.Id.Id).Select(d => d.Id.Access.AsString() + ":" + d.Id.Id + ":" + d.ParentDirectoryRef + ":" + d.Name).ToArray());
63 }
64
65 [Fact]
66 public void CannotCompileInvalidCrossFragmentReference()
67 {
68 var errors = BuildForFailure("TestData", "AccessModifier", "InvalidCrossFragmentReference.wxs");
69 WixAssert.CompareLineByLine(new[]
70 {
71 "ln 4: The identifier 'Directory:Foo' is inaccessible due to its protection level.",
72 }, errors);
73 }
74
75 [Fact]
76 public void CannotCompileDuplicateCrossFragmentReference()
77 {
78 var errors = BuildForFailure("TestData", "AccessModifier", "DuplicateCrossFragmentReference.wxs");
79 WixAssert.CompareLineByLine(new[]
80 {
81 @"ln 8: Duplicate symbol 'Directory:TestFolder' referenced by <sourceFolder>\DuplicateCrossFragmentReference.wxs(4). This typically means that an Id is duplicated. Ensure all your identifiers of a given type (Directory, File, etc.) are unique or use an access modifier to scope the identfier.",
82 "ln 12: Location of symbol related to previous error."
83 }, errors);
84 }
85
86 [Fact]
87 public void CannotCompileOverrideWithoutVirtualSymbol()
88 {
89 var errors = BuildForFailure("TestData", "AccessModifier", "OverrideWithoutVirtualSymbol.wxs");
90 WixAssert.CompareLineByLine(new[]
91 {
92 "ln 5: Did not find virtual symbol for override symbol 'Directory:TestFolder'",
93 }, errors);
94 }
95
96 [Fact]
97 public void CannotCompileDuplicatedOverride()
98 {
99 var errors = BuildForFailure("TestData", "AccessModifier", "DuplicatedOverrideVirtualSymbol.wxs");
100 WixAssert.CompareLineByLine(new[]
101 {
102 "ln 14: Duplicate symbol 'Directory:TestFolder' found. This typically means that an Id is duplicated. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.",
103 "ln 6: Location of symbol related to previous error."
104 }, errors);
105 }
106
107 private static string[] BuildForFailure(params string[] testSourceFilePaths)
108 {
109 var sourceFile = TestData.Get(testSourceFilePaths);
110 var sourceFolder = Path.GetDirectoryName(sourceFile);
111
112 using (var fs = new DisposableFileSystem())
113 {
114 var baseFolder = fs.GetFolder();
115 var intermediateFolder = Path.Combine(baseFolder, "obj");
116 var msiPath = Path.Combine(baseFolder, "bin", "test.msi");
117
118 var result = WixRunner.Execute(new[]
119 {
120 "build",
121 sourceFile,
122 "-intermediateFolder", intermediateFolder,
123 "-o", msiPath
124 });
125
126 return result.Messages.Where(m => m.Level == MessageLevel.Error)
127 .Select(m => $"ln {m.SourceLineNumbers.LineNumber}: {m}".Replace(sourceFolder, "<sourceFolder>").Replace(baseFolder, "<baseFolder>"))
128 .ToArray();
129 }
130 }
131
132 private static List<DirectorySymbol> BuildToGetDirectorySymbols(params string[] testSourceFilePaths)
133 {
134 var sourceFile = TestData.Get(testSourceFilePaths);
135
136 using (var fs = new DisposableFileSystem())
137 {
138 var baseFolder = fs.GetFolder();
139 var intermediateFolder = Path.Combine(baseFolder, "obj");
140 var msiPath = Path.Combine(baseFolder, "bin", "test.msi");
141
142 var result = WixRunner.Execute(new[]
143 {
144 "build",
145 sourceFile,
146 "-intermediateFolder", intermediateFolder,
147 "-o", msiPath
148 });
149
150 result.AssertSuccess();
151
152 var intermediate = Intermediate.Load(Path.Combine(baseFolder, "bin", "test.wixpdb"));
153 var section = intermediate.Sections.Single();
154
155 return section.Symbols.OfType<WixToolset.Data.Symbols.DirectorySymbol>().ToList();
156 }
157 }
158 }
159}
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/RollbackBoundaryFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/RollbackBoundaryFixture.cs
index f8d46c24..8d8ac801 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/RollbackBoundaryFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/RollbackBoundaryFixture.cs
@@ -66,7 +66,7 @@ namespace WixToolsetTest.CoreIntegration
66 66
67 WixAssert.CompareLineByLine(new[] 67 WixAssert.CompareLineByLine(new[]
68 { 68 {
69 "Duplicate symbol 'WixChainItem:collision' found. This typically means that an Id is duplicated. Access modifiers (internal, protected, private) cannot prevent these conflicts. Ensure all your identifiers of a given type (File, Component, Feature) are unique.", 69 "Duplicate symbol 'WixChainItem:collision' found. This typically means that an Id is duplicated. Access modifiers (global, library, file, section) cannot prevent these conflicts. Ensure all your identifiers of a given type (Directory, File, etc.) are unique.",
70 "Location of symbol related to previous error.", 70 "Location of symbol related to previous error.",
71 }, result.Messages.Select(m => m.ToString()).ToArray()); 71 }, result.Messages.Select(m => m.ToString()).ToArray());
72 72
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs
new file mode 100644
index 00000000..f987fe13
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicateCrossFragmentReference.wxs
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Duplicate Cross Fragment Reference" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <DirectoryRef Id="TestFolder" />
5 </Package>
6
7 <Fragment>
8 <Directory Id="TestFolder" Name="Dupe 1" />
9 </Fragment>
10
11 <Fragment>
12 <Directory Id="TestFolder" Name="Dupe 2" />
13 </Fragment>
14</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicatedOverrideVirtualSymbol.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicatedOverrideVirtualSymbol.wxs
new file mode 100644
index 00000000..334b01ca
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/DuplicatedOverrideVirtualSymbol.wxs
@@ -0,0 +1,17 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Duplicated Override Virtual Symbol" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4
5 <StandardDirectory Id="ProgramFilesFolder">
6 <Directory Id="override TestFolder" Name="Override Test Folder" />
7 </StandardDirectory>
8
9 <StandardDirectory Id="ProgramFilesFolder">
10 <Directory Id="virtual TestFolder" Name="Test Folder" />
11 </StandardDirectory>
12
13 <StandardDirectory Id="ProgramFilesFolder">
14 <Directory Id="override TestFolder" Name="Collision Override Test Folder" />
15 </StandardDirectory>
16 </Package>
17</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/HasVirtualSymbol.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/HasVirtualSymbol.wxs
new file mode 100644
index 00000000..5cdedf04
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/HasVirtualSymbol.wxs
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Has Virtual Symbol" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <StandardDirectory Id="ProgramFilesFolder">
5 <Directory Id="virtual TestFolder" Name="Test Folder" />
6 </StandardDirectory>
7 </Package>
8</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/InvalidCrossFragmentReference.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/InvalidCrossFragmentReference.wxs
new file mode 100644
index 00000000..5ba21fb2
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/InvalidCrossFragmentReference.wxs
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Invalid Cross Fragment Reference" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <DirectoryRef Id="Foo" />
5 </Package>
6
7 <Fragment>
8 <Directory Id="fragment Foo" Name="Foo" />
9 </Fragment>
10</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbol.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbol.wxs
new file mode 100644
index 00000000..4f4cfc16
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbol.wxs
@@ -0,0 +1,13 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Override Virtual Symbol" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4
5 <StandardDirectory Id="ProgramFilesFolder">
6 <Directory Id="override TestFolder" Name="Override Test Folder" />
7 </StandardDirectory>
8
9 <StandardDirectory Id="ProgramFilesFolder">
10 <Directory Id="virtual TestFolder" Name="Test Folder" />
11 </StandardDirectory>
12 </Package>
13</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs
new file mode 100644
index 00000000..13f03040
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideVirtualSymbolWithFragments.wxs
@@ -0,0 +1,20 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Override Virtual Symbol With Fragments" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <DirectoryRef Id="TestFolder" />
5 </Package>
6
7 <Fragment>
8 <StandardDirectory Id="ProgramFilesFolder">
9 <Directory Id="override TestFolder" Name="Override Test Folder Includes Another" />
10 <Directory Id="AlsoIncluded" Name="Also Included" />
11 </StandardDirectory>
12 </Fragment>
13
14 <Fragment>
15 <StandardDirectory Id="ProgramFilesFolder">
16 <Directory Id="virtual TestFolder" Name="Test Folder" />
17 <Directory Id="NotIncluded" Name="Not Included" />
18 </StandardDirectory>
19 </Fragment>
20</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideWithoutVirtualSymbol.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideWithoutVirtualSymbol.wxs
new file mode 100644
index 00000000..1cb749a7
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/OverrideWithoutVirtualSymbol.wxs
@@ -0,0 +1,8 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Override Without Virtual Symbol" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <StandardDirectory Id="ProgramFilesFolder">
5 <Directory Id="override TestFolder" Name="Override Without Virtual Test Folder" />
6 </StandardDirectory>
7 </Package>
8</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolOverridden.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolOverridden.wxs
new file mode 100644
index 00000000..98e96766
--- /dev/null
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/AccessModifier/VirtualSymbolOverridden.wxs
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8"?>
2<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3 <Package Name="Virtual Symbol Overridden" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
4 <StandardDirectory Id="ProgramFilesFolder">
5 <Directory Id="virtual TestFolder" Name="Test Folder" />
6 </StandardDirectory>
7
8 <StandardDirectory Id="ProgramFilesFolder">
9 <Directory Id="override TestFolder" Name="Test Folder Overrode Virtual" />
10 </StandardDirectory>
11 </Package>
12</Wix>
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/OverridableActions/Package.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/OverridableActions/Package.wxs
index 0bf0e963..ea10d012 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/OverridableActions/Package.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/OverridableActions/Package.wxs
@@ -36,7 +36,7 @@
36 <ComponentGroup Id="Foo2" /> 36 <ComponentGroup Id="Foo2" />
37 37
38 <InstallExecuteSequence> 38 <InstallExecuteSequence>
39 <Custom Action="SetBar" Before="AppSearch" /> 39 <Custom Action="override SetBar" Before="AppSearch" />
40 </InstallExecuteSequence> 40 </InstallExecuteSequence>
41 </Fragment> 41 </Fragment>
42 42
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/UI/DialogsInInstallUISequence.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/UI/DialogsInInstallUISequence.wxs
index ec6e62df..6b84e7f5 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/UI/DialogsInInstallUISequence.wxs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/UI/DialogsInInstallUISequence.wxs
@@ -1,4 +1,4 @@
1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> 1<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2 <Fragment> 2 <Fragment>
3 <UI Id="CustomDialog"> 3 <UI Id="CustomDialog">
4 <Dialog Id="FirstDialog" Width="100" Height="100"> 4 <Dialog Id="FirstDialog" Width="100" Height="100">
@@ -24,7 +24,7 @@
24 24
25 <InstallUISequence> 25 <InstallUISequence>
26 <Show Dialog="FirstDialog" Before="SecondDialog" Condition="Installed AND PATCH" /> 26 <Show Dialog="FirstDialog" Before="SecondDialog" Condition="Installed AND PATCH" />
27 <Show Dialog="SecondDialog" Before="ExecuteAction" Condition="NOT Installed" /> 27 <Show Dialog="override SecondDialog" Before="ExecuteAction" Condition="NOT Installed" />
28 </InstallUISequence> 28 </InstallUISequence>
29 </UI> 29 </UI>
30 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 30 <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/UIFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/UIFixture.cs
index 8cd06331..c21ef9cb 100644
--- a/src/wix/test/WixToolsetTest.CoreIntegration/UIFixture.cs
+++ b/src/wix/test/WixToolsetTest.CoreIntegration/UIFixture.cs
@@ -2,15 +2,11 @@
2 2
3namespace WixToolsetTest.CoreIntegration 3namespace WixToolsetTest.CoreIntegration
4{ 4{
5 using System;
6 using System.IO; 5 using System.IO;
7 using System.Linq; 6 using System.Linq;
8 using Example.Extension;
9 using WixInternal.TestSupport;
10 using WixInternal.Core.TestPackage; 7 using WixInternal.Core.TestPackage;
8 using WixInternal.TestSupport;
11 using WixToolset.Data; 9 using WixToolset.Data;
12 using WixToolset.Data.Symbols;
13 using WixToolset.Data.WindowsInstaller;
14 using Xunit; 10 using Xunit;
15 11
16 public class UIFixture 12 public class UIFixture
@@ -94,7 +90,7 @@ namespace WixToolsetTest.CoreIntegration
94 21, 90 21,
95 52 91 52
96 }, errors.Select(e => e.Id).ToArray()); 92 }, errors.Select(e => e.Id).ToArray());
97 } 93 }
98 } 94 }
99 } 95 }
100} 96}