System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 27cc6a3b2d01f9063f04f03e7b79c7ebb43bbd93:


0000: 2f 2a 0d 0a 20 2a 20 49 6e 73 74 61 6c 6c 65 72  /*.. * Installer
0010: 2e 63 73 20 2d 2d 0d 0a 20 2a 0d 0a 20 2a 20 57  .cs --.. *.. * W
0020: 72 69 74 74 65 6e 20 62 79 20 4a 6f 65 20 4d 69  ritten by Joe Mi
0030: 73 74 61 63 68 6b 69 6e 2e 0d 0a 20 2a 20 52 65  stachkin... * Re
0040: 6c 65 61 73 65 64 20 74 6f 20 74 68 65 20 70 75  leased to the pu
0050: 62 6c 69 63 20 64 6f 6d 61 69 6e 2c 20 75 73 65  blic domain, use
0060: 20 61 74 20 79 6f 75 72 20 6f 77 6e 20 72 69 73   at your own ris
0070: 6b 21 0d 0a 20 2a 2f 0d 0a 0d 0a 75 73 69 6e 67  k!.. */....using
0080: 20 53 79 73 74 65 6d 2e 43 6f 6c 6c 65 63 74 69   System.Collecti
0090: 6f 6e 73 2e 47 65 6e 65 72 69 63 3b 0d 0a 75 73  ons.Generic;..us
00a0: 69 6e 67 20 53 79 73 74 65 6d 2e 44 69 61 67 6e  ing System.Diagn
00b0: 6f 73 74 69 63 73 3b 0d 0a 75 73 69 6e 67 20 53  ostics;..using S
00c0: 79 73 74 65 6d 2e 45 6e 74 65 72 70 72 69 73 65  ystem.Enterprise
00d0: 53 65 72 76 69 63 65 73 2e 49 6e 74 65 72 6e 61  Services.Interna
00e0: 6c 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74 65 6d  l;..using System
00f0: 2e 49 4f 3b 0d 0a 75 73 69 6e 67 20 53 79 73 74  .IO;..using Syst
0100: 65 6d 2e 52 65 66 6c 65 63 74 69 6f 6e 3b 0d 0a  em.Reflection;..
0110: 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 52 75 6e  using System.Run
0120: 74 69 6d 65 2e 43 6f 6d 70 69 6c 65 72 53 65 72  time.CompilerSer
0130: 76 69 63 65 73 3b 0d 0a 75 73 69 6e 67 20 53 79  vices;..using Sy
0140: 73 74 65 6d 2e 54 68 72 65 61 64 69 6e 67 3b 0d  stem.Threading;.
0150: 0a 75 73 69 6e 67 20 53 79 73 74 65 6d 2e 57 69  .using System.Wi
0160: 6e 64 6f 77 73 2e 46 6f 72 6d 73 3b 0d 0a 75 73  ndows.Forms;..us
0170: 69 6e 67 20 53 79 73 74 65 6d 2e 58 6d 6c 3b 0d  ing System.Xml;.
0180: 0a 75 73 69 6e 67 20 4d 69 63 72 6f 73 6f 66 74  .using Microsoft
0190: 2e 57 69 6e 33 32 3b 0d 0a 0d 0a 6e 61 6d 65 73  .Win32;....names
01a0: 70 61 63 65 20 53 79 73 74 65 6d 2e 44 61 74 61  pace System.Data
01b0: 2e 53 51 4c 69 74 65 0d 0a 7b 0d 0a 20 20 20 20  .SQLite..{..    
01c0: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 44  #region Public D
01d0: 65 6c 65 67 61 74 65 73 0d 0a 20 20 20 20 69 6e  elegates..    in
01e0: 74 65 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20  ternal delegate 
01f0: 76 6f 69 64 20 54 72 61 63 65 43 61 6c 6c 62 61  void TraceCallba
0200: 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 73 74 72  ck(..        str
0210: 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20  ing message,..  
0220: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
0230: 65 67 6f 72 79 0d 0a 20 20 20 20 29 3b 0d 0a 0d  egory..    );...
0240: 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .    ///////////
0250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0290: 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e 61 6c  ....    internal
02a0: 20 64 65 6c 65 67 61 74 65 20 62 6f 6f 6c 20 46   delegate bool F
02b0: 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 43 61  rameworkConfigCa
02c0: 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20  llback(..       
02d0: 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65   string fileName
02e0: 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e  ,..        strin
02f0: 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20  g invariant,..  
0300: 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d        string nam
0310: 65 2c 0d 0a 20 20 20 20 20 20 20 20 73 74 72 69  e,..        stri
0320: 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d  ng description,.
0330: 0a 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20  .        string 
0340: 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  typeName,..     
0350: 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
0360: 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20  assemblyName,.. 
0370: 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c         object cl
0380: 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20  ientData,..     
0390: 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d     bool throwOnM
03a0: 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  issing,..       
03b0: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
03c0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
03d0: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
03e0: 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d 0a 20  f bool saved,.. 
03f0: 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
0400: 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 29 3b 0d  g error..    );.
0410: 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ...    /////////
0420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0460: 2f 2f 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72 6e  //....    intern
0470: 61 6c 20 64 65 6c 65 67 61 74 65 20 62 6f 6f 6c  al delegate bool
0480: 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69 73 74   FrameworkRegist
0490: 72 79 43 61 6c 6c 62 61 63 6b 28 0d 0a 20 20 20  ryCallback(..   
04a0: 20 20 20 20 20 49 6e 73 74 61 6c 6c 65 72 2e 4d       Installer.M
04b0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72  ockRegistryKey r
04c0: 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ootKey,..       
04d0: 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72   string framewor
04e0: 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  kName,..        
04f0: 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72  Version framewor
0500: 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20  kVersion,..     
0510: 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f     string platfo
0520: 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  rmName,..       
0530: 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74 44 61   object clientDa
0540: 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 62 6f 6f  ta,..        boo
0550: 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67  l throwOnMissing
0560: 2c 0d 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20  ,..        bool 
0570: 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
0580: 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
0590: 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
05a0: 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 29 3b  ng error..    );
05b0: 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f  ....    ////////
05c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0600: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 69 6e 74 65 72  ///....    inter
0610: 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 62 6f 6f  nal delegate boo
0620: 6c 20 56 69 73 75 61 6c 53 74 75 64 69 6f 52 65  l VisualStudioRe
0630: 67 69 73 74 72 79 43 61 6c 6c 62 61 63 6b 28 0d  gistryCallback(.
0640: 0a 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c  .        Install
0650: 65 72 2e 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  er.MockRegistryK
0660: 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
0670: 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56       Version vsV
0680: 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
0690: 20 49 6e 73 74 61 6c 6c 65 72 2e 50 61 63 6b 61   Installer.Packa
06a0: 67 65 20 70 61 63 6b 61 67 65 2c 0d 0a 20 20 20  ge package,..   
06b0: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
06c0: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
06d0: 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d 69 73   bool throwOnMis
06e0: 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 62  sing,..        b
06f0: 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
0700: 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
0710: 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65 66 20  e,..        ref 
0720: 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
0730: 20 20 29 3b 0d 0a 20 20 20 20 23 65 6e 64 72 65    );..    #endre
0740: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f  gion....    ////
0750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0790: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 23  ///////....    #
07a0: 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 45 6e  region Public En
07b0: 75 6d 65 72 61 74 69 6f 6e 73 0d 0a 20 20 20 20  umerations..    
07c0: 5b 46 6c 61 67 73 28 29 5d 0d 0a 20 20 20 20 70  [Flags()]..    p
07d0: 75 62 6c 69 63 20 65 6e 75 6d 20 49 6e 73 74 61  ublic enum Insta
07e0: 6c 6c 46 6c 61 67 73 0d 0a 20 20 20 20 7b 0d 0a  llFlags..    {..
07f0: 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d 20 30          None = 0
0800: 78 30 2c 0d 0a 20 20 20 20 20 20 20 20 47 41 43  x0,..        GAC
0810: 20 3d 20 30 78 31 2c 0d 0a 20 20 20 20 20 20 20   = 0x1,..       
0820: 20 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73   AssemblyFolders
0830: 20 3d 20 30 78 32 2c 0d 0a 20 20 20 20 20 20 20   = 0x2,..       
0840: 20 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f   DbProviderFacto
0850: 72 79 20 3d 20 30 78 34 2c 0d 0a 20 20 20 20 20  ry = 0x4,..     
0860: 20 20 20 56 73 50 61 63 6b 61 67 65 20 3d 20 30     VsPackage = 0
0870: 78 38 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 44  x8,..        VsD
0880: 61 74 61 53 6f 75 72 63 65 20 3d 20 30 78 31 30  ataSource = 0x10
0890: 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 44 61 74  ,..        VsDat
08a0: 61 50 72 6f 76 69 64 65 72 20 3d 20 30 78 32 30  aProvider = 0x20
08b0: 2c 0d 0a 20 20 20 20 20 20 20 20 46 72 61 6d 65  ,..        Frame
08c0: 77 6f 72 6b 20 3d 20 47 41 43 20 7c 20 41 73 73  work = GAC | Ass
08d0: 65 6d 62 6c 79 46 6f 6c 64 65 72 73 20 7c 20 44  emblyFolders | D
08e0: 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79  bProviderFactory
08f0: 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 20 3d 20  ,..        Vs = 
0900: 56 73 50 61 63 6b 61 67 65 20 7c 20 56 73 44 61  VsPackage | VsDa
0910: 74 61 53 6f 75 72 63 65 20 7c 20 56 73 44 61 74  taSource | VsDat
0920: 61 50 72 6f 76 69 64 65 72 2c 0d 0a 20 20 20 20  aProvider,..    
0930: 20 20 20 20 41 6c 6c 20 3d 20 46 72 61 6d 65 77      All = Framew
0940: 6f 72 6b 20 7c 20 56 73 2c 0d 0a 20 20 20 20 20  ork | Vs,..     
0950: 20 20 20 41 6c 6c 45 78 63 65 70 74 47 41 43 20     AllExceptGAC 
0960: 3d 20 41 6c 6c 20 26 20 7e 47 41 43 2c 0d 0a 20  = All & ~GAC,.. 
0970: 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 3d         Default =
0980: 20 41 6c 6c 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20   All..    }.... 
0990: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
09a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
09b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
09c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
09d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
09e0: 0d 0a 20 20 20 20 5b 46 6c 61 67 73 28 29 5d 0d  ..    [Flags()].
09f0: 0a 20 20 20 20 70 75 62 6c 69 63 20 65 6e 75 6d  .    public enum
0a00: 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 0d 0a   TracePriority..
0a10: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 4e      {..        N
0a20: 6f 6e 65 20 3d 20 30 78 30 2c 0d 0a 20 20 20 20  one = 0x0,..    
0a30: 20 20 20 20 4c 6f 77 65 73 74 20 3d 20 30 78 31      Lowest = 0x1
0a40: 2c 0d 0a 20 20 20 20 20 20 20 20 4c 6f 77 65 72  ,..        Lower
0a50: 20 3d 20 30 78 32 2c 0d 0a 20 20 20 20 20 20 20   = 0x2,..       
0a60: 20 4c 6f 77 20 3d 20 30 78 34 2c 0d 0a 20 20 20   Low = 0x4,..   
0a70: 20 20 20 20 20 4d 65 64 69 75 6d 20 3d 20 30 78       Medium = 0x
0a80: 38 2c 0d 0a 20 20 20 20 20 20 20 20 48 69 67 68  8,..        High
0a90: 20 3d 20 30 78 31 30 2c 0d 0a 20 20 20 20 20 20   = 0x10,..      
0aa0: 20 20 48 69 67 68 65 72 20 3d 20 30 78 32 30 2c    Higher = 0x20,
0ab0: 0d 0a 20 20 20 20 20 20 20 20 48 69 67 68 65 73  ..        Highes
0ac0: 74 20 3d 20 30 78 34 30 2c 0d 0a 20 20 20 20 20  t = 0x40,..     
0ad0: 20 20 20 44 65 66 61 75 6c 74 20 3d 20 4d 65 64     Default = Med
0ae0: 69 75 6d 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20  ium..    }..    
0af0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
0b00: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
0b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
0b50: 0a 20 20 20 20 23 72 65 67 69 6f 6e 20 49 6e 73  .    #region Ins
0b60: 74 61 6c 6c 65 72 20 43 6c 61 73 73 0d 0a 20 20  taller Class..  
0b70: 20 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69    internal stati
0b80: 63 20 63 6c 61 73 73 20 49 6e 73 74 61 6c 6c 65  c class Installe
0b90: 72 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20  r..    {..      
0ba0: 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74    #region Privat
0bb0: 65 20 48 65 6c 70 65 72 20 43 6c 61 73 73 65 73  e Helper Classes
0bc0: 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  ..        #regio
0bd0: 6e 20 41 6e 79 50 61 69 72 20 43 6c 61 73 73 0d  n AnyPair Class.
0be0: 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
0bf0: 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 41 6e   sealed class An
0c00: 79 50 61 69 72 3c 54 31 2c 20 54 32 3e 0d 0a 20  yPair<T1, T2>.. 
0c10: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0c20: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75        #region Pu
0c30: 62 6c 69 63 20 43 6f 6e 73 74 72 75 63 74 6f 72  blic Constructor
0c40: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  s..            /
0c50: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  /..            /
0c60: 2f 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20  / WARNING: This 
0c70: 63 6f 6e 73 74 72 75 63 74 6f 72 20 70 72 6f 64  constructor prod
0c80: 75 63 65 73 20 61 6e 20 69 6d 6d 75 74 61 62 6c  uces an immutabl
0c90: 65 20 22 65 6d 70 74 79 22 20 70 61 69 72 0d 0a  e "empty" pair..
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
0cb0: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 2e 0d          object..
0cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
0cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
0ce0: 6c 69 63 20 41 6e 79 50 61 69 72 28 29 0d 0a 20  lic AnyPair().. 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a                 :
0d00: 20 62 61 73 65 28 29 0d 0a 20 20 20 20 20 20 20   base()..       
0d10: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
0d20: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
0d30: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
0d40: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
0d50: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
0d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d90: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
0da0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 41          public A
0db0: 6e 79 50 61 69 72 28 54 31 20 78 29 0d 0a 20 20  nyPair(T1 x)..  
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20                : 
0dd0: 74 68 69 73 28 29 0d 0a 20 20 20 20 20 20 20 20  this()..        
0de0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
0df0: 20 20 20 20 20 20 20 74 68 69 73 2e 78 20 3d 20         this.x = 
0e00: 78 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  x;..            
0e10: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
0e20: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e60: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
0e70: 20 20 20 20 70 75 62 6c 69 63 20 41 6e 79 50 61      public AnyPa
0e80: 69 72 28 54 31 20 78 2c 20 54 32 20 79 29 0d 0a  ir(T1 x, T2 y)..
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 3a 20 74 68 69 73 28 78 29 0d 0a 20 20 20 20 20  : this(x)..     
0eb0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
0ec0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 79            this.y
0ed0: 20 3d 20 79 3b 0d 0a 20 20 20 20 20 20 20 20 20   = y;..         
0ee0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
0ef0: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
0f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0f50: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
0f60: 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72  region Public Pr
0f70: 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
0f80: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 54 31        private T1
0f90: 20 78 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20   x;..           
0fa0: 20 70 75 62 6c 69 63 20 54 31 20 58 0d 0a 20 20   public T1 X..  
0fb0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
0fd0: 20 7b 20 72 65 74 75 72 6e 20 78 3b 20 7d 0d 0a   { return x; }..
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
0ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
1000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1040: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1050: 70 72 69 76 61 74 65 20 54 32 20 79 3b 0d 0a 20  private T2 y;.. 
1060: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1070: 63 20 54 32 20 59 0d 0a 20 20 20 20 20 20 20 20  c T2 Y..        
1080: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1090: 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
10a0: 75 72 6e 20 79 3b 20 7d 0d 0a 20 20 20 20 20 20  urn y; }..      
10b0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
10c0: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
10d0: 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
10e0: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
10f0: 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1140: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
1150: 67 69 6f 6e 20 54 72 61 63 65 4f 70 73 20 43 6c  gion TraceOps Cl
1160: 61 73 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69  ass..        pri
1170: 76 61 74 65 20 73 74 61 74 69 63 20 63 6c 61 73  vate static clas
1180: 73 20 54 72 61 63 65 4f 70 73 0d 0a 20 20 20 20  s TraceOps..    
1190: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
11a0: 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61     #region Priva
11b0: 74 65 20 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20  te Constants..  
11c0: 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
11d0: 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 44  e const string D
11e0: 65 66 61 75 6c 74 44 65 62 75 67 46 6f 72 6d 61  efaultDebugForma
11f0: 74 20 3d 20 22 23 7b 30 7d 20 40 20 7b 31 7d 3a  t = "#{0} @ {1}:
1200: 20 7b 32 7d 22 3b 0d 0a 20 20 20 20 20 20 20 20   {2}";..        
1210: 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73      private cons
1220: 74 20 73 74 72 69 6e 67 20 44 65 66 61 75 6c 74  t string Default
1230: 54 72 61 63 65 46 6f 72 6d 61 74 20 3d 20 22 23  TraceFormat = "#
1240: 7b 30 7d 20 40 20 7b 31 7d 3a 20 7b 32 7d 22 3b  {0} @ {1}: {2}";
1250: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1260: 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74  private const st
1270: 72 69 6e 67 20 49 73 6f 38 36 30 31 44 61 74 65  ring Iso8601Date
1280: 54 69 6d 65 4f 75 74 70 75 74 46 6f 72 6d 61 74  TimeOutputFormat
1290: 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   =..            
12a0: 20 20 20 20 22 79 79 79 79 2e 4d 4d 2e 64 64 54      "yyyy.MM.ddT
12b0: 48 48 3a 6d 6d 3a 73 73 2e 66 66 66 66 66 66 66  HH:mm:ss.fffffff
12c0: 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
12d0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
12e0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
12f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
1340: 67 69 6f 6e 20 50 72 69 76 61 74 65 20 53 74 61  gion Private Sta
1350: 74 69 63 20 44 61 74 61 0d 0a 20 20 20 20 20 20  tic Data..      
1360: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1370: 61 74 69 63 20 6f 62 6a 65 63 74 20 73 79 6e 63  atic object sync
1380: 52 6f 6f 74 20 3d 20 6e 65 77 20 6f 62 6a 65 63  Root = new objec
1390: 74 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  t();..          
13a0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
13b0: 20 6c 6f 6e 67 20 6e 65 78 74 44 65 62 75 67 49   long nextDebugI
13c0: 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d;..            
13d0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6c  private static l
13e0: 6f 6e 67 20 6e 65 78 74 54 72 61 63 65 49 64 3b  ong nextTraceId;
13f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
1400: 69 76 61 74 65 20 73 74 61 74 69 63 20 54 72 61  ivate static Tra
1410: 63 65 50 72 69 6f 72 69 74 79 20 64 65 62 75 67  cePriority debug
1420: 50 72 69 6f 72 69 74 79 20 3d 20 54 72 61 63 65  Priority = Trace
1430: 50 72 69 6f 72 69 74 79 2e 44 65 66 61 75 6c 74  Priority.Default
1440: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
1450: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 54 72  rivate static Tr
1460: 61 63 65 50 72 69 6f 72 69 74 79 20 74 72 61 63  acePriority trac
1470: 65 50 72 69 6f 72 69 74 79 20 3d 20 54 72 61 63  ePriority = Trac
1480: 65 50 72 69 6f 72 69 74 79 2e 44 65 66 61 75 6c  ePriority.Defaul
1490: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
14a0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 73  private static s
14b0: 74 72 69 6e 67 20 64 65 62 75 67 46 6f 72 6d 61  tring debugForma
14c0: 74 20 3d 20 44 65 66 61 75 6c 74 44 65 62 75 67  t = DefaultDebug
14d0: 46 6f 72 6d 61 74 3b 0d 0a 20 20 20 20 20 20 20  Format;..       
14e0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
14f0: 74 69 63 20 73 74 72 69 6e 67 20 74 72 61 63 65  tic string trace
1500: 46 6f 72 6d 61 74 20 3d 20 44 65 66 61 75 6c 74  Format = Default
1510: 54 72 61 63 65 46 6f 72 6d 61 74 3b 0d 0a 20 20  TraceFormat;..  
1520: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
1530: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
1540: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1580: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1590: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
15a0: 75 62 6c 69 63 20 53 74 61 74 69 63 20 50 72 6f  ublic Static Pro
15b0: 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
15c0: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
15d0: 69 63 20 54 72 61 63 65 50 72 69 6f 72 69 74 79  ic TracePriority
15e0: 20 44 65 62 75 67 50 72 69 6f 72 69 74 79 0d 0a   DebugPriority..
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
1610: 65 74 20 7b 20 6c 6f 63 6b 20 28 73 79 6e 63 52  et { lock (syncR
1620: 6f 6f 74 29 20 7b 20 72 65 74 75 72 6e 20 64 65  oot) { return de
1630: 62 75 67 50 72 69 6f 72 69 74 79 3b 20 7d 20 7d  bugPriority; } }
1640: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1650: 20 20 73 65 74 20 7b 20 6c 6f 63 6b 20 28 73 79    set { lock (sy
1660: 6e 63 52 6f 6f 74 29 20 7b 20 64 65 62 75 67 50  ncRoot) { debugP
1670: 72 69 6f 72 69 74 79 20 3d 20 76 61 6c 75 65 3b  riority = value;
1680: 20 7d 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20   } }..          
1690: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
16a0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
16b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16e0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
16f0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61        public sta
1700: 74 69 63 20 54 72 61 63 65 50 72 69 6f 72 69 74  tic TracePriorit
1710: 79 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 0d  y TracePriority.
1720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 67 65 74 20 7b 20 6c 6f 63 6b 20 28 73 79 6e 63  get { lock (sync
1750: 52 6f 6f 74 29 20 7b 20 72 65 74 75 72 6e 20 74  Root) { return t
1760: 72 61 63 65 50 72 69 6f 72 69 74 79 3b 20 7d 20  racePriority; } 
1770: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1780: 20 20 20 73 65 74 20 7b 20 6c 6f 63 6b 20 28 73     set { lock (s
1790: 79 6e 63 52 6f 6f 74 29 20 7b 20 74 72 61 63 65  yncRoot) { trace
17a0: 50 72 69 6f 72 69 74 79 20 3d 20 76 61 6c 75 65  Priority = value
17b0: 3b 20 7d 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ; } }..         
17c0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17d0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
17e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1810: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1820: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
1830: 61 74 69 63 20 73 74 72 69 6e 67 20 44 65 62 75  atic string Debu
1840: 67 46 6f 72 6d 61 74 0d 0a 20 20 20 20 20 20 20  gFormat..       
1850: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1860: 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 6c 6f          get { lo
1870: 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29 20 7b 20  ck (syncRoot) { 
1880: 72 65 74 75 72 6e 20 64 65 62 75 67 46 6f 72 6d  return debugForm
1890: 61 74 3b 20 7d 20 7d 0d 0a 20 20 20 20 20 20 20  at; } }..       
18a0: 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6c           set { l
18b0: 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29 20 7b  ock (syncRoot) {
18c0: 20 64 65 62 75 67 46 6f 72 6d 61 74 20 3d 20 76   debugFormat = v
18d0: 61 6c 75 65 3b 20 7d 20 7d 0d 0a 20 20 20 20 20  alue; } }..     
18e0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18f0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1940: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1950: 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  c static string 
1960: 54 72 61 63 65 46 6f 72 6d 61 74 0d 0a 20 20 20  TraceFormat..   
1970: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
1990: 7b 20 6c 6f 63 6b 20 28 73 79 6e 63 52 6f 6f 74  { lock (syncRoot
19a0: 29 20 7b 20 72 65 74 75 72 6e 20 74 72 61 63 65  ) { return trace
19b0: 46 6f 72 6d 61 74 3b 20 7d 20 7d 0d 0a 20 20 20  Format; } }..   
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
19d0: 20 7b 20 6c 6f 63 6b 20 28 73 79 6e 63 52 6f 6f   { lock (syncRoo
19e0: 74 29 20 7b 20 74 72 61 63 65 46 6f 72 6d 61 74  t) { traceFormat
19f0: 20 3d 20 76 61 6c 75 65 3b 20 7d 20 7d 0d 0a 20   = value; } }.. 
1a00: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1a10: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
1a20: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
1a30: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a70: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1a80: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49         #region I
1a90: 6e 74 65 72 61 63 74 69 76 65 20 53 75 70 70 6f  nteractive Suppo
1aa0: 72 74 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  rt Methods..    
1ab0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
1ac0: 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 74  tatic string Get
1ad0: 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 28 0d 0a  AssemblyTitle(..
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 41 73 73 65 6d 62 6c 79 20 61 73 73 65 6d 62 6c  Assembly assembl
1b00: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
1b10: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
1b20: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1b30: 20 20 20 20 20 69 66 20 28 61 73 73 65 6d 62 6c       if (assembl
1b40: 79 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y != null)..    
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20     try..        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 69 66 20 28 61 73 73 65 6d         if (assem
1bb0: 62 6c 79 2e 49 73 44 65 66 69 6e 65 64 28 0d 0a  bly.IsDefined(..
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 74 79 70 65 6f 66 28 41 73 73 65 6d 62 6c 79 54  typeof(AssemblyT
1bf0: 69 74 6c 65 41 74 74 72 69 62 75 74 65 29 2c 20  itleAttribute), 
1c00: 66 61 6c 73 65 29 29 0d 0a 20 20 20 20 20 20 20  false))..       
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 41 74 74  AssemblyTitleAtt
1c50: 72 69 62 75 74 65 20 74 69 74 6c 65 20 3d 0d 0a  ribute title =..
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c80: 28 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 41 74  (AssemblyTitleAt
1c90: 74 72 69 62 75 74 65 29 0d 0a 20 20 20 20 20 20  tribute)..      
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 6d 62            assemb
1cc0: 6c 79 2e 47 65 74 43 75 73 74 6f 6d 41 74 74 72  ly.GetCustomAttr
1cd0: 69 62 75 74 65 73 28 0d 0a 20 20 20 20 20 20 20  ibutes(..       
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70               typ
1d00: 65 6f 66 28 41 73 73 65 6d 62 6c 79 54 69 74 6c  eof(AssemblyTitl
1d10: 65 41 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c  eAttribute), fal
1d20: 73 65 29 5b 30 5d 3b 0d 0a 0d 0a 20 20 20 20 20  se)[0];....     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 69         return ti
1d50: 74 6c 65 2e 54 69 74 6c 65 3b 0d 0a 20 20 20 20  tle.Title;..    
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1d80: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20    catch..       
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
1de0: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1e10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e20: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
1e30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1e40: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
1e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e90: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
1ea0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
1eb0: 44 69 61 6c 6f 67 52 65 73 75 6c 74 20 53 68 6f  DialogResult Sho
1ec0: 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20 20  wMessage(..     
1ed0: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1ee0: 50 72 69 6f 72 69 74 79 20 74 72 61 63 65 50 72  Priority tracePr
1ef0: 69 6f 72 69 74 79 2c 0d 0a 20 20 20 20 20 20 20  iority,..       
1f00: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 43 61           TraceCa
1f10: 6c 6c 62 61 63 6b 20 64 65 62 75 67 43 61 6c 6c  llback debugCall
1f20: 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
1f30: 20 20 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c         TraceCall
1f40: 62 61 63 6b 20 74 72 61 63 65 43 61 6c 6c 62 61  back traceCallba
1f50: 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
1f60: 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20 61 73       Assembly as
1f70: 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20  sembly,..       
1f80: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1f90: 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20 20 20  message,..      
1fa0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1fb0: 20 63 61 74 65 67 6f 72 79 2c 0d 0a 20 20 20 20   category,..    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73              Mess
1fd0: 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 20 62 75  ageBoxButtons bu
1fe0: 74 74 6f 6e 73 2c 0d 0a 20 20 20 20 20 20 20 20  ttons,..        
1ff0: 20 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42          MessageB
2000: 6f 78 49 63 6f 6e 20 69 63 6f 6e 0d 0a 20 20 20  oxIcon icon..   
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
2020: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
2040: 69 61 6c 6f 67 52 65 73 75 6c 74 20 72 65 73 75  ialogResult resu
2050: 6c 74 20 3d 20 44 69 61 6c 6f 67 52 65 73 75 6c  lt = DialogResul
2060: 74 2e 4f 4b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  t.OK;....       
2070: 20 20 20 20 20 20 20 20 20 44 65 62 75 67 41 6e           DebugAn
2080: 64 54 72 61 63 65 28 74 72 61 63 65 50 72 69 6f  dTrace(tracePrio
2090: 72 69 74 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  rity,..         
20a0: 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67             debug
20b0: 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43  Callback, traceC
20c0: 61 6c 6c 62 61 63 6b 2c 20 6d 65 73 73 61 67 65  allback, message
20d0: 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  , category);....
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f0: 69 66 20 28 53 79 73 74 65 6d 49 6e 66 6f 72 6d  if (SystemInform
2100: 61 74 69 6f 6e 2e 55 73 65 72 49 6e 74 65 72 61  ation.UserIntera
2110: 63 74 69 76 65 29 0d 0a 20 20 20 20 20 20 20 20  ctive)..        
2120: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2140: 74 72 69 6e 67 20 74 69 74 6c 65 20 3d 20 47 65  tring title = Ge
2150: 74 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 28 61  tAssemblyTitle(a
2160: 73 73 65 6d 62 6c 79 29 3b 0d 0a 0d 0a 20 20 20  ssembly);....   
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 69 66 20 28 74 69 74 6c 65 20 3d 3d 20 6e 75   if (title == nu
2190: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 69 74               tit
21b0: 6c 65 20 3d 20 41 70 70 6c 69 63 61 74 69 6f 6e  le = Application
21c0: 2e 50 72 6f 64 75 63 74 4e 61 6d 65 3b 0d 0a 0d  .ProductName;...
21d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21e0: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 4d 65       result = Me
21f0: 73 73 61 67 65 42 6f 78 2e 53 68 6f 77 28 6d 65  ssageBox.Show(me
2200: 73 73 61 67 65 2c 20 74 69 74 6c 65 2c 20 62 75  ssage, title, bu
2210: 74 74 6f 6e 73 2c 20 69 63 6f 6e 29 3b 0d 0a 0d  ttons, icon);...
2220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2230: 20 20 20 20 20 44 65 62 75 67 41 6e 64 54 72 61       DebugAndTra
2240: 63 65 28 74 72 61 63 65 50 72 69 6f 72 69 74 79  ce(tracePriority
2250: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2260: 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67             debug
2270: 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43  Callback, traceC
2280: 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
2290: 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 20 22 55 73 65 72 20 63 68 6f 69 63 65 20 6f 66   "User choice of
22c0: 20 7b 30 7d 2e 22 2c 20 46 6f 72 44 69 73 70 6c   {0}.", ForDispl
22d0: 61 79 28 72 65 73 75 6c 74 29 29 2c 0d 0a 20 20  ay(result)),..  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f0: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 29 3b        category);
2300: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2310: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2320: 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20  esult;..        
2330: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 44 65 62               Deb
2350: 75 67 41 6e 64 54 72 61 63 65 28 74 72 61 63 65  ugAndTrace(trace
2360: 50 72 69 6f 72 69 74 79 2c 0d 0a 20 20 20 20 20  Priority,..     
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2380: 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72  ebugCallback, tr
2390: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
23a0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 22 44 65 66 61 75 6c 74 20 63 68 6f 69 63 65   "Default choice
23d0: 20 6f 66 20 7b 30 7d 2e 22 2c 20 46 6f 72 44 69   of {0}.", ForDi
23e0: 73 70 6c 61 79 28 72 65 73 75 6c 74 29 29 2c 0d  splay(result)),.
23f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2400: 20 20 20 20 20 63 61 74 65 67 6f 72 79 29 3b 0d       category);.
2410: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2420: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
2430: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
2440: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
2450: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
2460: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
2470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
24b0: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
24c0: 6f 6e 20 54 72 61 63 69 6e 67 20 53 75 70 70 6f  on Tracing Suppo
24d0: 72 74 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  rt Methods..    
24e0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
24f0: 74 61 74 69 63 20 6c 6f 6e 67 20 4e 65 78 74 44  tatic long NextD
2500: 65 62 75 67 49 64 28 29 0d 0a 20 20 20 20 20 20  ebugId()..      
2510: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2520: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2530: 49 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63 72  Interlocked.Incr
2540: 65 6d 65 6e 74 28 72 65 66 20 6e 65 78 74 44 65  ement(ref nextDe
2550: 62 75 67 49 64 29 3b 0d 0a 20 20 20 20 20 20 20  bugId);..       
2560: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
2570: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
2580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
25c0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
25d0: 73 74 61 74 69 63 20 6c 6f 6e 67 20 4e 65 78 74  static long Next
25e0: 54 72 61 63 65 49 64 28 29 0d 0a 20 20 20 20 20  TraceId()..     
25f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2600: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2610: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 2e 49 6e 63   Interlocked.Inc
2620: 72 65 6d 65 6e 74 28 72 65 66 20 6e 65 78 74 54  rement(ref nextT
2630: 72 61 63 65 49 64 29 3b 0d 0a 20 20 20 20 20 20  raceId);..      
2640: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2650: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
2660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
26a0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
26b0: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 54   static string T
26c0: 69 6d 65 53 74 61 6d 70 28 44 61 74 65 54 69 6d  imeStamp(DateTim
26d0: 65 20 64 61 74 65 54 69 6d 65 29 0d 0a 20 20 20  e dateTime)..   
26e0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2700: 72 6e 20 64 61 74 65 54 69 6d 65 2e 54 6f 53 74  rn dateTime.ToSt
2710: 72 69 6e 67 28 49 73 6f 38 36 30 31 44 61 74 65  ring(Iso8601Date
2720: 54 69 6d 65 4f 75 74 70 75 74 46 6f 72 6d 61 74  TimeOutputFormat
2730: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
2740: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2750: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2790: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
27a0: 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c 28      [MethodImpl(
27b0: 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f 6e  MethodImplOption
27c0: 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d 0a  s.NoInlining)]..
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
27e0: 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69 6e  ate static strin
27f0: 67 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d 65 28  g GetMethodName(
2800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2810: 20 20 53 74 61 63 6b 54 72 61 63 65 20 73 74 61    StackTrace sta
2820: 63 6b 54 72 61 63 65 2c 0d 0a 20 20 20 20 20 20  ckTrace,..      
2830: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65            int le
2840: 76 65 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  vel..           
2850: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
2860: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2870: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
2880: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
28b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
28c0: 54 45 3a 20 49 66 20 61 20 76 61 6c 69 64 20 73  TE: If a valid s
28d0: 74 61 63 6b 20 74 72 61 63 65 20 77 61 73 20 6e  tack trace was n
28e0: 6f 74 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  ot supplied by t
28f0: 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
2900: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
2910: 20 63 61 6c 6c 65 72 2c 20 63 72 65 61 74 65 20   caller, create 
2920: 6f 6e 65 20 6e 6f 77 20 62 61 73 65 64 20 6f 6e  one now based on
2930: 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20 20   the current..  
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 2f 2f 20 20 20 20 20 20 20 65 78 65 63 75    //       execu
2960: 74 69 6f 6e 20 73 74 61 63 6b 2e 0d 0a 20 20 20  tion stack...   
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2990: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 61           if (sta
29a0: 63 6b 54 72 61 63 65 20 3d 3d 20 6e 75 6c 6c 29  ckTrace == null)
29b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
29c0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2a00: 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 63  NOTE: Grab the c
2a10: 75 72 72 65 6e 74 20 65 78 65 63 75 74 69 6f 6e  urrent execution
2a20: 20 73 74 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20   stack...       
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
2a60: 63 6b 54 72 61 63 65 20 3d 20 6e 65 77 20 53 74  ckTrace = new St
2a70: 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a 0d 0a 20  ackTrace();.... 
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c 77 61     // NOTE: Alwa
2ac0: 79 73 20 73 6b 69 70 20 74 68 69 73 20 63 61 6c  ys skip this cal
2ad0: 6c 20 66 72 61 6d 65 20 77 68 65 6e 20 77 65 20  l frame when we 
2ae0: 63 61 70 74 75 72 65 0d 0a 20 20 20 20 20 20 20  capture..       
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 73 74   //       the st
2b10: 61 63 6b 20 74 72 61 63 65 2e 0d 0a 20 20 20 20  ack trace...    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 6c 65 76 65 6c 2b 2b 3b 0d 0a 20 20 20 20 20 20  level++;..      
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2b70: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2b80: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ba0: 2f 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65 20  / NOTE: Get the 
2bb0: 73 70 65 63 69 66 69 65 64 20 73 74 61 63 6b 20  specified stack 
2bc0: 66 72 61 6d 65 20 28 61 6c 77 61 79 73 20 61 64  frame (always ad
2bd0: 64 20 6f 6e 65 20 74 6f 0d 0a 20 20 20 20 20 20  d one to..      
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2bf0: 20 20 20 20 20 20 20 73 6b 69 70 20 74 68 69 73         skip this
2c00: 20 6d 65 74 68 6f 64 29 2e 0d 0a 20 20 20 20 20   method)...     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c20: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
2c30: 20 20 20 20 20 20 20 53 74 61 63 6b 46 72 61 6d         StackFram
2c40: 65 20 73 74 61 63 6b 46 72 61 6d 65 20 3d 20 73  e stackFrame = s
2c50: 74 61 63 6b 54 72 61 63 65 2e 47 65 74 46 72 61  tackTrace.GetFra
2c60: 6d 65 28 6c 65 76 65 6c 29 3b 0d 0a 0d 0a 20 20  me(level);....  
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2c90: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
2ca0: 45 3a 20 47 65 74 20 74 68 65 20 6d 65 74 68 6f  E: Get the metho
2cb0: 64 20 66 6f 72 20 74 68 65 20 73 74 61 63 6b 20  d for the stack 
2cc0: 66 72 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20 20  frame...        
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 4d 65 74 68 6f 64 42 61 73 65 20 6d      MethodBase m
2d00: 65 74 68 6f 64 42 61 73 65 20 3d 20 73 74 61 63  ethodBase = stac
2d10: 6b 46 72 61 6d 65 2e 47 65 74 4d 65 74 68 6f 64  kFrame.GetMethod
2d20: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 65 74 20     // NOTE: Get 
2d60: 74 68 65 20 74 79 70 65 20 66 6f 72 20 74 68 65  the type for the
2d70: 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 20 20   method...      
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2d90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2da0: 20 20 20 20 20 20 54 79 70 65 20 74 79 70 65 20        Type type 
2db0: 3d 20 6d 65 74 68 6f 64 42 61 73 65 2e 44 65 63  = methodBase.Dec
2dc0: 6c 61 72 69 6e 67 54 79 70 65 3b 0d 0a 0d 0a 20  laringType;.... 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
2e00: 54 45 3a 20 47 65 74 20 74 68 65 20 6e 61 6d 65  TE: Get the name
2e10: 20 6f 66 20 74 68 65 20 6d 65 74 68 6f 64 2e 0d   of the method..
2e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e30: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2e50: 69 6e 67 20 6e 61 6d 65 20 3d 20 6d 65 74 68 6f  ing name = metho
2e60: 64 42 61 73 65 2e 4e 61 6d 65 3b 0d 0a 0d 0a 20  dBase.Name;.... 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
2ea0: 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20 70  TE: Return the p
2eb0: 72 6f 70 65 72 6c 79 20 66 6f 72 6d 61 74 74 65  roperly formatte
2ec0: 64 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20 20  d result...     
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ee0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
2ef0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 74         return St
2f00: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 20 20 20 20 20 22 7b 30 7d 7b 31 7d 7b 32 7d        "{0}{1}{2}
2f30: 22 2c 20 74 79 70 65 2e 4e 61 6d 65 2c 20 54 79  ", type.Name, Ty
2f40: 70 65 2e 44 65 6c 69 6d 69 74 65 72 2c 20 6e 61  pe.Delimiter, na
2f50: 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  me);..          
2f60: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2f70: 20 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a           catch..
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2fa0: 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74         // do not
2fb0: 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20  hing...         
2fc0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2fe0: 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20  rn null;..      
2ff0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
3000: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
3010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
3050: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
3060: 20 73 74 61 74 69 63 20 76 6f 69 64 20 44 65 62   static void Deb
3070: 75 67 43 6f 72 65 28 0d 0a 20 20 20 20 20 20 20  ugCore(..       
3080: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
3090: 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20 20 20  message,..      
30a0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
30b0: 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20   category..     
30c0: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
30d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
30f0: 6b 20 28 73 79 6e 63 52 6f 6f 74 29 0d 0a 20 20  k (syncRoot)..  
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
3110: 0a 23 69 66 20 44 45 42 55 47 0d 0a 20 20 20 20  .#if DEBUG..    
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3130: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
3140: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
3150: 20 57 72 69 74 65 20 74 68 65 20 6d 65 73 73 61   Write the messa
3160: 67 65 20 74 6f 20 61 6c 6c 20 74 68 65 20 61 63  ge to all the ac
3170: 74 69 76 65 20 64 65 62 75 67 0d 0a 20 20 20 20  tive debug..    
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 2f 2f 20 20 20 20 20 20 20 6c 69 73 74 65 6e 65  //       listene
31a0: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs...           
31b0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 44 65 62 75 67 2e 57 72 69 74 65 4c 69 6e 65   Debug.WriteLine
31e0: 28 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f  (message, catego
31f0: 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry);..          
3200: 20 20 20 20 20 20 20 20 20 20 44 65 62 75 67 2e            Debug.
3210: 46 6c 75 73 68 28 29 3b 0d 0a 23 65 6c 73 65 0d  Flush();..#else.
3220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3230: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3250: 4e 4f 54 45 3a 20 46 6f 72 20 61 20 62 75 69 6c  NOTE: For a buil
3260: 64 20 77 69 74 68 6f 75 74 20 22 44 45 42 55 47  d without "DEBUG
3270: 22 20 64 65 66 69 6e 65 64 2c 20 77 65 20 63 61  " defined, we ca
3280: 6e 6e 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20  nnot..          
3290: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
32a0: 20 20 20 73 69 6d 70 6c 79 20 75 73 65 20 74 68     simply use th
32b0: 65 20 44 65 62 75 67 20 63 6c 61 73 73 20 28 69  e Debug class (i
32c0: 2e 65 2e 20 69 74 20 77 69 6c 6c 20 64 6f 0d 0a  .e. it will do..
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6e 6f 74      //       not
32f0: 68 69 6e 67 29 3b 20 74 68 65 72 65 66 6f 72 65  hing); therefore
3300: 2c 20 75 73 65 20 74 68 65 20 63 6f 6e 73 6f 6c  , use the consol
3310: 65 20 64 69 72 65 63 74 6c 79 0d 0a 20 20 20 20  e directly..    
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 2f 2f 20 20 20 20 20 20 20 69 6e 73 74 65 61 64  //       instead
3340: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3350: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
3370: 6f 6e 73 6f 6c 65 2e 57 72 69 74 65 4c 69 6e 65  onsole.WriteLine
3380: 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22  (String.Format("
3390: 7b 31 7d 3a 20 7b 30 7d 22 2c 20 6d 65 73 73 61  {1}: {0}", messa
33a0: 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge,..           
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
33c0: 65 67 6f 72 79 29 29 3b 0d 0a 23 65 6e 64 69 66  egory));..#endif
33d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
33e0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
33f0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
3400: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
3410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3440: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
3450: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
3460: 69 63 20 76 6f 69 64 20 54 72 61 63 65 43 6f 72  ic void TraceCor
3470: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
3480: 20 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73 61      string messa
3490: 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge,..           
34a0: 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74 65       string cate
34b0: 67 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  gory..          
34c0: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
34d0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
34e0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 20 28 73 79          lock (sy
34f0: 6e 63 52 6f 6f 74 29 0d 0a 20 20 20 20 20 20 20  ncRoot)..       
3500: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
3530: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
3540: 20 57 72 69 74 65 20 74 68 65 20 6d 65 73 73 61   Write the messa
3550: 67 65 20 74 6f 20 61 6c 6c 20 74 68 65 20 61 63  ge to all the ac
3560: 74 69 76 65 20 74 72 61 63 65 0d 0a 20 20 20 20  tive trace..    
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 2f 2f 20 20 20 20 20 20 20 6c 69 73 74 65 6e 65  //       listene
3590: 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs...           
35a0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 54 72 61 63 65 2e 57 72 69 74 65 4c 69 6e 65   Trace.WriteLine
35d0: 28 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f  (message, catego
35e0: 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ry);..          
35f0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 2e            Trace.
3600: 46 6c 75 73 68 28 29 3b 0d 0a 20 20 20 20 20 20  Flush();..      
3610: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
3620: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
3630: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
3640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
3680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 4d 65  .            [Me
3690: 74 68 6f 64 49 6d 70 6c 28 4d 65 74 68 6f 64 49  thodImpl(MethodI
36a0: 6d 70 6c 4f 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c  mplOptions.NoInl
36b0: 69 6e 69 6e 67 29 5d 0d 0a 20 20 20 20 20 20 20  ining)]..       
36c0: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
36d0: 69 63 20 73 74 72 69 6e 67 20 44 65 62 75 67 41  ic string DebugA
36e0: 6e 64 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  ndTrace(..      
36f0: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50            TraceP
3700: 72 69 6f 72 69 74 79 20 74 72 61 63 65 50 72 69  riority tracePri
3710: 6f 72 69 74 79 2c 0d 0a 20 20 20 20 20 20 20 20  ority,..        
3720: 20 20 20 20 20 20 20 20 54 72 61 63 65 43 61 6c          TraceCal
3730: 6c 62 61 63 6b 20 64 65 62 75 67 43 61 6c 6c 62  lback debugCallb
3740: 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ack,..          
3750: 20 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c 62        TraceCallb
3760: 61 63 6b 20 74 72 61 63 65 43 61 6c 6c 62 61 63  ack traceCallbac
3770: 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
3780: 20 20 20 20 45 78 63 65 70 74 69 6f 6e 20 65 78      Exception ex
3790: 63 65 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  ception,..      
37a0: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
37b0: 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20   category..     
37c0: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
37d0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
37f0: 28 65 78 63 65 70 74 69 6f 6e 20 21 3d 20 6e 75  (exception != nu
3800: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
3810: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3820: 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 74 72  DebugAndTrace(tr
3830: 61 63 65 50 72 69 6f 72 69 74 79 2c 20 64 65 62  acePriority, deb
3840: 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ugCallback,..   
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
3870: 63 6b 2c 20 6e 65 77 20 53 74 61 63 6b 54 72 61  ck, new StackTra
3880: 63 65 28 65 78 63 65 70 74 69 6f 6e 2c 20 74 72  ce(exception, tr
3890: 75 65 29 2c 20 30 2c 0d 0a 20 20 20 20 20 20 20  ue), 0,..       
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 65 78 63 65 70 74 69 6f 6e 2e 54 6f 53 74 72   exception.ToStr
38c0: 69 6e 67 28 29 2c 20 63 61 74 65 67 6f 72 79 29  ing(), category)
38d0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
38e0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
38f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
3900: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3950: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
3960: 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c 28 4d     [MethodImpl(M
3970: 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f 6e 73  ethodImplOptions
3980: 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d 0a 20  .NoInlining)].. 
3990: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
39a0: 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  c static string 
39b0: 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 0d 0a  DebugAndTrace(..
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 54 72 61 63 65 50 72 69 6f 72 69 74 79 20 74 72  TracePriority tr
39e0: 61 63 65 50 72 69 6f 72 69 74 79 2c 0d 0a 20 20  acePriority,..  
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
3a00: 61 63 65 43 61 6c 6c 62 61 63 6b 20 64 65 62 75  aceCallback debu
3a10: 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20  gCallback,..    
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
3a30: 65 43 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43  eCallback traceC
3a40: 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
3a50: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
3a60: 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20 20   message,..     
3a70: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
3a80: 67 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20  g category..    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
3ac0: 74 75 72 6e 20 44 65 62 75 67 41 6e 64 54 72 61  turn DebugAndTra
3ad0: 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
3ae0: 20 20 20 20 20 20 20 20 20 74 72 61 63 65 50 72           tracePr
3af0: 69 6f 72 69 74 79 2c 20 64 65 62 75 67 43 61 6c  iority, debugCal
3b00: 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c  lback, traceCall
3b10: 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 31 2c 0d 0a  back, null, 1,..
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 20 20 20 20 6d 65 73 73 61 67 65 2c 20 63 61 74      message, cat
3b40: 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20  egory);..       
3b50: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
3b60: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
3b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
3bb0: 20 20 20 20 20 20 20 20 20 5b 4d 65 74 68 6f 64           [Method
3bc0: 49 6d 70 6c 28 4d 65 74 68 6f 64 49 6d 70 6c 4f  Impl(MethodImplO
3bd0: 70 74 69 6f 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e  ptions.NoInlinin
3be0: 67 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  g)]..           
3bf0: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
3c00: 73 74 72 69 6e 67 20 44 65 62 75 67 41 6e 64 54  string DebugAndT
3c10: 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
3c20: 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
3c30: 72 69 74 79 20 74 72 61 63 65 50 72 69 6f 72 69  rity tracePriori
3c40: 74 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ty,..           
3c50: 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c 62 61       TraceCallba
3c60: 63 6b 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b  ck debugCallback
3c70: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
3c80: 20 20 20 54 72 61 63 65 43 61 6c 6c 62 61 63 6b     TraceCallback
3c90: 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d   traceCallback,.
3ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cb0: 20 53 74 61 63 6b 54 72 61 63 65 20 73 74 61 63   StackTrace stac
3cc0: 6b 54 72 61 63 65 2c 0d 0a 20 20 20 20 20 20 20  kTrace,..       
3cd0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 76           int lev
3ce0: 65 6c 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  el,..           
3cf0: 20 20 20 20 20 73 74 72 69 6e 67 20 6d 65 73 73       string mess
3d00: 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  age,..          
3d10: 20 20 20 20 20 20 73 74 72 69 6e 67 20 63 61 74        string cat
3d20: 65 67 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  egory..         
3d30: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
3d40: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3d50: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
3d70: 4e 4f 54 45 3a 20 41 6c 77 61 79 73 20 73 6b 69  NOTE: Always ski
3d80: 70 20 74 68 69 73 20 63 61 6c 6c 20 66 72 61 6d  p this call fram
3d90: 65 20 69 66 20 74 68 65 20 73 74 61 63 6b 20 74  e if the stack t
3da0: 72 61 63 65 20 69 73 0d 0a 20 20 20 20 20 20 20  race is..       
3db0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
3dc0: 20 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 63 61    going to be ca
3dd0: 70 74 75 72 65 64 20 62 79 20 47 65 74 4d 65 74  ptured by GetMet
3de0: 68 6f 64 4e 61 6d 65 2e 0d 0a 20 20 20 20 20 20  hodName...      
3df0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
3e10: 20 28 73 74 61 63 6b 54 72 61 63 65 20 3d 3d 20   (stackTrace == 
3e20: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
3e30: 20 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c             level
3e40: 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ++;....         
3e50: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
3e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
3e70: 54 45 3a 20 46 6f 72 6d 61 74 20 74 68 65 20 6d  TE: Format the m
3e80: 65 73 73 61 67 65 20 66 6f 72 20 64 69 73 70 6c  essage for displ
3e90: 61 79 20 28 6f 6e 63 65 29 2e 0d 0a 20 20 20 20  ay (once)...    
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65 64  string formatted
3ed0: 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
3ee0: 28 22 7b 30 7d 3a 20 7b 31 7d 22 2c 0d 0a 20 20  ("{0}: {1}",..  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d 65 28    GetMethodName(
3f10: 73 74 61 63 6b 54 72 61 63 65 2c 20 6c 65 76 65  stackTrace, leve
3f20: 6c 29 2c 20 6d 65 73 73 61 67 65 29 3b 0d 0a 0d  l), message);...
3f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3f40: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
3f50: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66       // NOTE: If
3f60: 20 74 68 65 20 74 72 61 63 65 20 70 72 69 6f 72   the trace prior
3f70: 69 74 79 20 6f 66 20 74 68 69 73 20 6d 65 73 73  ity of this mess
3f80: 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
3f90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3fa0: 20 20 2f 2f 20 20 20 20 20 20 20 77 68 61 74 20    //       what 
3fb0: 77 65 20 63 75 72 72 65 6e 74 6c 79 20 77 61 6e  we currently wan
3fc0: 74 20 74 6f 20 64 65 62 75 67 2c 20 73 6b 69 70  t to debug, skip
3fd0: 20 69 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20   it...          
3fe0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
3ff0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 74 72            if (tr
4000: 61 63 65 50 72 69 6f 72 69 74 79 20 3e 3d 20 44  acePriority >= D
4010: 65 62 75 67 50 72 69 6f 72 69 74 79 29 0d 0a 20  ebugPriority).. 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4030: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4040: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
4060: 20 4e 4f 54 45 3a 20 49 66 20 6e 6f 74 20 73 70   NOTE: If not sp
4070: 65 63 69 66 69 65 64 2c 20 75 73 65 20 74 68 65  ecified, use the
4080: 20 64 65 66 61 75 6c 74 20 64 65 62 75 67 20 63   default debug c
4090: 61 6c 6c 62 61 63 6b 2e 0d 0a 20 20 20 20 20 20  allback...      
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
40b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
40c0: 20 20 20 20 20 20 69 66 20 28 64 65 62 75 67 43        if (debugC
40d0: 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29  allback == null)
40e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
40f0: 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43            debugC
4100: 61 6c 6c 62 61 63 6b 20 3d 20 44 65 62 75 67 43  allback = DebugC
4110: 6f 72 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ore;....        
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4140: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 6e 76      // NOTE: Inv
4150: 6f 6b 65 20 74 68 65 20 64 65 62 75 67 20 63 61  oke the debug ca
4160: 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
4170: 66 6f 72 6d 61 74 74 65 64 0d 0a 20 20 20 20 20  formatted..     
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4190: 2f 20 20 20 20 20 20 20 6d 65 73 73 61 67 65 20  /       message 
41a0: 61 6e 64 20 74 68 65 20 63 61 74 65 67 6f 72 79  and the category
41b0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68   specified by th
41c0: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
41d0: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
41e0: 63 61 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20  caller...       
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
4200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4210: 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61       debugCallba
4220: 63 6b 28 66 6f 72 6d 61 74 74 65 64 2c 20 63 61  ck(formatted, ca
4230: 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20  tegory);..      
4240: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4260: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
4270: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74     // NOTE: If t
4280: 68 65 20 74 72 61 63 65 20 70 72 69 6f 72 69 74  he trace priorit
4290: 79 20 6f 66 20 74 68 69 73 20 6d 65 73 73 61 67  y of this messag
42a0: 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 0d 0a  e is less than..
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 2f 2f 20 20 20 20 20 20 20 77 68 61 74 20 77 65  //       what we
42d0: 20 63 75 72 72 65 6e 74 6c 79 20 77 61 6e 74 20   currently want 
42e0: 74 6f 20 74 72 61 63 65 2c 20 73 6b 69 70 20 69  to trace, skip i
42f0: 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t...            
4300: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
4310: 20 20 20 20 20 20 20 20 69 66 20 28 74 72 61 63          if (trac
4320: 65 50 72 69 6f 72 69 74 79 20 3e 3d 20 54 72 61  ePriority >= Tra
4330: 63 65 50 72 69 6f 72 69 74 79 29 0d 0a 20 20 20  cePriority)..   
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
4370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
4380: 4f 54 45 3a 20 49 66 20 6e 6f 74 20 73 70 65 63  OTE: If not spec
4390: 69 66 69 65 64 2c 20 75 73 65 20 74 68 65 20 64  ified, use the d
43a0: 65 66 61 75 6c 74 20 74 72 61 63 65 20 63 61 6c  efault trace cal
43b0: 6c 62 61 63 6b 2e 0d 0a 20 20 20 20 20 20 20 20  lback...        
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43e0: 20 20 20 20 69 66 20 28 74 72 61 63 65 43 61 6c      if (traceCal
43f0: 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  lback == null)..
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
4420: 6c 62 61 63 6b 20 3d 20 54 72 61 63 65 43 6f 72  lback = TraceCor
4430: 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
4440: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 6e 76 6f 6b    // NOTE: Invok
4470: 65 20 74 68 65 20 74 72 61 63 65 20 63 61 6c 6c  e the trace call
4480: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 66 6f  back with the fo
4490: 72 6d 61 74 74 65 64 0d 0a 20 20 20 20 20 20 20  rmatted..       
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
44b0: 20 20 20 20 20 20 6d 65 73 73 61 67 65 20 61 6e        message an
44c0: 64 20 74 68 65 20 63 61 74 65 67 6f 72 79 20 73  d the category s
44d0: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 0d  pecified by the.
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44f0: 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 61       //       ca
4500: 6c 6c 65 72 2e 0d 0a 20 20 20 20 20 20 20 20 20  ller...         
4510: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
4540: 28 66 6f 72 6d 61 74 74 65 64 2c 20 63 61 74 65  (formatted, cate
4550: 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20  gory);..        
4560: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
4580: 75 72 6e 20 6d 65 73 73 61 67 65 3b 0d 0a 20 20  urn message;..  
4590: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
45a0: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
45b0: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ion..        }..
45c0: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
45d0: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
45e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
45f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4620: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
4630: 20 23 72 65 67 69 6f 6e 20 4d 6f 63 6b 52 65 67   #region MockReg
4640: 69 73 74 72 79 20 43 6c 61 73 73 0d 0a 20 20 20  istry Class..   
4650: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
4660: 6c 65 64 20 63 6c 61 73 73 20 4d 6f 63 6b 52 65  led class MockRe
4670: 67 69 73 74 72 79 20 3a 20 49 44 69 73 70 6f 73  gistry : IDispos
4680: 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 7b 0d  able..        {.
4690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
46a0: 67 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e 73  gion Public Cons
46b0: 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20 20 20  tructors..      
46c0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63        public Moc
46d0: 6b 52 65 67 69 73 74 72 79 28 29 0d 0a 20 20 20  kRegistry()..   
46e0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74              what
4700: 49 66 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  If = true;..    
4710: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64              read
4720: 4f 6e 6c 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  Only = true;..  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61                sa
4740: 66 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  fe = true;..    
4750: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4760: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
4770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
47c0: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 28  ic MockRegistry(
47d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
47e0: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 0d 0a 20    bool whatIf.. 
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
4800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4810: 20 20 3a 20 74 68 69 73 28 29 0d 0a 20 20 20 20    : this()..    
4820: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
4830: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
4840: 77 68 61 74 49 66 20 3d 20 77 68 61 74 49 66 3b  whatIf = whatIf;
4850: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
4860: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
4870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
48a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
48b0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
48c0: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
48d0: 69 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20 20  istry(..        
48e0: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
48f0: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
4900: 20 20 20 20 20 20 62 6f 6f 6c 20 72 65 61 64 4f        bool readO
4910: 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nly..           
4920: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
4930: 20 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 77          : this(w
4940: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
4950: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
4960: 20 20 20 20 20 20 20 74 68 69 73 2e 72 65 61 64         this.read
4970: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
4980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
4990: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
49a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49e0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
49f0: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
4a00: 69 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20 20  istry(..        
4a10: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
4a20: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
4a30: 20 20 20 20 20 20 62 6f 6f 6c 20 72 65 61 64 4f        bool readO
4a40: 6e 6c 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  nly,..          
4a50: 20 20 20 20 20 20 62 6f 6f 6c 20 73 61 66 65 0d        bool safe.
4a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4a70: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
4a80: 20 20 20 20 3a 20 74 68 69 73 28 77 68 61 74 49      : this(whatI
4a90: 66 2c 20 72 65 61 64 4f 6e 6c 79 29 0d 0a 20 20  f, readOnly)..  
4aa0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
4ac0: 73 2e 73 61 66 65 20 3d 20 73 61 66 65 3b 0d 0a  s.safe = safe;..
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
4ae0: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
4af0: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
4b00: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
4b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b40: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
4b50: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
4b60: 50 75 62 6c 69 63 20 50 72 6f 70 65 72 74 69 65  Public Propertie
4b70: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
4b80: 72 69 76 61 74 65 20 62 6f 6f 6c 20 77 68 61 74  rivate bool what
4b90: 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If;..           
4ba0: 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 57 68 61   public bool Wha
4bb0: 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20  tIf..           
4bc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4bd0: 20 20 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44      get { CheckD
4be0: 69 73 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72  isposed(); retur
4bf0: 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a 20 20 20  n whatIf; }..   
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
4c10: 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64   { CheckDisposed
4c20: 28 29 3b 20 77 68 61 74 49 66 20 3d 20 76 61 6c  (); whatIf = val
4c30: 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
4c40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
4c50: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
4c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c90: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
4ca0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
4cb0: 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 3b 0d 0a 20  ool readOnly;.. 
4cc0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
4cd0: 63 20 62 6f 6f 6c 20 52 65 61 64 4f 6e 6c 79 0d  c bool ReadOnly.
4ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 67 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f  get { CheckDispo
4d10: 73 65 64 28 29 3b 20 72 65 74 75 72 6e 20 72 65  sed(); return re
4d20: 61 64 4f 6e 6c 79 3b 20 7d 0d 0a 20 20 20 20 20  adOnly; }..     
4d30: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
4d40: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
4d50: 3b 20 72 65 61 64 4f 6e 6c 79 20 3d 20 76 61 6c  ; readOnly = val
4d60: 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
4d70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
4d80: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
4d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dc0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
4dd0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
4de0: 6f 6f 6c 20 73 61 66 65 3b 0d 0a 20 20 20 20 20  ool safe;..     
4df0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
4e00: 6f 6c 20 53 61 66 65 0d 0a 20 20 20 20 20 20 20  ol Safe..       
4e10: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
4e20: 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 43 68          get { Ch
4e30: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72  eckDisposed(); r
4e40: 65 74 75 72 6e 20 73 61 66 65 3b 20 7d 0d 0a 20  eturn safe; }.. 
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4e60: 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73  et { CheckDispos
4e70: 65 64 28 29 3b 20 73 61 66 65 20 3d 20 76 61 6c  ed(); safe = val
4e80: 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
4e90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
4ea0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
4eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ee0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
4ef0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 4d         private M
4f00: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 63  ockRegistryKey c
4f10: 6c 61 73 73 65 73 52 6f 6f 74 3b 0d 0a 20 20 20  lassesRoot;..   
4f20: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
4f30: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
4f40: 43 6c 61 73 73 65 73 52 6f 6f 74 0d 0a 20 20 20  ClassesRoot..   
4f50: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 0d              get.
4f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
4f90: 20 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73          CheckDis
4fa0: 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20  posed();....    
4fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fc0: 69 66 20 28 63 6c 61 73 73 65 73 52 6f 6f 74 20  if (classesRoot 
4fd0: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 63 6c 61 73 73 65 73 52 6f 6f 74 20 3d 20    classesRoot = 
5000: 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  new MockRegistry
5010: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5030: 20 20 52 65 67 69 73 74 72 79 2e 43 6c 61 73 73    Registry.Class
5040: 65 73 52 6f 6f 74 2c 20 77 68 61 74 49 66 2c 20  esRoot, whatIf, 
5050: 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b  readOnly, safe);
5060: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5070: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
5080: 6c 61 73 73 65 73 52 6f 6f 74 3b 0d 0a 20 20 20  lassesRoot;..   
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
50b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
50c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5100: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5110: 70 72 69 76 61 74 65 20 4d 6f 63 6b 52 65 67 69  private MockRegi
5120: 73 74 72 79 4b 65 79 20 63 75 72 72 65 6e 74 43  stryKey currentC
5130: 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20 20 20  onfig;..        
5140: 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52      public MockR
5150: 65 67 69 73 74 72 79 4b 65 79 20 43 75 72 72 65  egistryKey Curre
5160: 6e 74 43 6f 6e 66 69 67 0d 0a 20 20 20 20 20 20  ntConfig..      
5170: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
5180: 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a 20 20           get..  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
51a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
51b0: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
51c0: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
51e0: 28 63 75 72 72 65 6e 74 43 6f 6e 66 69 67 20 3d  (currentConfig =
51f0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 63 75 72 72 65 6e 74 43 6f 6e 66 69 67 20 3d   currentConfig =
5220: 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72   new MockRegistr
5230: 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  yKey(..         
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 20 20 52 65 67 69 73 74 72 79 2e 43 75 72 72     Registry.Curr
5260: 65 6e 74 43 6f 6e 66 69 67 2c 20 77 68 61 74 49  entConfig, whatI
5270: 66 2c 20 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66  f, readOnly, saf
5280: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
5290: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
52a0: 6e 20 63 75 72 72 65 6e 74 43 6f 6e 66 69 67 3b  n currentConfig;
52b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
52c0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
52d0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
52e0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
52f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5300: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5320: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
5330: 20 20 20 20 20 70 72 69 76 61 74 65 20 4d 6f 63       private Moc
5340: 6b 52 65 67 69 73 74 72 79 4b 65 79 20 63 75 72  kRegistryKey cur
5350: 72 65 6e 74 55 73 65 72 3b 0d 0a 20 20 20 20 20  rentUser;..     
5360: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f         public Mo
5370: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 43 75  ckRegistryKey Cu
5380: 72 72 65 6e 74 55 73 65 72 0d 0a 20 20 20 20 20  rrentUser..     
5390: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
53a0: 20 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a 20            get.. 
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
53c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
53d0: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f        CheckDispo
53e0: 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sed();....      
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5400: 20 28 63 75 72 72 65 6e 74 55 73 65 72 20 3d 3d   (currentUser ==
5410: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 63 75 72 72 65 6e 74 55 73 65 72 20 3d 20 6e 65  currentUser = ne
5440: 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  w MockRegistryKe
5450: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 52 65 67 69 73 74 72 79 2e 43 75 72 72 65 6e 74  Registry.Current
5480: 55 73 65 72 2c 20 77 68 61 74 49 66 2c 20 72 65  User, whatIf, re
5490: 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b 0d 0a  adOnly, safe);..
54a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
54b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 75 72        return cur
54c0: 72 65 6e 74 55 73 65 72 3b 0d 0a 20 20 20 20 20  rentUser;..     
54d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
54e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
54f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
5500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
5540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
5550: 69 76 61 74 65 20 4d 6f 63 6b 52 65 67 69 73 74  ivate MockRegist
5560: 72 79 4b 65 79 20 64 79 6e 44 61 74 61 3b 0d 0a  ryKey dynData;..
5570: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
5580: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ic MockRegistryK
5590: 65 79 20 44 79 6e 44 61 74 61 0d 0a 20 20 20 20  ey DynData..    
55a0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
55b0: 20 20 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a             get..
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
55e0: 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70         CheckDisp
55f0: 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  osed();....     
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5610: 66 20 28 64 79 6e 44 61 74 61 20 3d 3d 20 6e 75  f (dynData == nu
5620: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 79 6e               dyn
5640: 44 61 74 61 20 3d 20 6e 65 77 20 4d 6f 63 6b 52  Data = new MockR
5650: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
5680: 79 2e 44 79 6e 44 61 74 61 2c 20 77 68 61 74 49  y.DynData, whatI
5690: 66 2c 20 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66  f, readOnly, saf
56a0: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
56b0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
56c0: 6e 20 64 79 6e 44 61 74 61 3b 0d 0a 20 20 20 20  n dynData;..    
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
56e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
5700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
5740: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
5750: 72 69 76 61 74 65 20 4d 6f 63 6b 52 65 67 69 73  rivate MockRegis
5760: 74 72 79 4b 65 79 20 6c 6f 63 61 6c 4d 61 63 68  tryKey localMach
5770: 69 6e 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ine;..          
5780: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
5790: 69 73 74 72 79 4b 65 79 20 4c 6f 63 61 6c 4d 61  istryKey LocalMa
57a0: 63 68 69 6e 65 0d 0a 20 20 20 20 20 20 20 20 20  chine..         
57b0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
57c0: 20 20 20 20 20 20 67 65 74 0d 0a 20 20 20 20 20        get..     
57d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28    CheckDisposed(
5800: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
5810: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f            if (lo
5820: 63 61 6c 4d 61 63 68 69 6e 65 20 3d 3d 20 6e 75  calMachine == nu
5830: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
5850: 61 6c 4d 61 63 68 69 6e 65 20 3d 20 6e 65 77 20  alMachine = new 
5860: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28  MockRegistryKey(
5870: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
5890: 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63 68  gistry.LocalMach
58a0: 69 6e 65 2c 20 77 68 61 74 49 66 2c 20 72 65 61  ine, whatIf, rea
58b0: 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 0d  dOnly, safe);...
58c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
58d0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 63 61       return loca
58e0: 6c 4d 61 63 68 69 6e 65 3b 0d 0a 20 20 20 20 20  lMachine;..     
58f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
5900: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
5910: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
5920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
5960: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
5970: 69 76 61 74 65 20 4d 6f 63 6b 52 65 67 69 73 74  ivate MockRegist
5980: 72 79 4b 65 79 20 70 65 72 66 6f 72 6d 61 6e 63  ryKey performanc
5990: 65 44 61 74 61 3b 0d 0a 20 20 20 20 20 20 20 20  eData;..        
59a0: 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52      public MockR
59b0: 65 67 69 73 74 72 79 4b 65 79 20 50 65 72 66 6f  egistryKey Perfo
59c0: 72 6d 61 6e 63 65 44 61 74 61 0d 0a 20 20 20 20  rmanceData..    
59d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
59e0: 20 20 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a             get..
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
5a10: 20 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70         CheckDisp
5a20: 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  osed();....     
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5a40: 66 20 28 70 65 72 66 6f 72 6d 61 6e 63 65 44 61  f (performanceDa
5a50: 74 61 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ta == null)..   
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 20 20 20 70 65 72 66 6f 72 6d 61 6e 63 65       performance
5a80: 44 61 74 61 20 3d 20 6e 65 77 20 4d 6f 63 6b 52  Data = new MockR
5a90: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
5ac0: 79 2e 50 65 72 66 6f 72 6d 61 6e 63 65 44 61 74  y.PerformanceDat
5ad0: 61 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f  a, whatIf, readO
5ae0: 6e 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 0d 0a 20  nly, safe);.... 
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 72 65 74 75 72 6e 20 70 65 72 66 6f 72     return perfor
5b10: 6d 61 6e 63 65 44 61 74 61 3b 0d 0a 20 20 20 20  manceData;..    
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
5b30: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
5b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
5b90: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
5ba0: 72 69 76 61 74 65 20 4d 6f 63 6b 52 65 67 69 73  rivate MockRegis
5bb0: 74 72 79 4b 65 79 20 75 73 65 72 73 3b 0d 0a 20  tryKey users;.. 
5bc0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
5bd0: 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  c MockRegistryKe
5be0: 79 20 55 73 65 72 73 0d 0a 20 20 20 20 20 20 20  y Users..       
5bf0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
5c00: 20 20 20 20 20 20 20 20 67 65 74 0d 0a 20 20 20          get..   
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
5c40: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d();....        
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
5c60: 75 73 65 72 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  users == null)..
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 20 20 20 20 75 73 65 72 73 20 3d 20          users = 
5c90: 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  new MockRegistry
5ca0: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 52 65 67 69 73 74 72 79 2e 55 73 65 72 73    Registry.Users
5cd0: 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f 6e  , whatIf, readOn
5ce0: 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 0d 0a 20 20  ly, safe);....  
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 72 65 74 75 72 6e 20 75 73 65 72 73 3b 0d    return users;.
5d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5d30: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
5d40: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
5d50: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
5d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
5db0: 69 6f 6e 20 50 75 62 6c 69 63 20 22 52 65 67 69  ion Public "Regi
5dc0: 73 74 72 79 22 20 4d 65 74 68 6f 64 73 0d 0a 20  stry" Methods.. 
5dd0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
5de0: 63 20 6f 62 6a 65 63 74 20 47 65 74 56 61 6c 75  c object GetValu
5df0: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
5e00: 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61      string keyNa
5e10: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
5e20: 20 20 20 20 20 73 74 72 69 6e 67 20 76 61 6c 75       string valu
5e30: 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  eName,..        
5e40: 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 64          object d
5e50: 65 66 61 75 6c 74 56 61 6c 75 65 0d 0a 20 20 20  efaultValue..   
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
5e90: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
5ea0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
5eb0: 20 20 20 72 65 74 75 72 6e 20 52 65 67 69 73 74     return Regist
5ec0: 72 79 2e 47 65 74 56 61 6c 75 65 28 6b 65 79 4e  ry.GetValue(keyN
5ed0: 61 6d 65 2c 20 76 61 6c 75 65 4e 61 6d 65 2c 20  ame, valueName, 
5ee0: 64 65 66 61 75 6c 74 56 61 6c 75 65 29 3b 0d 0a  defaultValue);..
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
5f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
5f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f50: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5f60: 70 75 62 6c 69 63 20 76 6f 69 64 20 53 65 74 56  public void SetV
5f70: 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20  alue(..         
5f80: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
5f90: 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
5fa0: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 76          string v
5fb0: 61 6c 75 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  alueName,..     
5fc0: 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
5fd0: 74 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20 20  t value..       
5fe0: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
5ff0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
6000: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
6010: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
6030: 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d  ckReadOnly();...
6040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6050: 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20   if (!whatIf).. 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 52 65 67 69 73 74 72 79 2e 53 65 74 56     Registry.SetV
6080: 61 6c 75 65 28 6b 65 79 4e 61 6d 65 2c 20 76 61  alue(keyName, va
6090: 6c 75 65 4e 61 6d 65 2c 20 76 61 6c 75 65 29 3b  lueName, value);
60a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
60b0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
60c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6100: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
6110: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 53 65    public void Se
6120: 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20  tValue(..       
6130: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
6140: 6b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  keyName,..      
6150: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
6160: 20 76 61 6c 75 65 4e 61 6d 65 2c 0d 0a 20 20 20   valueName,..   
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
6180: 65 63 74 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20  ect value,..    
6190: 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
61a0: 73 74 72 79 56 61 6c 75 65 4b 69 6e 64 20 76 61  stryValueKind va
61b0: 6c 75 65 4b 69 6e 64 0d 0a 20 20 20 20 20 20 20  lueKind..       
61c0: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
61d0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
61e0: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
61f0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
6210: 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d  ckReadOnly();...
6220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6230: 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20   if (!whatIf).. 
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 52 65 67 69 73 74 72 79 2e 53 65 74 56     Registry.SetV
6260: 61 6c 75 65 28 6b 65 79 4e 61 6d 65 2c 20 76 61  alue(keyName, va
6270: 6c 75 65 4e 61 6d 65 2c 20 76 61 6c 75 65 2c 20  lueName, value, 
6280: 76 61 6c 75 65 4b 69 6e 64 29 3b 0d 0a 20 20 20  valueKind);..   
6290: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
62a0: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
62b0: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
62c0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
62d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
62e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
62f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6300: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
6310: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69       #region Pri
6320: 76 61 74 65 20 4d 65 74 68 6f 64 73 0d 0a 20 20  vate Methods..  
6330: 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
6340: 65 20 76 6f 69 64 20 43 68 65 63 6b 52 65 61 64  e void CheckRead
6350: 4f 6e 6c 79 28 29 0d 0a 20 20 20 20 20 20 20 20  Only()..        
6360: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6370: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
6380: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
6390: 54 45 3a 20 49 6e 20 22 72 65 61 64 2d 6f 6e 6c  TE: In "read-onl
63a0: 79 22 20 6d 6f 64 65 2c 20 77 65 20 64 69 73 61  y" mode, we disa
63b0: 6c 6c 6f 77 20 61 6c 6c 20 77 72 69 74 65 20 61  llow all write a
63c0: 63 63 65 73 73 2e 0d 0a 20 20 20 20 20 20 20 20  ccess...        
63d0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
63f0: 21 72 65 61 64 4f 6e 6c 79 29 0d 0a 20 20 20 20  !readOnly)..    
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
6420: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
6430: 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70 65 72   new InvalidOper
6440: 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28 29  ationException()
6450: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
6460: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
6470: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
6480: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
6490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
64d0: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
64e0: 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22  on IDisposable "
64f0: 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73  Pattern" Members
6500: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
6510: 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f  ivate bool dispo
6520: 73 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  sed;..          
6530: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43    private void C
6540: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f  heckDisposed() /
6550: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
6560: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
6570: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
6580: 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20  disposed)..     
6590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
65a0: 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  eturn;....      
65b0: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
65c0: 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70 6f 73  new ObjectDispos
65d0: 65 64 45 78 63 65 70 74 69 6f 6e 28 0d 0a 20 20  edException(..  
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 74 79 70 65 6f 66 28 4d 6f 63 6b 52 65 67    typeof(MockReg
6600: 69 73 74 72 79 29 2e 4e 61 6d 65 29 3b 0d 0a 20  istry).Name);.. 
6610: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
6620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
6630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
6670: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
6680: 72 69 76 61 74 65 20 2f 2a 20 70 72 6f 74 65 63  rivate /* protec
6690: 74 65 64 20 76 69 72 74 75 61 6c 20 2a 2f 20 76  ted virtual */ v
66a0: 6f 69 64 20 44 69 73 70 6f 73 65 28 0d 0a 20 20  oid Dispose(..  
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
66c0: 6f 6c 20 64 69 73 70 6f 73 69 6e 67 0d 0a 20 20  ol disposing..  
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
66e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 69 66 20 28 21 64 69 73 70 6f 73 65 64 29 0d 0a  if (!disposed)..
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
6730: 20 20 20 20 20 20 20 69 66 20 28 64 69 73 70 6f         if (dispo
6740: 73 69 6e 67 29 0d 0a 20 20 20 20 20 20 20 20 20  sing)..         
6750: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
6780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20  //////////..    
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d      // dispose m
67c0: 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65 73  anaged resources
67d0: 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20   here.....      
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
6800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6810: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 69 66 20 28 63 6c 61 73 73 65 73 52 6f 6f    if (classesRoo
6840: 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  t != null)..    
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6880: 20 20 20 63 6c 61 73 73 65 73 52 6f 6f 74 2e 43     classesRoot.C
6890: 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  lose();..       
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68b0: 20 20 20 20 20 63 6c 61 73 73 65 73 52 6f 6f 74       classesRoot
68c0: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6900: 66 20 28 63 75 72 72 65 6e 74 43 6f 6e 66 69 67  f (currentConfig
6910: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 63 75 72 72 65 6e 74 43 6f 6e 66 69 67 2e    currentConfig.
6960: 43 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20  Close();..      
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6980: 20 20 20 20 20 20 63 75 72 72 65 6e 74 43 6f 6e        currentCon
6990: 66 69 67 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20  fig = null;..   
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69d0: 20 20 69 66 20 28 63 75 72 72 65 6e 74 55 73 65    if (currentUse
69e0: 72 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  r != null)..    
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 20 20 63 75 72 72 65 6e 74 55 73 65 72 2e 43     currentUser.C
6a30: 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  lose();..       
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 20 20 20 20 63 75 72 72 65 6e 74 55 73 65 72       currentUser
6a60: 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20   = null;..      
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6aa0: 66 20 28 64 79 6e 44 61 74 61 20 21 3d 20 6e 75  f (dynData != nu
6ab0: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 64 79 6e 44              dynD
6af0: 61 74 61 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20 20  ata.Close();..  
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 20 20 20 20 20 20 20 20 64 79 6e 44 61 74            dynDat
6b20: 61 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  a = null;..     
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 69 66 20 28 6c 6f 63 61 6c 4d 61 63 68 69 6e 65  if (localMachine
6b70: 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bb0: 20 20 6c 6f 63 61 6c 4d 61 63 68 69 6e 65 2e 43    localMachine.C
6bc0: 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20  lose();..       
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 20 20 20 20 20 6c 6f 63 61 6c 4d 61 63 68 69 6e       localMachin
6bf0: 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  e = null;..     
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 69 66 20 28 70 65 72 66 6f 72 6d 61 6e 63 65 44  if (performanceD
6c40: 61 74 61 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ata != null)..  
6c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c60: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 20 70 65 72 66 6f 72 6d 61 6e 63 65       performance
6c90: 44 61 74 61 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20  Data.Close();.. 
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 70 65 72 66 6f             perfo
6cc0: 72 6d 61 6e 63 65 44 61 74 61 20 3d 20 6e 75 6c  rmanceData = nul
6cd0: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
6cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d00: 20 20 20 20 20 20 20 20 20 69 66 20 28 75 73 65           if (use
6d10: 72 73 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  rs != null)..   
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 75 73 65 72 73 2e 43 6c 6f 73 65 28      users.Close(
6d60: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 75 73 65 72 73 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  users = null;.. 
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
6dc0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6dd0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
6de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20  /////////////.. 
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20 75 6e     // release un
6e20: 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63 65  managed resource
6e30: 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20  s here.....     
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e70: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
6e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ea0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54 68       // NOTE: Th
6eb0: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6e 6f 77  is object is now
6ec0: 20 64 69 73 70 6f 73 65 64 2e 0d 0a 20 20 20 20   disposed...    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
6ef0: 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 65 64          disposed
6f00: 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
6f10: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
6f20: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6f30: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
6f40: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
6f50: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
6f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f90: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
6fa0: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49 44 69       #region IDi
6fb0: 73 70 6f 73 61 62 6c 65 20 4d 65 6d 62 65 72 73  sposable Members
6fc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
6fd0: 62 6c 69 63 20 76 6f 69 64 20 44 69 73 70 6f 73  blic void Dispos
6fe0: 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e()..           
6ff0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7000: 20 20 20 20 44 69 73 70 6f 73 65 28 74 72 75 65      Dispose(true
7010: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
7020: 20 20 20 20 47 43 2e 53 75 70 70 72 65 73 73 46      GC.SuppressF
7030: 69 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b 0d 0a  inalize(this);..
7040: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
7050: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
7060: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
7070: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
7080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
70a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
70b0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
70c0: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
70d0: 44 65 73 74 72 75 63 74 6f 72 0d 0a 20 20 20 20  Destructor..    
70e0: 20 20 20 20 20 20 20 20 7e 4d 6f 63 6b 52 65 67          ~MockReg
70f0: 69 73 74 72 79 28 29 0d 0a 20 20 20 20 20 20 20  istry()..       
7100: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7110: 20 20 20 20 20 20 20 20 44 69 73 70 6f 73 65 28          Dispose(
7120: 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20 20 20 20  false);..       
7130: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
7140: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
7150: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7160: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
7170: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
7180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
71a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
71b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
71c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
71d0: 69 6f 6e 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  ion MockRegistry
71e0: 4b 65 79 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  Key Class..     
71f0: 20 20 20 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c     internal seal
7200: 65 64 20 63 6c 61 73 73 20 4d 6f 63 6b 52 65 67  ed class MockReg
7210: 69 73 74 72 79 4b 65 79 20 3a 20 49 44 69 73 70  istryKey : IDisp
7220: 6f 73 61 62 6c 65 0d 0a 20 20 20 20 20 20 20 20  osable..        
7230: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
7240: 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20 43  region Private C
7250: 6f 6e 73 74 72 75 63 74 6f 72 73 0d 0a 20 20 20  onstructors..   
7260: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
7270: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
7280: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
7290: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
72a0: 20 20 20 77 68 61 74 49 66 20 3d 20 74 72 75 65     whatIf = true
72b0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
72c0: 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 74 72     readOnly = tr
72d0: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
72e0: 20 20 20 20 20 73 61 66 65 20 3d 20 74 72 75 65       safe = true
72f0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
7300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
7310: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
7320: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
7330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
7370: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
7380: 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e 73 74 72  on Public Constr
7390: 75 63 74 6f 72 73 0d 0a 20 20 20 20 20 20 20 20  uctors..        
73a0: 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52      public MockR
73b0: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
73d0: 69 73 74 72 79 4b 65 79 20 6b 65 79 0d 0a 20 20  istryKey key..  
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
73f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7400: 20 3a 20 74 68 69 73 28 29 0d 0a 20 20 20 20 20   : this()..     
7410: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7420: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6b            this.k
7430: 65 79 20 3d 20 6b 65 79 3b 0d 0a 20 20 20 20 20  ey = key;..     
7440: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7450: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
7460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
74a0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
74b0: 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  c MockRegistryKe
74c0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
74d0: 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
74e0: 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  key,..          
74f0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62        string sub
7500: 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  KeyName..       
7510: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74 68              : th
7530: 69 73 28 6b 65 79 29 0d 0a 20 20 20 20 20 20 20  is(key)..       
7540: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
7550: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 75 62          this.sub
7560: 4b 65 79 4e 61 6d 65 20 3d 20 73 75 62 4b 65 79  KeyName = subKey
7570: 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  Name;..         
7580: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7590: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
75a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75d0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
75e0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f         public Mo
75f0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c  RegistryKey key,
7620: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7630: 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e    string subKeyN
7640: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
7650: 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
7660: 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f..             
7670: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
7680: 20 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65 79        : this(key
7690: 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29 0d 0a 20  , subKeyName).. 
76a0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
76c0: 69 73 2e 77 68 61 74 49 66 20 3d 20 77 68 61 74  is.whatIf = what
76d0: 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If;..           
76e0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
76f0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
7700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7730: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
7740: 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b       public Mock
7750: 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20  RegistryKey(..  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
7770: 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a  gistryKey key,..
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d  string subKeyNam
77a0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
77b0: 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
77c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
77d0: 20 20 62 6f 6f 6c 20 72 65 61 64 4f 6e 6c 79 0d    bool readOnly.
77e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
77f0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
7800: 20 20 20 20 3a 20 74 68 69 73 28 6b 65 79 2c 20      : this(key, 
7810: 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77 68 61 74  subKeyName, what
7820: 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If)..           
7830: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
7840: 20 20 20 20 74 68 69 73 2e 72 65 61 64 4f 6e 6c      this.readOnl
7850: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0d 0a 20  y = readOnly;.. 
7860: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
7870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
7880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
78c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
78d0: 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74  ublic MockRegist
78e0: 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ryKey(..        
78f0: 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
7900: 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20  Key key,..      
7910: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
7920: 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20   subKeyName,..  
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
7940: 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
7950: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
7960: 20 72 65 61 64 4f 6e 6c 79 2c 0d 0a 20 20 20 20   readOnly,..    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
7980: 20 73 61 66 65 0d 0a 20 20 20 20 20 20 20 20 20   safe..         
7990: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
79a0: 20 20 20 20 20 20 20 20 20 20 3a 20 74 68 69 73            : this
79b0: 28 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65  (key, subKeyName
79c0: 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f 6e  , whatIf, readOn
79d0: 6c 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly)..           
79e0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
79f0: 20 20 20 20 74 68 69 73 2e 73 61 66 65 20 3d 20      this.safe = 
7a00: 73 61 66 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  safe;..         
7a10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
7a20: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
7a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a60: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
7a70: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f         public Mo
7a80: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a  ckRegistryKey(..
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c  RegistryKey key,
7ab0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7ac0: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 0d 0a 20    bool whatIf.. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
7ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7af0: 20 20 3a 20 74 68 69 73 28 6b 65 79 2c 20 6e 75    : this(key, nu
7b00: 6c 6c 2c 20 77 68 61 74 49 66 29 0d 0a 20 20 20  ll, whatIf)..   
7b10: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
7b30: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
7b40: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
7b50: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
7b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
7bb0: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ic MockRegistryK
7bc0: 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
7bd0: 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79       RegistryKey
7be0: 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20   key,..         
7bf0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
7c00: 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
7c10: 20 20 20 20 20 62 6f 6f 6c 20 72 65 61 64 4f 6e       bool readOn
7c20: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
7c30: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
7c40: 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65         : this(ke
7c50: 79 2c 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c  y, null, whatIf,
7c60: 20 72 65 61 64 4f 6e 6c 79 29 0d 0a 20 20 20 20   readOnly)..    
7c70: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f             // do
7c90: 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20   nothing...     
7ca0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
7cb0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
7cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
7d00: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
7d10: 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  c MockRegistryKe
7d20: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
7d30: 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
7d40: 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  key,..          
7d50: 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
7d60: 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
7d70: 20 20 20 20 62 6f 6f 6c 20 72 65 61 64 4f 6e 6c      bool readOnl
7d80: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
7d90: 20 20 20 20 62 6f 6f 6c 20 73 61 66 65 0d 0a 20      bool safe.. 
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
7db0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7dc0: 20 20 3a 20 74 68 69 73 28 6b 65 79 2c 20 6e 75    : this(key, nu
7dd0: 6c 6c 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64  ll, whatIf, read
7de0: 4f 6e 6c 79 2c 20 73 61 66 65 29 0d 0a 20 20 20  Only, safe)..   
7df0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64              // d
7e10: 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20  o nothing...    
7e20: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
7e30: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
7e40: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n....           
7e50: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7e90: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
7ea0: 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c      #region Publ
7eb0: 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  ic Methods..    
7ec0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76          public v
7ed0: 6f 69 64 20 43 6c 6f 73 65 28 29 0d 0a 20 20 20  oid Close()..   
7ee0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 2f 2f 20 4e 4f 54 45 3a 20 4e 6f 20 64 69 73 70  // NOTE: No disp
7f20: 6f 73 65 64 20 63 68 65 63 6b 20 68 65 72 65 20  osed check here 
7f30: 62 65 63 61 75 73 65 20 63 61 6c 6c 69 6e 67 20  because calling 
7f40: 74 68 69 73 20 6d 65 74 68 6f 64 0d 0a 20 20 20  this method..   
7f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
7f60: 20 20 20 20 20 20 73 68 6f 75 6c 64 20 62 65 20        should be 
7f70: 6a 75 73 74 20 6c 69 6b 65 20 63 61 6c 6c 69 6e  just like callin
7f80: 67 20 44 69 73 70 6f 73 65 2e 0d 0a 20 20 20 20  g Dispose...    
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 44 69 73 70 6f 73 65 28 74 72 75 65 29 3b 0d 0a  Dispose(true);..
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
7fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
7fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8020: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
8030: 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73  public MockRegis
8040: 74 72 79 4b 65 79 20 43 72 65 61 74 65 53 75 62  tryKey CreateSub
8050: 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
8060: 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62        string sub
8070: 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  KeyName..       
8080: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
8090: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
80a0: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
80b0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20 20  Disposed();..   
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65               Che
80d0: 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d  ckReadOnly();...
80e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
80f0: 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c   if (key == null
8100: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8110: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75         return nu
8120: 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ll;....         
8130: 20 20 20 20 20 20 20 69 66 20 28 77 68 61 74 49         if (whatI
8140: 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f)..            
8150: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
8160: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 2f 2f 20 48 41 43 4b 3a 20 41 74 74 65     // HACK: Atte
8190: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
81a0: 73 70 65 63 69 66 69 65 64 20 73 75 62 2d 6b 65  specified sub-ke
81b0: 79 2e 20 20 49 66 20 74 68 69 73 0d 0a 20 20 20  y.  If this..   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 2f 2f 20 20 20 20 20 20 20 66 61 69 6c 73 2c   //       fails,
81e0: 20 77 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20   we will simply 
81f0: 72 65 74 75 72 6e 20 74 68 65 20 77 72 61 70 70  return the wrapp
8200: 65 64 20 72 6f 6f 74 20 6b 65 79 0d 0a 20 20 20  ed root key..   
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 2f 2f 20 20 20 20 20 20 20 69 74 73 65 6c 66   //       itself
8230: 20 73 69 6e 63 65 20 6e 6f 20 77 72 69 74 65 73   since no writes
8240: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 69 6e 20   are allowed in 
8250: 27 77 68 61 74 2d 69 66 27 0d 0a 20 20 20 20 20  'what-if'..     
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8270: 2f 20 20 20 20 20 20 20 6d 6f 64 65 20 61 6e 79  /       mode any
8280: 68 6f 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  how...          
8290: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82b0: 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 73 75    RegistryKey su
82c0: 62 4b 65 79 20 3d 20 6b 65 79 2e 4f 70 65 6e 53  bKey = key.OpenS
82d0: 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d 65  ubKey(subKeyName
82e0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
82f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8300: 20 28 73 75 62 4b 65 79 20 21 3d 20 6e 75 6c 6c   (subKey != null
8310: 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ) ?..           
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
8330: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
8340: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 73 75 62 4b 65 79 2c 20 77 68 61 74 49     subKey, whatI
8370: 66 2c 20 72 65 61 64 4f 6e 6c 79 2c 20 73 61 66  f, readOnly, saf
8380: 65 29 20 3a 0d 0a 20 20 20 20 20 20 20 20 20 20  e) :..          
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
83a0: 77 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65  w MockRegistryKe
83b0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e      key, subKeyN
83e0: 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 72 65 61  ame, whatIf, rea
83f0: 64 4f 6e 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 20  dOnly, safe);.. 
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
8410: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8420: 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
8430: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8450: 65 74 75 72 6e 20 6e 65 77 20 4d 6f 63 6b 52 65  eturn new MockRe
8460: 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20  gistryKey(..    
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 6b 65 79 2e 43 72 65 61 74 65 53 75      key.CreateSu
8490: 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d 65 29  bKey(subKeyName)
84a0: 2c 20 77 68 61 74 49 66 2c 20 72 65 61 64 4f 6e  , whatIf, readOn
84b0: 6c 79 2c 20 73 61 66 65 29 3b 0d 0a 20 20 20 20  ly, safe);..    
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
84d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
84f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
8530: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
8540: 75 62 6c 69 63 20 76 6f 69 64 20 44 65 6c 65 74  ublic void Delet
8550: 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20  eSubKey(..      
8560: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
8570: 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20   subKeyName,..  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
8590: 6f 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e  ol throwOnMissin
85a0: 67 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g..             
85b0: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
85c0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
85d0: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
85e0: 65 64 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ed();..         
85f0: 20 20 20 20 20 20 20 43 68 65 63 6b 52 65 61 64         CheckRead
8600: 4f 6e 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Only();....     
8610: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b             if (k
8620: 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
8650: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
8660: 21 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20  !whatIf)..      
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
8680: 79 2e 44 65 6c 65 74 65 53 75 62 4b 65 79 28 73  y.DeleteSubKey(s
8690: 75 62 4b 65 79 4e 61 6d 65 2c 20 74 68 72 6f 77  ubKeyName, throw
86a0: 4f 6e 4d 69 73 73 69 6e 67 29 3b 0d 0a 20 20 20  OnMissing);..   
86b0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
86c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
86d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
8710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
8720: 6c 69 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53  lic void DeleteS
8730: 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20  ubKeyTree(..    
8740: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
8750: 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20  ng subKeyName.. 
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
8770: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
8780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8790: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
87a0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
87b0: 20 20 20 43 68 65 63 6b 52 65 61 64 4f 6e 6c 79     CheckReadOnly
87c0: 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
87d0: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
87e0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
8800: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
8810: 20 20 20 20 20 20 20 20 69 66 20 28 21 77 68 61          if (!wha
8820: 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf)..          
8830: 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 44 65            key.De
8840: 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65 28 73  leteSubKeyTree(s
8850: 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 20 20 20  ubKeyName);..   
8860: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
8870: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
8880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
88a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
88b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
88c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
88d0: 6c 69 63 20 76 6f 69 64 20 44 65 6c 65 74 65 56  lic void DeleteV
88e0: 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20  alue(..         
88f0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61         string na
8900: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
8910: 20 20 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f       bool throwO
8920: 6e 4d 69 73 73 69 6e 67 0d 0a 20 20 20 20 20 20  nMissing..      
8930: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
8940: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
8950: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
8960: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20  kDisposed();..  
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
8980: 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a  eckReadOnly();..
8990: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
89a0: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
89b0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
89c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
89d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
89e0: 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d     if (!whatIf).
89f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8a00: 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74 65 56       key.DeleteV
8a10: 61 6c 75 65 28 6e 61 6d 65 2c 20 74 68 72 6f 77  alue(name, throw
8a20: 4f 6e 4d 69 73 73 69 6e 67 29 3b 0d 0a 20 20 20  OnMissing);..   
8a30: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
8a40: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
8a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
8a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
8aa0: 6c 69 63 20 73 74 72 69 6e 67 5b 5d 20 47 65 74  lic string[] Get
8ab0: 53 75 62 4b 65 79 4e 61 6d 65 73 28 29 0d 0a 20  SubKeyNames().. 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
8ae0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
8af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8b00: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
8b10: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
8b20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
8b30: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
8b40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6b          return k
8b50: 65 79 2e 47 65 74 53 75 62 4b 65 79 4e 61 6d 65  ey.GetSubKeyName
8b60: 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  s();..          
8b70: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
8b80: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
8b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8bc0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
8bd0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 62 6a        public obj
8be0: 65 63 74 20 47 65 74 56 61 6c 75 65 28 0d 0a 20  ect GetValue(.. 
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
8c00: 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20  tring name,..   
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
8c20: 65 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75 65  ect defaultValue
8c30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8c40: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
8c50: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
8c60: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
8c70: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d();....        
8c80: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
8c90: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8cb0: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
8cd0: 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c 75  turn key.GetValu
8ce0: 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74 56  e(name, defaultV
8cf0: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
8d00: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
8d10: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
8d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d50: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
8d60: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d          public M
8d70: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 4f  ockRegistryKey O
8d80: 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
8da0: 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20  ng subKeyName.. 
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
8dc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
8dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8de0: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
8df0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
8e00: 20 20 20 20 20 72 65 74 75 72 6e 20 4f 70 65 6e       return Open
8e10: 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d  SubKey(subKeyNam
8e20: 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  e, false);..    
8e30: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
8e40: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
8e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
8ea0: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ic MockRegistryK
8eb0: 65 79 20 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  ey OpenSubKey(..
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d  string subKeyNam
8ee0: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
8ef0: 20 20 20 20 62 6f 6f 6c 20 77 72 69 74 61 62 6c      bool writabl
8f00: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
8f10: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
8f20: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
8f30: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
8f40: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
8f50: 20 20 20 20 20 20 20 20 20 69 66 20 28 77 72 69           if (wri
8f60: 74 61 62 6c 65 29 0d 0a 20 20 20 20 20 20 20 20  table)..        
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
8f80: 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a 0d 0a  kReadOnly();....
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
8fb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8fc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
8fd0: 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  l;....          
8fe0: 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65        RegistryKe
8ff0: 79 20 73 75 62 4b 65 79 20 3d 20 6b 65 79 2e 4f  y subKey = key.O
9000: 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77 68 61 74  subKeyName, what
9030: 49 66 20 3f 20 66 61 6c 73 65 20 3a 20 77 72 69  If ? false : wri
9040: 74 61 62 6c 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  table);....     
9050: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9060: 6e 20 28 73 75 62 4b 65 79 20 21 3d 20 6e 75 6c  n (subKey != nul
9070: 6c 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20 20  l) ?..          
9080: 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4d 6f            new Mo
9090: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 73 75  ckRegistryKey(su
90a0: 62 4b 65 79 2c 20 77 68 61 74 49 66 2c 20 72 65  bKey, whatIf, re
90b0: 61 64 4f 6e 6c 79 2c 20 73 61 66 65 29 20 3a 20  adOnly, safe) : 
90c0: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
90d0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
90e0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
90f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9120: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
9130: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
9140: 69 64 20 53 65 74 56 61 6c 75 65 28 0d 0a 20 20  id SetValue(..  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
9160: 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20  ring name,..    
9170: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
9180: 63 74 20 76 61 6c 75 65 0d 0a 20 20 20 20 20 20  ct value..      
9190: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
91a0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63              Chec
91c0: 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 20 20  kDisposed();..  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
91e0: 65 63 6b 52 65 61 64 4f 6e 6c 79 28 29 3b 0d 0a  eckReadOnly();..
91f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9200: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
9210: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
9220: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
9230: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
9240: 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d     if (!whatIf).
9250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9260: 20 20 20 20 20 6b 65 79 2e 53 65 74 56 61 6c 75       key.SetValu
9270: 65 28 6e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0d  e(name, value);.
9280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
9290: 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
92a0: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
92b0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
92c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
92d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
92e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
92f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
9300: 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e           #region
9310: 20 50 75 62 6c 69 63 20 50 72 6f 70 65 72 74 69   Public Properti
9320: 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
9330: 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 4e 61  public string Na
9340: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
9350: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9360: 20 20 20 67 65 74 0d 0a 20 20 20 20 20 20 20 20     get..        
9370: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
9390: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
93a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
93b0: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
93c0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
93d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93e0: 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d   return null;...
93f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9400: 20 20 20 20 20 72 65 74 75 72 6e 20 21 53 74 72       return !Str
9410: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
9420: 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 20 3f 0d  y(subKeyName) ?.
9430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9440: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e           String.
9450: 46 6f 72 6d 61 74 28 22 7b 30 7d 5c 5c 7b 31 7d  Format("{0}\\{1}
9460: 22 2c 20 6b 65 79 2e 4e 61 6d 65 2c 20 73 75 62  ", key.Name, sub
9470: 4b 65 79 4e 61 6d 65 29 20 3a 0d 0a 20 20 20 20  KeyName) :..    
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9490: 20 20 20 20 6b 65 79 2e 4e 61 6d 65 3b 0d 0a 20      key.Name;.. 
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
94b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
94c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
94d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9510: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
9520: 20 20 70 72 69 76 61 74 65 20 52 65 67 69 73 74    private Regist
9530: 72 79 4b 65 79 20 6b 65 79 3b 0d 0a 20 20 20 20  ryKey key;..    
9540: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 52          public R
9550: 65 67 69 73 74 72 79 4b 65 79 20 4b 65 79 0d 0a  egistryKey Key..
9560: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
9580: 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73  et { CheckDispos
9590: 65 64 28 29 3b 20 43 68 65 63 6b 53 61 66 65 28  ed(); CheckSafe(
95a0: 29 3b 20 72 65 74 75 72 6e 20 6b 65 79 3b 20 7d  ); return key; }
95b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
95c0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
95d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9610: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
9620: 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
9630: 20 73 75 62 4b 65 79 4e 61 6d 65 3b 0d 0a 20 20   subKeyName;..  
9640: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
9650: 20 73 74 72 69 6e 67 20 53 75 62 4b 65 79 4e 61   string SubKeyNa
9660: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
9670: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9680: 20 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44 69     get { CheckDi
9690: 73 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72 6e  sposed(); return
96a0: 20 73 75 62 4b 65 79 4e 61 6d 65 3b 20 7d 0d 0a   subKeyName; }..
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
96c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
96d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9710: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9720: 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 77 68 61  private bool wha
9730: 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf;..          
9740: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 57 68    public bool Wh
9750: 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20 20  atIf..          
9760: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
9770: 20 20 20 20 20 67 65 74 20 7b 20 43 68 65 63 6b       get { Check
9780: 44 69 73 70 6f 73 65 64 28 29 3b 20 72 65 74 75  Disposed(); retu
9790: 72 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a 20 20  rn whatIf; }..  
97a0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
97b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
97c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
97f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
9800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
9810: 69 76 61 74 65 20 62 6f 6f 6c 20 72 65 61 64 4f  ivate bool readO
9820: 6e 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nly;..          
9830: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 52 65    public bool Re
9840: 61 64 4f 6e 6c 79 0d 0a 20 20 20 20 20 20 20 20  adOnly..        
9850: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
9860: 20 20 20 20 20 20 20 67 65 74 20 7b 20 43 68 65         get { Che
9870: 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72 65  ckDisposed(); re
9880: 74 75 72 6e 20 72 65 61 64 4f 6e 6c 79 3b 20 7d  turn readOnly; }
9890: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
98a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
98b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
98c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
98d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
98e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
98f0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
9900: 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 73 61    public bool sa
9910: 66 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  fe;..           
9920: 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 53 61 66   public bool Saf
9930: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
9940: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9950: 20 20 67 65 74 20 7b 20 43 68 65 63 6b 44 69 73    get { CheckDis
9960: 70 6f 73 65 64 28 29 3b 20 72 65 74 75 72 6e 20  posed(); return 
9970: 73 61 66 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  safe; }..       
9980: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
9990: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
99a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
99b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99f0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
9a00: 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65   #region Private
9a10: 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20   Methods..      
9a20: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 76 6f        private vo
9a30: 69 64 20 43 68 65 63 6b 52 65 61 64 4f 6e 6c 79  id CheckReadOnly
9a40: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
9a50: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9a60: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
9a70: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
9a80: 49 6e 20 22 72 65 61 64 2d 6f 6e 6c 79 22 20 6d  In "read-only" m
9a90: 6f 64 65 2c 20 77 65 20 64 69 73 61 6c 6c 6f 77  ode, we disallow
9aa0: 20 61 6c 6c 20 77 72 69 74 65 20 61 63 63 65 73   all write acces
9ab0: 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s...            
9ac0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
9ad0: 20 20 20 20 20 20 20 20 69 66 20 28 21 72 65 61          if (!rea
9ae0: 64 4f 6e 6c 79 29 0d 0a 20 20 20 20 20 20 20 20  dOnly)..        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
9b00: 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  rn;....         
9b10: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
9b20: 20 49 6e 76 61 6c 69 64 4f 70 65 72 61 74 69 6f   InvalidOperatio
9b30: 6e 45 78 63 65 70 74 69 6f 6e 28 29 3b 0d 0a 20  nException();.. 
9b40: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
9b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
9ba0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
9bb0: 72 69 76 61 74 65 20 76 6f 69 64 20 43 68 65 63  rivate void Chec
9bc0: 6b 53 61 66 65 28 29 0d 0a 20 20 20 20 20 20 20  kSafe()..       
9bd0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9be0: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
9c00: 4f 54 45 3a 20 49 6e 20 22 73 61 66 65 22 20 6d  OTE: In "safe" m
9c10: 6f 64 65 2c 20 77 65 20 64 69 73 61 6c 6c 6f 77  ode, we disallow
9c20: 20 61 6c 6c 20 64 69 72 65 63 74 20 61 63 63 65   all direct acce
9c30: 73 73 20 74 6f 20 74 68 65 0d 0a 20 20 20 20 20  ss to the..     
9c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
9c50: 20 20 20 20 63 6f 6e 74 61 69 6e 65 64 20 72 65      contained re
9c60: 67 69 73 74 72 79 20 6b 65 79 2e 0d 0a 20 20 20  gistry key...   
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
9c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9c90: 20 69 66 20 28 21 73 61 66 65 29 0d 0a 20 20 20   if (!safe)..   
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
9cd0: 77 20 6e 65 77 20 49 6e 76 61 6c 69 64 4f 70 65  w new InvalidOpe
9ce0: 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e 28  rationException(
9cf0: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
9d00: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
9d10: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
9d20: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
9d30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
9d80: 69 6f 6e 20 53 79 73 74 65 6d 2e 4f 62 6a 65 63  ion System.Objec
9d90: 74 20 4f 76 65 72 72 69 64 65 73 0d 0a 20 20 20  t Overrides..   
9da0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
9db0: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
9dc0: 54 6f 53 74 72 69 6e 67 28 29 0d 0a 20 20 20 20  ToString()..    
9dd0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
9de0: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
9df0: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20  Disposed();.... 
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9e10: 65 74 75 72 6e 20 74 68 69 73 2e 4e 61 6d 65 3b  eturn this.Name;
9e20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
9e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
9e40: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
9e50: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
9e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
9ea0: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
9eb0: 6e 20 49 6d 70 6c 69 63 69 74 20 43 6f 6e 76 65  n Implicit Conve
9ec0: 72 73 69 6f 6e 20 4f 70 65 72 61 74 6f 72 73 0d  rsion Operators.
9ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d  .            //.
9ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
9ef0: 42 55 47 42 55 47 3a 20 52 65 6d 6f 76 65 20 6d  BUGBUG: Remove m
9f00: 65 3f 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e?  This should 
9f10: 62 65 20 73 61 66 65 20 62 65 63 61 75 73 65 20  be safe because 
9f20: 69 6e 20 27 77 68 61 74 2d 69 66 27 0d 0a 20 20  in 'what-if'..  
9f30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
9f40: 20 20 20 20 20 6d 6f 64 65 20 61 6c 6c 20 6b 65       mode all ke
9f50: 79 73 20 61 72 65 20 6f 70 65 6e 65 64 20 72 65  ys are opened re
9f60: 61 64 2d 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20 20  ad-only...      
9f70: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
9f80: 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61        public sta
9f90: 74 69 63 20 69 6d 70 6c 69 63 69 74 20 6f 70 65  tic implicit ope
9fa0: 72 61 74 6f 72 20 52 65 67 69 73 74 72 79 4b 65  rator RegistryKe
9fb0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
9fc0: 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
9fd0: 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20 20 20  Key key..       
9fe0: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
9ff0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
a000: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
a010: 6e 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29 20  n (key != null) 
a020: 3f 20 6b 65 79 2e 4b 65 79 20 3a 20 6e 75 6c 6c  ? key.Key : null
a030: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
a040: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
a050: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
a060: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
a070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a0a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
a0b0: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
a0c0: 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 22  on IDisposable "
a0d0: 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72 73  Pattern" Members
a0e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
a0f0: 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 70 6f  ivate bool dispo
a100: 73 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  sed;..          
a110: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 43    private void C
a120: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20 2f  heckDisposed() /
a130: 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
a140: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
a150: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
a160: 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20 20  disposed)..     
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a180: 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  eturn;....      
a190: 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
a1a0: 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70 6f 73  new ObjectDispos
a1b0: 65 64 45 78 63 65 70 74 69 6f 6e 28 0d 0a 20 20  edException(..  
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 74 79 70 65 6f 66 28 4d 6f 63 6b 52 65 67    typeof(MockReg
a1e0: 69 73 74 72 79 4b 65 79 29 2e 4e 61 6d 65 29 3b  istryKey).Name);
a1f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
a200: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
a210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a250: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
a260: 20 20 70 72 69 76 61 74 65 20 2f 2a 20 70 72 6f    private /* pro
a270: 74 65 63 74 65 64 20 76 69 72 74 75 61 6c 20 2a  tected virtual *
a280: 2f 20 76 6f 69 64 20 44 69 73 70 6f 73 65 28 0d  / void Dispose(.
a290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2a0: 20 62 6f 6f 6c 20 64 69 73 70 6f 73 69 6e 67 0d   bool disposing.
a2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a2c0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
a2d0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
a2e0: 20 20 20 69 66 20 28 21 64 69 73 70 6f 73 65 64     if (!disposed
a2f0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
a300: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
a310: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 69            if (di
a320: 73 70 6f 73 69 6e 67 29 0d 0a 20 20 20 20 20 20  sposing)..      
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
a340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a350: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
a360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20  /////////////.. 
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 20 20 20 2f 2f 20 64 69 73 70 6f 73         // dispos
a3a0: 65 20 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72  e managed resour
a3b0: 63 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20  ces here.....   
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
a3e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a3f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 69 66 20 28 6b 65 79 20 21 3d 20       if (key != 
a420: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a440: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
a460: 79 2e 43 6c 6f 73 65 28 29 3b 0d 0a 20 20 20 20  y.Close();..    
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 20 20 20 20 20 20 20 6b 65 79 20 3d 20 6e 75          key = nu
a490: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f               ///
a4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a500: 2f 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ///..           
a510: 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65 6c 65           // rele
a520: 61 73 65 20 75 6e 6d 61 6e 61 67 65 64 20 72 65  ase unmanaged re
a530: 73 6f 75 72 63 65 73 20 68 65 72 65 2e 2e 2e 0d  sources here....
a540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a550: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
a560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a590: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
a5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
a5b0: 54 45 3a 20 54 68 69 73 20 6f 62 6a 65 63 74 20  TE: This object 
a5c0: 69 73 20 6e 6f 77 20 64 69 73 70 6f 73 65 64 2e  is now disposed.
a5d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a5e0: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
a600: 73 70 6f 73 65 64 20 3d 20 74 72 75 65 3b 0d 0a  sposed = true;..
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
a630: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
a640: 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20  ndregion....    
a650: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
a660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
a6a0: 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69             #regi
a6b0: 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20 4d  on IDisposable M
a6c0: 65 6d 62 65 72 73 0d 0a 20 20 20 20 20 20 20 20  embers..        
a6d0: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
a6e0: 44 69 73 70 6f 73 65 28 29 0d 0a 20 20 20 20 20  Dispose()..     
a6f0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
a700: 20 20 20 20 20 20 20 20 20 20 44 69 73 70 6f 73            Dispos
a710: 65 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20  e(true);..      
a720: 20 20 20 20 20 20 20 20 20 20 47 43 2e 53 75 70            GC.Sup
a730: 70 72 65 73 73 46 69 6e 61 6c 69 7a 65 28 74 68  pressFinalize(th
a740: 69 73 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  is);..          
a750: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
a760: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
a770: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
a780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a7b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
a7c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
a7d0: 65 67 69 6f 6e 20 44 65 73 74 72 75 63 74 6f 72  egion Destructor
a7e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7e 4d  ..            ~M
a7f0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 29  ockRegistryKey()
a800: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
a810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a820: 20 44 69 73 70 6f 73 65 28 66 61 6c 73 65 29 3b   Dispose(false);
a830: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
a840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
a850: 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20  dregion..       
a860: 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
a870: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
a880: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
a890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a8a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a8b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a8c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
a8d0: 20 20 20 20 20 23 72 65 67 69 6f 6e 20 52 65 67       #region Reg
a8e0: 69 73 74 72 79 48 65 6c 70 65 72 20 43 6c 61 73  istryHelper Clas
a8f0: 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  s..        priva
a900: 74 65 20 73 74 61 74 69 63 20 63 6c 61 73 73 20  te static class 
a910: 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 0d 0a  RegistryHelper..
a920: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
a930: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
a940: 75 62 6c 69 63 20 53 74 61 74 69 63 20 50 72 6f  ublic Static Pro
a950: 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20 20  perties..       
a960: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
a970: 74 69 63 20 69 6e 74 20 73 75 62 4b 65 79 73 43  tic int subKeysC
a980: 72 65 61 74 65 64 3b 0d 0a 20 20 20 20 20 20 20  reated;..       
a990: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
a9a0: 69 63 20 69 6e 74 20 53 75 62 4b 65 79 73 43 72  ic int SubKeysCr
a9b0: 65 61 74 65 64 0d 0a 20 20 20 20 20 20 20 20 20  eated..         
a9c0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
a9d0: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
a9e0: 72 6e 20 73 75 62 4b 65 79 73 43 72 65 61 74 65  rn subKeysCreate
a9f0: 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  d; }..          
aa00: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
aa10: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
aa20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa50: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
aa60: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
aa70: 61 74 69 63 20 69 6e 74 20 73 75 62 4b 65 79 73  atic int subKeys
aa80: 44 65 6c 65 74 65 64 3b 0d 0a 20 20 20 20 20 20  Deleted;..      
aa90: 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61        public sta
aaa0: 74 69 63 20 69 6e 74 20 53 75 62 4b 65 79 73 44  tic int SubKeysD
aab0: 65 6c 65 74 65 64 0d 0a 20 20 20 20 20 20 20 20  eleted..        
aac0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
aad0: 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
aae0: 75 72 6e 20 73 75 62 4b 65 79 73 44 65 6c 65 74  urn subKeysDelet
aaf0: 65 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ed; }..         
ab00: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
ab10: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
ab20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab50: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
ab60: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
ab70: 74 61 74 69 63 20 69 6e 74 20 6b 65 79 56 61 6c  tatic int keyVal
ab80: 75 65 73 53 65 74 3b 0d 0a 20 20 20 20 20 20 20  uesSet;..       
ab90: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
aba0: 69 63 20 69 6e 74 20 4b 65 79 56 61 6c 75 65 73  ic int KeyValues
abb0: 53 65 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  Set..           
abc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
abd0: 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
abe0: 20 6b 65 79 56 61 6c 75 65 73 53 65 74 3b 20 7d   keyValuesSet; }
abf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
ac00: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
ac10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac50: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
ac60: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
ac70: 20 69 6e 74 20 6b 65 79 56 61 6c 75 65 73 44 65   int keyValuesDe
ac80: 6c 65 74 65 64 3b 0d 0a 20 20 20 20 20 20 20 20  leted;..        
ac90: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
aca0: 63 20 69 6e 74 20 4b 65 79 56 61 6c 75 65 73 44  c int KeyValuesD
acb0: 65 6c 65 74 65 64 0d 0a 20 20 20 20 20 20 20 20  eleted..        
acc0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
acd0: 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
ace0: 75 72 6e 20 6b 65 79 56 61 6c 75 65 73 44 65 6c  urn keyValuesDel
acf0: 65 74 65 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20  eted; }..       
ad00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ad10: 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
ad20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
ad30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad70: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
ad80: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
ad90: 53 74 61 74 69 63 20 4d 65 74 68 6f 64 73 0d 0a  Static Methods..
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
adb0: 69 63 20 73 74 61 74 69 63 20 4d 6f 63 6b 52 65  ic static MockRe
adc0: 67 69 73 74 72 79 4b 65 79 20 4f 70 65 6e 53 75  gistryKey OpenSu
add0: 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
ade0: 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73         MockRegis
adf0: 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d  tryKey rootKey,.
ae00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae10: 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61   string subKeyNa
ae20: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
ae30: 20 20 20 20 20 62 6f 6f 6c 20 77 72 69 74 61 62       bool writab
ae40: 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le,..           
ae50: 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
ae60: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
ae70: 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d     bool verbose.
ae80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae90: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
aea0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
aeb0: 20 20 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d     if (rootKey =
aec0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
aee0: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20  urn null;....   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
af00: 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20  (verbose)..     
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
af20: 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64  raceOps.DebugAnd
af30: 54 72 61 63 65 28 77 72 69 74 61 62 6c 65 20 3f  Trace(writable ?
af40: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
af50: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50            TraceP
af60: 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 20  riority.Highest 
af70: 3a 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e  : TracePriority.
af80: 48 69 67 68 65 72 2c 0d 0a 20 20 20 20 20 20 20  Higher,..       
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20   debugCallback, 
afb0: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
afc0: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afe0: 20 20 20 20 20 20 20 22 72 6f 6f 74 4b 65 79 20         "rootKey 
aff0: 3d 20 7b 30 7d 2c 20 73 75 62 4b 65 79 4e 61 6d  = {0}, subKeyNam
b000: 65 20 3d 20 7b 31 7d 2c 20 77 72 69 74 61 62 6c  e = {1}, writabl
b010: 65 20 3d 20 7b 32 7d 22 2c 0d 0a 20 20 20 20 20  e = {2}",..     
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 72 6f     ForDisplay(ro
b040: 6f 74 4b 65 79 29 2c 20 46 6f 72 44 69 73 70 6c  otKey), ForDispl
b050: 61 79 28 73 75 62 4b 65 79 4e 61 6d 65 29 2c 0d  ay(subKeyName),.
b060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b070: 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
b080: 6c 61 79 28 77 72 69 74 61 62 6c 65 29 29 2c 20  lay(writable)), 
b090: 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
b0a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b0b0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
b0c0: 20 20 20 20 20 20 20 2f 2f 20 48 41 43 4b 3a 20         // HACK: 
b0d0: 41 6c 77 61 79 73 20 66 6f 72 62 69 64 20 77 72  Always forbid wr
b0e0: 69 74 61 62 6c 65 20 61 63 63 65 73 73 20 77 68  itable access wh
b0f0: 65 6e 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 0d  en operating in.
b100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b110: 20 2f 2f 20 20 20 20 20 20 20 27 77 68 61 74 2d   //       'what-
b120: 69 66 27 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20  if' mode...     
b130: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
b150: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
b160: 65 79 20 3d 20 72 6f 6f 74 4b 65 79 2e 4f 70 65  ey = rootKey.Ope
b170: 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20  nSubKey(..      
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75                su
b190: 62 4b 65 79 4e 61 6d 65 2c 20 77 68 61 74 49 66  bKeyName, whatIf
b1a0: 20 3f 20 66 61 6c 73 65 20 3a 20 77 72 69 74 61   ? false : writa
b1b0: 62 6c 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ble);....       
b1c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b1d0: 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f 0d  (key != null) ?.
b1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b1f0: 20 20 20 20 20 6e 65 77 20 4d 6f 63 6b 52 65 67       new MockReg
b200: 69 73 74 72 79 4b 65 79 28 6b 65 79 2c 20 77 68  istryKey(key, wh
b210: 61 74 49 66 2c 20 66 61 6c 73 65 2c 20 66 61 6c  atIf, false, fal
b220: 73 65 29 20 3a 20 6e 75 6c 6c 3b 0d 0a 20 20 20  se) : null;..   
b230: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
b240: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
b250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
b290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
b2a0: 6c 69 63 20 73 74 61 74 69 63 20 4d 6f 63 6b 52  lic static MockR
b2b0: 65 67 69 73 74 72 79 4b 65 79 20 43 72 65 61 74  egistryKey Creat
b2c0: 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20  eSubKey(..      
b2d0: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
b2e0: 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
b2f0: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
b300: 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65      string subKe
b310: 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
b320: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
b330: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
b340: 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
b350: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
b360: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
b370: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
b380: 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
b390: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a  return null;....
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67    TraceOps.Debug
b400: 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72  AndTrace(TracePr
b410: 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d  iority.Highest,.
b420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b430: 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61           debugCa
b440: 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c  llback, traceCal
b450: 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
b460: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b480: 72 6f 6f 74 4b 65 79 20 3d 20 7b 30 7d 2c 20 73  rootKey = {0}, s
b490: 75 62 4b 65 79 4e 61 6d 65 20 3d 20 7b 31 7d 22  ubKeyName = {1}"
b4a0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
b4b0: 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
b4c0: 73 70 6c 61 79 28 72 6f 6f 74 4b 65 79 29 2c 20  splay(rootKey), 
b4d0: 46 6f 72 44 69 73 70 6c 61 79 28 73 75 62 4b 65  ForDisplay(subKe
b4e0: 79 4e 61 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20  yName)),..      
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
b510: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
b520: 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20 20       try..      
b530: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
b560: 20 20 20 20 20 20 20 20 20 2f 2f 20 48 41 43 4b           // HACK
b570: 3a 20 41 6c 77 61 79 73 20 6f 70 65 6e 20 61 20  : Always open a 
b580: 6b 65 79 2c 20 72 61 74 68 65 72 20 74 68 61 6e  key, rather than
b590: 20 63 72 65 61 74 69 6e 67 20 6f 6e 65 20 77 68   creating one wh
b5a0: 65 6e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  en..            
b5b0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
b5c0: 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 27 77   operating in 'w
b5d0: 68 61 74 2d 69 66 27 20 6d 6f 64 65 2e 0d 0a 20  hat-if' mode... 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
b600: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 77             if (w
b610: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
b620: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 2f 2f 20 48 41 43 4b 3a 20 41 74 74 65     // HACK: Atte
b670: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  mpt to open the 
b680: 73 70 65 63 69 66 69 65 64 20 73 75 62 2d 6b 65  specified sub-ke
b690: 79 2e 20 20 49 66 0d 0a 20 20 20 20 20 20 20 20  y.  If..        
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 2f 2f 20 20 20 20 20 20 20 74 68 69 73 20 66 61  //       this fa
b6c0: 69 6c 73 2c 20 77 65 20 77 69 6c 6c 20 73 69 6d  ils, we will sim
b6d0: 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 72  ply return the r
b6e0: 6f 6f 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20  oot..           
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
b700: 20 20 20 20 20 20 6b 65 79 20 69 74 73 65 6c 66        key itself
b710: 20 73 69 6e 63 65 20 6e 6f 20 77 72 69 74 65 73   since no writes
b720: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 69 6e 0d   are allowed in.
b730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b740: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
b750: 20 20 27 77 68 61 74 2d 69 66 27 20 6d 6f 64 65    'what-if' mode
b760: 20 61 6e 79 68 6f 77 2e 0d 0a 20 20 20 20 20 20   anyhow...      
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f                Mo
b7a0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65  ckRegistryKey ke
b7b0: 79 20 3d 20 72 6f 6f 74 4b 65 79 2e 4f 70 65 6e  y = rootKey.Open
b7c0: 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d  SubKey(subKeyNam
b7d0: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b7f0: 65 74 75 72 6e 20 28 6b 65 79 20 21 3d 20 6e 75  eturn (key != nu
b800: 6c 6c 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20  ll) ?..         
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 20 20 6b 65 79 20 3a 20 6e 65 77 20 4d 6f 63     key : new Moc
b830: 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20  kRegistryKey(.. 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
b860: 6f 6f 74 4b 65 79 2c 20 73 75 62 4b 65 79 4e 61  ootKey, subKeyNa
b870: 6d 65 2c 20 77 68 61 74 49 66 2c 20 66 61 6c 73  me, whatIf, fals
b880: 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  e, false);..    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
b8b0: 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
b8f0: 72 6e 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73  rn new MockRegis
b900: 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  tryKey(..       
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 72 6f 6f 74 4b 65 79 2e 43 72 65       rootKey.Cre
b930: 61 74 65 53 75 62 4b 65 79 28 73 75 62 4b 65 79  ateSubKey(subKey
b940: 4e 61 6d 65 29 2c 20 77 68 61 74 49 66 2c 20 66  Name), whatIf, f
b950: 61 6c 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  alse,..         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20     false);..    
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
b9a0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
b9b0: 20 20 20 20 20 20 66 69 6e 61 6c 6c 79 0d 0a 20        finally.. 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
b9d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b9e0: 20 20 20 20 20 20 73 75 62 4b 65 79 73 43 72 65        subKeysCre
b9f0: 61 74 65 64 2b 2b 3b 0d 0a 20 20 20 20 20 20 20  ated++;..       
ba00: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ba10: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
ba20: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
ba30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
ba80: 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 44  ic static void D
ba90: 65 6c 65 74 65 53 75 62 4b 65 79 28 0d 0a 20 20  eleteSubKey(..  
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f                Mo
bab0: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f  ckRegistryKey ro
bac0: 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  otKey,..        
bad0: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73          string s
bae0: 75 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20  ubKeyName,..    
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
bb00: 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c   throwOnMissing,
bb10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bb20: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
bb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
bb90: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
bba0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
bbb0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
bbc0: 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65       if (verbose
bbd0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
bbe0: 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
bbf0: 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 54 72  DebugAndTrace(Tr
bc00: 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68  acePriority.High
bc10: 65 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  est,..          
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
bc30: 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61  bugCallback, tra
bc40: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
bc50: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b      "rootKey = {
bc80: 30 7d 2c 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d  0}, subKeyName =
bc90: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 46 6f 72 44 69 73 70 6c 61 79 28 72 6f 6f 74 4b  ForDisplay(rootK
bcc0: 65 79 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ey), ForDisplay(
bcd0: 73 75 62 4b 65 79 4e 61 6d 65 29 29 2c 0d 0a 20  subKeyName)),.. 
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
bd00: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
bd10: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
bd20: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
bd40: 4b 65 79 2e 44 65 6c 65 74 65 53 75 62 4b 65 79  Key.DeleteSubKey
bd50: 28 73 75 62 4b 65 79 4e 61 6d 65 2c 20 74 68 72  (subKeyName, thr
bd60: 6f 77 4f 6e 4d 69 73 73 69 6e 67 29 3b 0d 0a 0d  owOnMissing);...
bd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bd80: 20 73 75 62 4b 65 79 73 44 65 6c 65 74 65 64 2b   subKeysDeleted+
bd90: 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +;..            
bda0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
bdb0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
bdc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bdd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bde0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bdf0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
be00: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
be10: 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62  c void DeleteSub
be20: 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20 20  KeyTree(..      
be30: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
be40: 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
be50: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
be60: 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65      string subKe
be70: 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
be80: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
be90: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
bea0: 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
beb0: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
bec0: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
bed0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
bee0: 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
bef0: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
bf20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
bf30: 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20  erbose)..       
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
bf50: 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72  ceOps.DebugAndTr
bf60: 61 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74  ace(TracePriorit
bf70: 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20  y.Highest,..    
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63      debugCallbac
bfa0: 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  k, traceCallback
bfb0: 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
bfc0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
bfd0: 20 20 20 20 20 20 20 20 20 20 22 72 6f 6f 74 4b            "rootK
bfe0: 65 79 20 3d 20 7b 30 7d 2c 20 73 75 62 4b 65 79  ey = {0}, subKey
bff0: 4e 61 6d 65 20 3d 20 7b 31 7d 22 2c 0d 0a 20 20  Name = {1}",..  
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c010: 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
c020: 28 72 6f 6f 74 4b 65 79 29 2c 20 46 6f 72 44 69  (rootKey), ForDi
c030: 73 70 6c 61 79 28 73 75 62 4b 65 79 4e 61 6d 65  splay(subKeyName
c040: 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
c060: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c080: 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20  if (!whatIf)..  
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 72 6f 6f 74 4b 65 79 2e 44 65 6c 65 74 65    rootKey.Delete
c0b0: 53 75 62 4b 65 79 54 72 65 65 28 73 75 62 4b 65  SubKeyTree(subKe
c0c0: 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  yName);....     
c0d0: 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
c0e0: 79 73 44 65 6c 65 74 65 64 2b 2b 3b 0d 0a 20 20  ysDeleted++;..  
c0f0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
c100: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
c110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
c150: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
c160: 62 6c 69 63 20 73 74 61 74 69 63 20 73 74 72 69  blic static stri
c170: 6e 67 5b 5d 20 47 65 74 53 75 62 4b 65 79 4e 61  ng[] GetSubKeyNa
c180: 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mes(..          
c190: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
c1a0: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
c1c0: 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
c1d0: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
c1e0: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
c1f0: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
c200: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
c210: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65            if (ke
c220: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a  return null;....
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67    TraceOps.Debug
c290: 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72  AndTrace(TracePr
c2a0: 69 6f 72 69 74 79 2e 48 69 67 68 2c 0d 0a 20 20  iority.High,..  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2c0: 20 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62        debugCallb
c2d0: 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  ack, traceCallba
c2e0: 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
c2f0: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
c300: 20 20 20 20 20 20 20 20 20 20 20 20 22 6b 65 79              "key
c310: 20 3d 20 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70   = {0}", ForDisp
c320: 6c 61 79 28 6b 65 79 29 29 2c 20 74 72 61 63 65  lay(key)), trace
c330: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
c350: 74 75 72 6e 20 6b 65 79 2e 47 65 74 53 75 62 4b  turn key.GetSubK
c360: 65 79 4e 61 6d 65 73 28 29 3b 0d 0a 20 20 20 20  eyNames();..    
c370: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
c380: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
c390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c3a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c3b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
c3e0: 69 63 20 73 74 61 74 69 63 20 6f 62 6a 65 63 74  ic static object
c3f0: 20 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20   GetValue(..    
c400: 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
c410: 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c  RegistryKey key,
c420: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c430: 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a    string name,..
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 6f 62 6a 65 63 74 20 64 65 66 61 75 6c 74 56 61  object defaultVa
c460: 6c 75 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  lue,..          
c470: 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
c480: 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
c490: 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
c4a0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c4b0: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
c4c0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
c4d0: 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
c4e0: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
c4f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c500: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
c510: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65            if (ve
c520: 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20  rbose)..        
c530: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
c540: 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
c550: 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
c560: 2e 48 69 67 68 2c 0d 0a 20 20 20 20 20 20 20 20  .High,..        
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74  debugCallback, t
c590: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
c5a0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b 30 7d        "key = {0}
c5d0: 2c 20 6e 61 6d 65 20 3d 20 7b 31 7d 2c 20 64 65  , name = {1}, de
c5e0: 66 61 75 6c 74 56 61 6c 75 65 20 3d 20 7b 32 7d  faultValue = {2}
c5f0: 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
c600: 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
c610: 69 73 70 6c 61 79 28 6b 65 79 29 2c 20 46 6f 72  isplay(key), For
c620: 44 69 73 70 6c 61 79 28 6e 61 6d 65 29 2c 0d 0a  Display(name),..
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
c650: 61 79 28 64 65 66 61 75 6c 74 56 61 6c 75 65 29  ay(defaultValue)
c660: 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
c670: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
c680: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6b 65 79        return key
c690: 2e 47 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20  .GetValue(name, 
c6a0: 64 65 66 61 75 6c 74 56 61 6c 75 65 29 3b 0d 0a  defaultValue);..
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
c6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
c6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c710: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c720: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f  public static vo
c730: 69 64 20 53 65 74 56 61 6c 75 65 28 0d 0a 20 20  id SetValue(..  
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f                Mo
c750: 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65  ckRegistryKey ke
c760: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
c770: 20 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c      string name,
c780: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c790: 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65 2c 0d    object value,.
c7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c7b0: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
c7d0: 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20  ool verbose..   
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a               )..
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c810: 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  f (key == null).
c820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c830: 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a       return;....
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67    TraceOps.Debug
c880: 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72  AndTrace(TracePr
c890: 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d  iority.Highest,.
c8a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c8b0: 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61           debugCa
c8c0: 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c  llback, traceCal
c8d0: 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
c8e0: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
c900: 6b 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65 20  key = {0}, name 
c910: 3d 20 7b 31 7d 2c 20 76 61 6c 75 65 20 3d 20 7b  = {1}, value = {
c920: 32 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  2}",..          
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
c940: 72 44 69 73 70 6c 61 79 28 6b 65 79 29 2c 20 46  rDisplay(key), F
c950: 6f 72 44 69 73 70 6c 61 79 28 6e 61 6d 65 29 2c  orDisplay(name),
c960: 20 46 6f 72 44 69 73 70 6c 61 79 28 76 61 6c 75   ForDisplay(valu
c970: 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  e)),..          
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
c990: 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
c9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c9b0: 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20   if (!whatIf).. 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 6b 65 79 2e 53 65 74 56 61 6c 75 65 28     key.SetValue(
c9e0: 6e 61 6d 65 2c 20 76 61 6c 75 65 29 3b 0d 0a 0d  name, value);...
c9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca00: 20 6b 65 79 56 61 6c 75 65 73 53 65 74 2b 2b 3b   keyValuesSet++;
ca10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
ca20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
ca30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ca40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ca50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ca60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ca70: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
ca80: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
ca90: 76 6f 69 64 20 44 65 6c 65 74 65 56 61 6c 75 65  void DeleteValue
caa0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
cab0: 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b     MockRegistryK
cac0: 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ey key,..       
cad0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
cae0: 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  name,..         
caf0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 74 68 72 6f         bool thro
cb00: 77 4f 6e 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20  wOnMissing,..   
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
cb20: 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
cb30: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
cb40: 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20  verbose..       
cb50: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
cb60: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
cb70: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b             if (k
cb80: 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
cbc0: 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20  verbose)..      
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
cbe0: 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54  aceOps.DebugAndT
cbf0: 72 61 63 65 28 54 72 61 63 65 50 72 69 6f 72 69  race(TracePriori
cc00: 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20  ty.Highest,..   
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61       debugCallba
cc30: 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63  ck, traceCallbac
cc40: 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
cc50: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
cc60: 20 20 20 20 20 20 20 20 20 20 20 22 6b 65 79 20             "key 
cc70: 3d 20 7b 30 7d 2c 20 6e 61 6d 65 20 3d 20 7b 31  = {0}, name = {1
cc80: 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6b  }", ForDisplay(k
cc90: 65 79 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ey),..          
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
ccb0: 72 44 69 73 70 6c 61 79 28 6e 61 6d 65 29 29 2c  rDisplay(name)),
ccc0: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
ccd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
cce0: 20 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29      if (!whatIf)
ccf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cd00: 20 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74 65        key.Delete
cd10: 56 61 6c 75 65 28 6e 61 6d 65 2c 20 74 68 72 6f  Value(name, thro
cd20: 77 4f 6e 4d 69 73 73 69 6e 67 29 3b 0d 0a 0d 0a  wOnMissing);....
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd40: 6b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64  keyValuesDeleted
cd50: 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++;..           
cd60: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
cd70: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20  #endregion..    
cd80: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23      }..        #
cd90: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
cda0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
cdb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cdc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cdd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cde0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
cdf0: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
ce00: 53 74 72 69 6e 67 4c 69 73 74 20 43 6c 61 73 73  StringList Class
ce10: 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
ce20: 65 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20 53  e sealed class S
ce30: 74 72 69 6e 67 4c 69 73 74 20 3a 20 4c 69 73 74  tringList : List
ce40: 3c 73 74 72 69 6e 67 3e 0d 0a 20 20 20 20 20 20  <string>..      
ce50: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
ce60: 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67 4c 69   public StringLi
ce70: 73 74 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  st()..          
ce80: 20 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d 0a        : base()..
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ceb0: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
cec0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
cee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
cf20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
cf30: 75 62 6c 69 63 20 53 74 72 69 6e 67 4c 69 73 74  ublic StringList
cf40: 28 49 45 6e 75 6d 65 72 61 62 6c 65 3c 73 74 72  (IEnumerable<str
cf50: 69 6e 67 3e 20 63 6f 6c 6c 65 63 74 69 6f 6e 29  ing> collection)
cf60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cf70: 20 20 3a 20 62 61 73 65 28 63 6f 6c 6c 65 63 74    : base(collect
cf80: 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ion)..          
cf90: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
cfa0: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
cfb0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
cfc0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
cfd0: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
cfe0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
cff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d030: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
d040: 23 72 65 67 69 6f 6e 20 53 74 72 69 6e 67 44 69  #region StringDi
d050: 63 74 69 6f 6e 61 72 79 20 43 6c 61 73 73 0d 0a  ctionary Class..
d060: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
d070: 73 65 61 6c 65 64 20 63 6c 61 73 73 20 53 74 72  sealed class Str
d080: 69 6e 67 44 69 63 74 69 6f 6e 61 72 79 20 3a 20  ingDictionary : 
d090: 44 69 63 74 69 6f 6e 61 72 79 3c 73 74 72 69 6e  Dictionary<strin
d0a0: 67 2c 20 73 74 72 69 6e 67 3e 0d 0a 20 20 20 20  g, string>..    
d0b0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
d0c0: 20 20 20 70 75 62 6c 69 63 20 53 74 72 69 6e 67     public String
d0d0: 44 69 63 74 69 6f 6e 61 72 79 28 29 0d 0a 20 20  Dictionary()..  
d0e0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
d100: 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20  do nothing...   
d110: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
d120: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23      }..        #
d130: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
d140: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
d150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
d190: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
d1a0: 56 65 72 73 69 6f 6e 4c 69 73 74 20 43 6c 61 73  VersionList Clas
d1b0: 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  s..        priva
d1c0: 74 65 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20  te sealed class 
d1d0: 56 65 72 73 69 6f 6e 4c 69 73 74 20 3a 20 4c 69  VersionList : Li
d1e0: 73 74 3c 56 65 72 73 69 6f 6e 3e 0d 0a 20 20 20  st<Version>..   
d1f0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
d200: 20 20 20 20 70 75 62 6c 69 63 20 56 65 72 73 69      public Versi
d210: 6f 6e 4c 69 73 74 28 29 0d 0a 20 20 20 20 20 20  onList()..      
d220: 20 20 20 20 20 20 20 20 20 20 3a 20 62 61 73 65            : base
d230: 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ()..            
d240: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
d250: 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67     // do nothing
d260: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ...            }
d270: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
d280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2c0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
d2d0: 20 20 20 70 75 62 6c 69 63 20 56 65 72 73 69 6f     public Versio
d2e0: 6e 4c 69 73 74 28 49 45 6e 75 6d 65 72 61 62 6c  nList(IEnumerabl
d2f0: 65 3c 56 65 72 73 69 6f 6e 3e 20 63 6f 6c 6c 65  e<Version> colle
d300: 63 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20  ction)..        
d310: 20 20 20 20 20 20 20 20 3a 20 62 61 73 65 28 63          : base(c
d320: 6f 6c 6c 65 63 74 69 6f 6e 29 0d 0a 20 20 20 20  ollection)..    
d330: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
d340: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f             // do
d350: 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20   nothing...     
d360: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
d370: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
d380: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
d390: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
d3a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
d3e0: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 65        #region Ve
d3f0: 72 73 69 6f 6e 4d 61 70 20 43 6c 61 73 73 0d 0a  rsionMap Class..
d400: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
d410: 73 65 61 6c 65 64 20 63 6c 61 73 73 20 56 65 72  sealed class Ver
d420: 73 69 6f 6e 4d 61 70 20 3a 20 44 69 63 74 69 6f  sionMap : Dictio
d430: 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 56 65 72  nary<string, Ver
d440: 73 69 6f 6e 4c 69 73 74 3e 0d 0a 20 20 20 20 20  sionList>..     
d450: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
d460: 20 20 70 75 62 6c 69 63 20 56 65 72 73 69 6f 6e    public Version
d470: 4d 61 70 28 29 0d 0a 20 20 20 20 20 20 20 20 20  Map()..         
d480: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
d490: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
d4a0: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
d4b0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
d4c0: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
d4d0: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
d4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d520: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
d530: 20 23 72 65 67 69 6f 6e 20 50 61 63 6b 61 67 65   #region Package
d540: 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20 20   Class..        
d550: 69 6e 74 65 72 6e 61 6c 20 73 65 61 6c 65 64 20  internal sealed 
d560: 63 6c 61 73 73 20 50 61 63 6b 61 67 65 0d 0a 20  class Package.. 
d570: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
d580: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75        #region Pu
d590: 62 6c 69 63 20 43 6f 6e 73 74 72 75 63 74 6f 72  blic Constructor
d5a0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
d5b0: 75 62 6c 69 63 20 50 61 63 6b 61 67 65 28 29 0d  ublic Package().
d5c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
d600: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
d610: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
d620: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
d630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d660: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
d670: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
d680: 50 75 62 6c 69 63 20 50 72 6f 70 65 72 74 69 65  Public Propertie
d690: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
d6a0: 72 69 76 61 74 65 20 47 75 69 64 20 70 61 63 6b  rivate Guid pack
d6b0: 61 67 65 49 64 3b 0d 0a 20 20 20 20 20 20 20 20  ageId;..        
d6c0: 20 20 20 20 70 75 62 6c 69 63 20 47 75 69 64 20      public Guid 
d6d0: 50 61 63 6b 61 67 65 49 64 0d 0a 20 20 20 20 20  PackageId..     
d6e0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
d6f0: 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
d700: 72 65 74 75 72 6e 20 70 61 63 6b 61 67 65 49 64  return packageId
d710: 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
d720: 20 20 20 20 20 73 65 74 20 7b 20 70 61 63 6b 61       set { packa
d730: 67 65 49 64 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  geId = value; }.
d740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
d750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
d760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d7a0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
d7b0: 20 70 72 69 76 61 74 65 20 47 75 69 64 20 73 65   private Guid se
d7c0: 72 76 69 63 65 49 64 3b 0d 0a 20 20 20 20 20 20  rviceId;..      
d7d0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 47 75 69        public Gui
d7e0: 64 20 53 65 72 76 69 63 65 49 64 0d 0a 20 20 20  d ServiceId..   
d7f0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
d800: 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
d810: 7b 20 72 65 74 75 72 6e 20 73 65 72 76 69 63 65  { return service
d820: 49 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  Id; }..         
d830: 20 20 20 20 20 20 20 73 65 74 20 7b 20 73 65 72         set { ser
d840: 76 69 63 65 49 64 20 3d 20 76 61 6c 75 65 3b 20  viceId = value; 
d850: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
d860: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
d870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d8a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d8b0: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
d8c0: 20 20 20 70 72 69 76 61 74 65 20 47 75 69 64 20     private Guid 
d8d0: 64 61 74 61 53 6f 75 72 63 65 49 64 3b 0d 0a 20  dataSourceId;.. 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
d8f0: 63 20 47 75 69 64 20 44 61 74 61 53 6f 75 72 63  c Guid DataSourc
d900: 65 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  eId..           
d910: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d920: 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
d930: 20 64 61 74 61 53 6f 75 72 63 65 49 64 3b 20 7d   dataSourceId; }
d940: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d950: 20 20 73 65 74 20 7b 20 64 61 74 61 53 6f 75 72    set { dataSour
d960: 63 65 49 64 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  ceId = value; }.
d970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
d980: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
d990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9d0: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
d9e0: 20 70 72 69 76 61 74 65 20 47 75 69 64 20 64 61   private Guid da
d9f0: 74 61 50 72 6f 76 69 64 65 72 49 64 3b 0d 0a 20  taProviderId;.. 
da00: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
da10: 63 20 47 75 69 64 20 44 61 74 61 50 72 6f 76 69  c Guid DataProvi
da20: 64 65 72 49 64 0d 0a 20 20 20 20 20 20 20 20 20  derId..         
da30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
da40: 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
da50: 72 6e 20 64 61 74 61 50 72 6f 76 69 64 65 72 49  rn dataProviderI
da60: 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  d; }..          
da70: 20 20 20 20 20 20 73 65 74 20 7b 20 64 61 74 61        set { data
da80: 50 72 6f 76 69 64 65 72 49 64 20 3d 20 76 61 6c  ProviderId = val
da90: 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
daa0: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
dab0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
dac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
daf0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
db00: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 47         private G
db10: 75 69 64 20 61 64 6f 4e 65 74 54 65 63 68 6e 6f  uid adoNetTechno
db20: 6c 6f 67 79 49 64 3b 0d 0a 20 20 20 20 20 20 20  logyId;..       
db30: 20 20 20 20 20 70 75 62 6c 69 63 20 47 75 69 64       public Guid
db40: 20 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f 67   AdoNetTechnolog
db50: 79 49 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20  yId..           
db60: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
db70: 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
db80: 20 61 64 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f 67   adoNetTechnolog
db90: 79 49 64 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  yId; }..        
dba0: 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 61 64          set { ad
dbb0: 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f 67 79 49 64  oNetTechnologyId
dbc0: 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20   = value; }..   
dbd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
dbe0: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
dbf0: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
dc00: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
dc10: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
dc20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dc30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dc40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dc50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dc60: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
dc70: 23 72 65 67 69 6f 6e 20 43 6f 6e 66 69 67 75 72  #region Configur
dc80: 61 74 69 6f 6e 20 43 6c 61 73 73 0d 0a 20 20 20  ation Class..   
dc90: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
dca0: 6c 65 64 20 63 6c 61 73 73 20 43 6f 6e 66 69 67  led class Config
dcb0: 75 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20  uration..       
dcc0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
dcd0: 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20  #region Private 
dce0: 43 6f 6e 73 74 61 6e 74 73 0d 0a 20 20 20 20 20  Constants..     
dcf0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63         private c
dd00: 6f 6e 73 74 20 63 68 61 72 20 53 77 69 74 63 68  onst char Switch
dd10: 20 3d 20 27 2d 27 3b 0d 0a 20 20 20 20 20 20 20   = '-';..       
dd20: 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e       private con
dd30: 73 74 20 63 68 61 72 20 41 6c 74 53 77 69 74 63  st char AltSwitc
dd40: 68 20 3d 20 27 2f 27 3b 0d 0a 0d 0a 20 20 20 20  h = '/';....    
dd50: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
dd60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
dda0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
ddb0: 74 65 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e  te static readon
ddc0: 6c 79 20 63 68 61 72 5b 5d 20 53 77 69 74 63 68  ly char[] Switch
ddd0: 43 68 61 72 73 20 3d 20 7b 0d 0a 20 20 20 20 20  Chars = {..     
dde0: 20 20 20 20 20 20 20 20 20 20 20 53 77 69 74 63             Switc
ddf0: 68 2c 20 41 6c 74 53 77 69 74 63 68 0d 0a 20 20  h, AltSwitch..  
de00: 20 20 20 20 20 20 20 20 20 20 7d 3b 0d 0a 20 20            };..  
de10: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
de20: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
de30: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
de40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
de50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
de60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
de70: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
de80: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50         #region P
de90: 72 69 76 61 74 65 20 43 6f 6e 73 74 72 75 63 74  rivate Construct
dea0: 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ors..           
deb0: 20 70 72 69 76 61 74 65 20 43 6f 6e 66 69 67 75   private Configu
dec0: 72 61 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20  ration(..       
ded0: 20 20 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c           Assembl
dee0: 79 20 61 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20  y assembly,..   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
df00: 69 6e 67 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 2c  ing logFileName,
df10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
df20: 20 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f    string directo
df30: 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
df40: 20 20 20 20 20 73 74 72 69 6e 67 20 63 6f 72 65       string core
df50: 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  FileName,..     
df60: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
df70: 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d  g linqFileName,.
df80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df90: 20 73 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72   string designer
dfa0: 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  FileName,..     
dfb0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
dfc0: 67 20 64 65 62 75 67 46 6f 72 6d 61 74 2c 0d 0a  g debugFormat,..
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 73 74 72 69 6e 67 20 74 72 61 63 65 46 6f 72 6d  string traceForm
dff0: 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at,..           
e000: 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67       InstallFlag
e010: 73 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73 2c 0d  s installFlags,.
e020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e030: 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 20 64   TracePriority d
e040: 65 62 75 67 50 72 69 6f 72 69 74 79 2c 0d 0a 20  ebugPriority,.. 
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
e060: 72 61 63 65 50 72 69 6f 72 69 74 79 20 74 72 61  racePriority tra
e070: 63 65 50 72 69 6f 72 69 74 79 2c 0d 0a 20 20 20  cePriority,..   
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
e090: 6c 20 69 6e 73 74 61 6c 6c 2c 0d 0a 20 20 20 20  l install,..    
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
e0b0: 20 6e 6f 52 75 6e 74 69 6d 65 56 65 72 73 69 6f   noRuntimeVersio
e0c0: 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
e0d0: 20 20 20 20 62 6f 6f 6c 20 6e 6f 44 65 73 6b 74      bool noDeskt
e0e0: 6f 70 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  op,..           
e0f0: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6d 70       bool noComp
e100: 61 63 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  act,..          
e110: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74        bool noNet
e120: 46 78 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 20  Fx20,..         
e130: 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65         bool noNe
e140: 74 46 78 34 30 2c 0d 0a 20 20 20 20 20 20 20 20  tFx40,..        
e150: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56          bool noV
e160: 73 32 30 30 38 2c 0d 0a 20 20 20 20 20 20 20 20  s2008,..        
e170: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56          bool noV
e180: 73 32 30 31 30 2c 0d 0a 20 20 20 20 20 20 20 20  s2010,..        
e190: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 54          bool noT
e1a0: 72 61 63 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  race,..         
e1b0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f         bool noCo
e1c0: 6e 73 6f 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20  nsole,..        
e1d0: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4c          bool noL
e1e0: 6f 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  og,..           
e1f0: 20 20 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f       bool throwO
e200: 6e 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20  nMissing,..     
e210: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
e220: 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
e230: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
e240: 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
e250: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 63 6f 6e          bool con
e260: 66 69 72 6d 0d 0a 20 20 20 20 20 20 20 20 20 20  firm..          
e270: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
e280: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
e290: 20 20 20 20 20 20 20 20 74 68 69 73 2e 61 73 73          this.ass
e2a0: 65 6d 62 6c 79 20 3d 20 61 73 73 65 6d 62 6c 79  embly = assembly
e2b0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
e2c0: 20 20 20 74 68 69 73 2e 6c 6f 67 46 69 6c 65 4e     this.logFileN
e2d0: 61 6d 65 20 3d 20 6c 6f 67 46 69 6c 65 4e 61 6d  ame = logFileNam
e2e0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
e2f0: 20 20 20 20 74 68 69 73 2e 64 69 72 65 63 74 6f      this.directo
e300: 72 79 20 3d 20 64 69 72 65 63 74 6f 72 79 3b 0d  ry = directory;.
e310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e320: 20 74 68 69 73 2e 63 6f 72 65 46 69 6c 65 4e 61   this.coreFileNa
e330: 6d 65 20 3d 20 63 6f 72 65 46 69 6c 65 4e 61 6d  me = coreFileNam
e340: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
e350: 20 20 20 20 74 68 69 73 2e 6c 69 6e 71 46 69 6c      this.linqFil
e360: 65 4e 61 6d 65 20 3d 20 6c 69 6e 71 46 69 6c 65  eName = linqFile
e370: 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  Name;..         
e380: 20 20 20 20 20 20 20 74 68 69 73 2e 64 65 73 69         this.desi
e390: 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 64  gnerFileName = d
e3a0: 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b  esignerFileName;
e3b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e3c0: 20 20 74 68 69 73 2e 64 65 62 75 67 46 6f 72 6d    this.debugForm
e3d0: 61 74 20 3d 20 64 65 62 75 67 46 6f 72 6d 61 74  at = debugFormat
e3e0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
e3f0: 20 20 20 74 68 69 73 2e 74 72 61 63 65 46 6f 72     this.traceFor
e400: 6d 61 74 20 3d 20 74 72 61 63 65 46 6f 72 6d 61  mat = traceForma
e410: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
e420: 20 20 20 20 74 68 69 73 2e 69 6e 73 74 61 6c 6c      this.install
e430: 46 6c 61 67 73 20 3d 20 69 6e 73 74 61 6c 6c 46  Flags = installF
e440: 6c 61 67 73 3b 0d 0a 20 20 20 20 20 20 20 20 20  lags;..         
e450: 20 20 20 20 20 20 20 74 68 69 73 2e 64 65 62 75         this.debu
e460: 67 50 72 69 6f 72 69 74 79 20 3d 20 64 65 62 75  gPriority = debu
e470: 67 50 72 69 6f 72 69 74 79 3b 0d 0a 20 20 20 20  gPriority;..    
e480: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
e490: 2e 74 72 61 63 65 50 72 69 6f 72 69 74 79 20 3d  .tracePriority =
e4a0: 20 74 72 61 63 65 50 72 69 6f 72 69 74 79 3b 0d   tracePriority;.
e4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e4c0: 20 74 68 69 73 2e 69 6e 73 74 61 6c 6c 20 3d 20   this.install = 
e4d0: 69 6e 73 74 61 6c 6c 3b 0d 0a 20 20 20 20 20 20  install;..      
e4e0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e            this.n
e4f0: 6f 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 20  oRuntimeVersion 
e500: 3d 20 6e 6f 52 75 6e 74 69 6d 65 56 65 72 73 69  = noRuntimeVersi
e510: 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on;..           
e520: 20 20 20 20 20 74 68 69 73 2e 6e 6f 44 65 73 6b       this.noDesk
e530: 74 6f 70 20 3d 20 6e 6f 44 65 73 6b 74 6f 70 3b  top = noDesktop;
e540: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e550: 20 20 74 68 69 73 2e 6e 6f 43 6f 6d 70 61 63 74    this.noCompact
e560: 20 3d 20 6e 6f 43 6f 6d 70 61 63 74 3b 0d 0a 20   = noCompact;.. 
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e580: 68 69 73 2e 6e 6f 4e 65 74 46 78 32 30 20 3d 20  his.noNetFx20 = 
e590: 6e 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20 20 20  noNetFx20;..    
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
e5b0: 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 6e 6f 4e  .noNetFx40 = noN
e5c0: 65 74 46 78 34 30 3b 0d 0a 20 20 20 20 20 20 20  etFx40;..       
e5d0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 6f           this.no
e5e0: 56 73 32 30 30 38 20 3d 20 6e 6f 56 73 32 30 30  Vs2008 = noVs200
e5f0: 38 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  8;..            
e600: 20 20 20 20 74 68 69 73 2e 6e 6f 56 73 32 30 31      this.noVs201
e610: 30 20 3d 20 6e 6f 56 73 32 30 31 30 3b 0d 0a 20  0 = noVs2010;.. 
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
e630: 68 69 73 2e 6e 6f 54 72 61 63 65 20 3d 20 6e 6f  his.noTrace = no
e640: 54 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20 20  Trace;..        
e650: 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 43          this.noC
e660: 6f 6e 73 6f 6c 65 20 3d 20 6e 6f 43 6f 6e 73 6f  onsole = noConso
e670: 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le;..           
e680: 20 20 20 20 20 74 68 69 73 2e 6e 6f 4c 6f 67 20       this.noLog 
e690: 3d 20 6e 6f 4c 6f 67 3b 0d 0a 20 20 20 20 20 20  = noLog;..      
e6a0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 74            this.t
e6b0: 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 20 3d 20  hrowOnMissing = 
e6c0: 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 3b 0d  throwOnMissing;.
e6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e6e0: 20 74 68 69 73 2e 77 68 61 74 49 66 20 3d 20 77   this.whatIf = w
e6f0: 68 61 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20  hatIf;..        
e700: 20 20 20 20 20 20 20 20 74 68 69 73 2e 76 65 72          this.ver
e710: 62 6f 73 65 20 3d 20 76 65 72 62 6f 73 65 3b 0d  bose = verbose;.
e720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e730: 20 74 68 69 73 2e 63 6f 6e 66 69 72 6d 20 3d 20   this.confirm = 
e740: 63 6f 6e 66 69 72 6d 3b 0d 0a 20 20 20 20 20 20  confirm;..      
e750: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
e760: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
e770: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
e780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e7b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e7c0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
e7d0: 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61 74    #region Privat
e7e0: 65 20 53 74 61 74 69 63 20 4d 65 74 68 6f 64 73  e Static Methods
e7f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
e800: 69 76 61 74 65 20 73 74 61 74 69 63 20 76 6f 69  ivate static voi
e810: 64 20 47 65 74 44 65 66 61 75 6c 74 46 69 6c 65  d GetDefaultFile
e820: 4e 61 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20  Names(..        
e830: 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
e840: 6e 67 20 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20  ng directory,.. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
e860: 65 66 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69  ef string coreFi
e870: 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  leName,..       
e880: 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
e890: 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  ing linqFileName
e8a0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
e8b0: 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 64 65     ref string de
e8c0: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 0d 0a  signerFileName..
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
e8f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e900: 20 20 69 66 20 28 74 68 69 73 41 73 73 65 6d 62    if (thisAssemb
e910: 6c 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ly == null)..   
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20   return;....    
e940: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72 65              dire
e950: 63 74 6f 72 79 20 3d 20 50 61 74 68 2e 47 65 74  ctory = Path.Get
e960: 44 69 72 65 63 74 6f 72 79 4e 61 6d 65 28 74 68  DirectoryName(th
e970: 69 73 41 73 73 65 6d 62 6c 79 2e 4c 6f 63 61 74  isAssembly.Locat
e980: 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ion);....       
e990: 20 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72           if (Str
e9a0: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
e9b0: 79 28 64 69 72 65 63 74 6f 72 79 29 29 0d 0a 20  y(directory)).. 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20     return;....  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
e9f0: 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74  reFileName = Pat
ea00: 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65 63 74  h.Combine(direct
ea10: 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
ea20: 20 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c            Instal
ea30: 6c 65 72 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65  ler.CoreFileName
ea40: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
ea50: 20 20 20 20 20 20 6c 69 6e 71 46 69 6c 65 4e 61        linqFileNa
ea60: 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e  me = Path.Combin
ea70: 65 28 64 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20  e(directory,..  
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 20 49 6e 73 74 61 6c 6c 65 72 2e 4c 69 6e 71    Installer.Linq
eaa0: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  FileName);....  
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
eac0: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d  signerFileName =
ead0: 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69   Path.Combine(di
eae0: 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  rectory,..      
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
eb00: 73 74 61 6c 6c 65 72 2e 44 65 73 69 67 6e 65 72  staller.Designer
eb10: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  FileName);..    
eb20: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
eb30: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
eb40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eb50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eb60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
eb70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
eb90: 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20  ate static bool 
eba0: 43 68 65 63 6b 4f 70 74 69 6f 6e 28 0d 0a 20 20  CheckOption(..  
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ebc0: 66 20 73 74 72 69 6e 67 20 61 72 67 0d 0a 20 20  f string arg..  
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
ebe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 73 74 72 69 6e 67 20 72 65 73 75 6c 74 20 3d 20  string result = 
ec10: 61 72 67 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  arg;....        
ec20: 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72          if (!Str
ec30: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
ec40: 79 28 72 65 73 75 6c 74 29 29 0d 0a 20 20 20 20  y(result))..    
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
ec80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
ec90: 54 45 3a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 6c  TE: Remove all l
eca0: 65 61 64 69 6e 67 20 73 77 69 74 63 68 20 63 68  eading switch ch
ecb0: 61 72 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ars...          
ecc0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 72 65 73 75 6c 74 20 3d 20 72 65 73 75 6c    result = resul
ecf0: 74 2e 54 72 69 6d 53 74 61 72 74 28 53 77 69 74  t.TrimStart(Swit
ed00: 63 68 43 68 61 72 73 29 3b 0d 0a 0d 0a 20 20 20  chChars);....   
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
ed30: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
ed40: 3a 20 48 6f 77 20 6d 61 6e 79 20 63 68 61 72 73  : How many chars
ed50: 20 77 65 72 65 20 72 65 6d 6f 76 65 64 3f 0d 0a   were removed?..
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
ed90: 63 6f 75 6e 74 20 3d 20 61 72 67 2e 4c 65 6e 67  count = arg.Leng
eda0: 74 68 20 2d 20 72 65 73 75 6c 74 2e 4c 65 6e 67  th - result.Leng
edb0: 74 68 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  th;....         
edc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 61 73 20     // NOTE: Was 
edf0: 74 68 65 72 65 20 61 74 20 6c 65 61 73 74 20 6f  there at least o
ee00: 6e 65 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ne?..           
ee10: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 69 66 20 28 63 6f 75 6e 74 20 3e 20 30 29 0d   if (count > 0).
ee40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee50: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
ee90: 4f 54 45 3a 20 4f 6b 2c 20 72 65 70 6c 61 63 65  OTE: Ok, replace
eea0: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0d   their original.
eeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eec0: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
eed0: 20 20 61 72 67 75 6d 65 6e 74 2e 0d 0a 20 20 20    argument...   
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 61 72 67 20 3d 20 72 65 73 75 6c 74 3b 0d 0a   arg = result;..
ef20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ef30: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 59        // NOTE: Y
ef60: 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 73 77  es, this is a sw
ef70: 69 74 63 68 2e 0d 0a 20 20 20 20 20 20 20 20 20  itch...         
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef90: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
efa0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
efb0: 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20  n true;..       
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
eff0: 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
f000: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
f010: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
f020: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
f030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f060: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
f070: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
f080: 69 63 20 62 6f 6f 6c 20 4d 61 74 63 68 4f 70 74  ic bool MatchOpt
f090: 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ion(..          
f0a0: 20 20 20 20 20 20 73 74 72 69 6e 67 20 61 72 67        string arg
f0b0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
f0c0: 20 20 20 73 74 72 69 6e 67 20 6f 70 74 69 6f 6e     string option
f0d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f0e0: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
f0f0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f100: 20 20 20 20 69 66 20 28 28 61 72 67 20 3d 3d 20      if ((arg == 
f110: 6e 75 6c 6c 29 20 7c 7c 20 28 6f 70 74 69 6f 6e  null) || (option
f120: 20 3d 3d 20 6e 75 6c 6c 29 29 0d 0a 20 20 20 20   == null))..    
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
f150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f160: 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 43   return String.C
f170: 6f 6d 70 61 72 65 28 61 72 67 2c 20 30 2c 20 6f  ompare(arg, 0, o
f180: 70 74 69 6f 6e 2c 20 30 2c 0d 0a 20 20 20 20 20  ption, 0,..     
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
f1a0: 72 67 2e 4c 65 6e 67 74 68 2c 20 53 74 72 69 6e  rg.Length, Strin
f1b0: 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 4f 72 64 69  gComparison.Ordi
f1c0: 6e 61 6c 49 67 6e 6f 72 65 43 61 73 65 29 20 3d  nalIgnoreCase) =
f1d0: 3d 20 30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  = 0;..          
f1e0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
f1f0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
f200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f230: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
f240: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
f250: 61 74 69 63 20 62 6f 6f 6c 3f 20 50 61 72 73 65  atic bool? Parse
f260: 42 6f 6f 6c 65 61 6e 28 0d 0a 20 20 20 20 20 20  Boolean(..      
f270: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
f280: 20 74 65 78 74 0d 0a 20 20 20 20 20 20 20 20 20   text..         
f290: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
f2a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f2b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74           if (!St
f2c0: 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70  ring.IsNullOrEmp
f2d0: 74 79 28 74 65 78 74 29 29 0d 0a 20 20 20 20 20  ty(text))..     
f2e0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 62 6f 6f 6c 20 76 61 6c 75 65 3b 0d 0a 0d    bool value;...
f310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f320: 20 20 20 20 20 69 66 20 28 62 6f 6f 6c 2e 54 72       if (bool.Tr
f330: 79 50 61 72 73 65 28 74 65 78 74 2c 20 6f 75 74  yParse(text, out
f340: 20 76 61 6c 75 65 29 29 0d 0a 20 20 20 20 20 20   value))..      
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0d    return value;.
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f380: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
f390: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
f3a0: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
f3b0: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
f3c0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
f3d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f3e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f3f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f400: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
f410: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
f420: 69 63 20 6f 62 6a 65 63 74 20 50 61 72 73 65 45  ic object ParseE
f430: 6e 75 6d 28 0d 0a 20 20 20 20 20 20 20 20 20 20  num(..          
f440: 20 20 20 20 20 20 54 79 70 65 20 65 6e 75 6d 54        Type enumT
f450: 79 70 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ype,..          
f460: 20 20 20 20 20 20 73 74 72 69 6e 67 20 74 65 78        string tex
f470: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
f480: 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 61 73 65 0d      bool noCase.
f490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f4a0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
f4b0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
f4c0: 20 20 20 69 66 20 28 28 65 6e 75 6d 54 79 70 65     if ((enumType
f4d0: 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 65 6e   == null) || !en
f4e0: 75 6d 54 79 70 65 2e 49 73 45 6e 75 6d 29 0d 0a  umType.IsEnum)..
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
f510: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f520: 20 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e      if (!String.
f530: 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 74 65  IsNullOrEmpty(te
f540: 78 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  xt))..          
f550: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
f570: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f580: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 72 65 74 75 72 6e 20 45 6e 75 6d 2e 50 61 72   return Enum.Par
f5b0: 73 65 28 65 6e 75 6d 54 79 70 65 2c 20 74 65 78  se(enumType, tex
f5c0: 74 2c 20 6e 6f 43 61 73 65 29 3b 0d 0a 20 20 20  t, noCase);..   
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
f5f0: 20 20 20 20 20 20 20 20 63 61 74 63 68 0d 0a 20          catch.. 
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
f630: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
f660: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
f670: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f680: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
f690: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
f6a0: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
f6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
f6c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f6e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f6f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f700: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
f710: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 53  #region Public S
f720: 74 61 74 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20  tatic Methods.. 
f730: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
f740: 63 20 73 74 61 74 69 63 20 43 6f 6e 66 69 67 75  c static Configu
f750: 72 61 74 69 6f 6e 20 43 72 65 61 74 65 44 65 66  ration CreateDef
f760: 61 75 6c 74 28 29 0d 0a 20 20 20 20 20 20 20 20  ault()..        
f770: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
f780: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 69         string di
f790: 72 65 63 74 6f 72 79 20 3d 20 6e 75 6c 6c 3b 0d  rectory = null;.
f7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f7b0: 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c 65   string coreFile
f7c0: 4e 61 6d 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20  Name = null;..  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
f7e0: 72 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d  ring linqFileNam
f7f0: 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  e = null;..     
f800: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
f810: 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  g designerFileNa
f820: 6d 65 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  me = null;....  
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
f840: 74 44 65 66 61 75 6c 74 46 69 6c 65 4e 61 6d 65  tDefaultFileName
f850: 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s(..            
f860: 20 20 20 20 20 20 20 20 72 65 66 20 64 69 72 65          ref dire
f870: 63 74 6f 72 79 2c 20 72 65 66 20 63 6f 72 65 46  ctory, ref coreF
f880: 69 6c 65 4e 61 6d 65 2c 20 72 65 66 20 6c 69 6e  ileName, ref lin
f890: 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20  qFileName,..    
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 72 65 66 20 64 65 73 69 67 6e 65 72 46 69 6c 65  ref designerFile
f8c0: 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
f8d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f8e0: 20 6e 65 77 20 43 6f 6e 66 69 67 75 72 61 74 69   new Configurati
f8f0: 6f 6e 28 74 68 69 73 41 73 73 65 6d 62 6c 79 2c  on(thisAssembly,
f900: 20 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79   null, directory
f910: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
f920: 20 20 20 20 20 20 20 63 6f 72 65 46 69 6c 65 4e         coreFileN
f930: 61 6d 65 2c 20 6c 69 6e 71 46 69 6c 65 4e 61 6d  ame, linqFileNam
f940: 65 2c 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  e, designerFileN
f950: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
f960: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
f970: 70 73 2e 44 65 62 75 67 46 6f 72 6d 61 74 2c 20  ps.DebugFormat, 
f980: 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 46 6f  TraceOps.TraceFo
f990: 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
f9a0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 73 74 61             Insta
f9b0: 6c 6c 46 6c 61 67 73 2e 44 65 66 61 75 6c 74 2c  llFlags.Default,
f9c0: 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 44   TracePriority.D
f9d0: 65 66 61 75 6c 74 2c 0d 0a 20 20 20 20 20 20 20  efault,..       
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
f9f0: 63 65 50 72 69 6f 72 69 74 79 2e 44 65 66 61 75  cePriority.Defau
fa00: 6c 74 2c 20 74 72 75 65 2c 20 66 61 6c 73 65 2c  lt, true, false,
fa10: 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66   false, false, f
fa20: 61 6c 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  alse,..         
fa30: 20 20 20 20 20 20 20 20 20 20 20 66 61 6c 73 65             false
fa40: 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20  , false, false, 
fa50: 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66 61  false, false, fa
fa60: 6c 73 65 2c 20 74 72 75 65 2c 20 74 72 75 65 2c  lse, true, true,
fa70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fa80: 20 20 20 20 20 20 74 72 75 65 2c 20 66 61 6c 73        true, fals
fa90: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
faa0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
fab0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
fac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
faf0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
fb00: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
fb10: 69 63 20 62 6f 6f 6c 20 46 72 6f 6d 41 72 67 73  ic bool FromArgs
fb20: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
fb30: 20 20 20 73 74 72 69 6e 67 5b 5d 20 61 72 67 73     string[] args
fb40: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
fb50: 20 20 20 62 6f 6f 6c 20 73 74 72 69 63 74 2c 0d     bool strict,.
fb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fb70: 20 72 65 66 20 43 6f 6e 66 69 67 75 72 61 74 69   ref Configurati
fb80: 6f 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  on configuration
fb90: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
fba0: 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
fbb0: 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
fbc0: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
fbd0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
fbe0: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc10: 20 20 20 69 66 20 28 61 72 67 73 20 3d 3d 20 6e     if (args == n
fc20: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
fc40: 74 75 72 6e 20 74 72 75 65 3b 0d 0a 0d 0a 20 20  turn true;....  
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc60: 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61 74    if (configurat
fc70: 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ion == null)..  
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
fca0: 69 6f 6e 20 3d 20 43 6f 6e 66 69 67 75 72 61 74  ion = Configurat
fcb0: 69 6f 6e 2e 43 72 65 61 74 65 44 65 66 61 75 6c  ion.CreateDefaul
fcc0: 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  t();....        
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
fce0: 6c 65 6e 67 74 68 20 3d 20 61 72 67 73 2e 4c 65  length = args.Le
fcf0: 6e 67 74 68 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ngth;....       
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
fd10: 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30 3b   (int index = 0;
fd20: 20 69 6e 64 65 78 20 3c 20 6c 65 6e 67 74 68 3b   index < length;
fd30: 20 69 6e 64 65 78 2b 2b 29 0d 0a 20 20 20 20 20   index++)..     
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
fd50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fd60: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
fd70: 20 61 72 67 20 3d 20 61 72 67 73 5b 69 6e 64 65   arg = args[inde
fd80: 78 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  x];....         
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fda0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
fdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
fdc0: 54 45 3a 20 53 6b 69 70 20 61 6e 79 20 61 72 67  TE: Skip any arg
fdd0: 75 6d 65 6e 74 20 74 68 61 74 20 69 73 20 6e 75  ument that is nu
fde0: 6c 6c 20 28 3f 29 20 6f 72 20 61 6e 20 65 6d 70  ll (?) or an emp
fdf0: 74 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty..            
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
fe10: 20 20 20 20 20 73 74 72 69 6e 67 2e 0d 0a 20 20       string...  
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe50: 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e    if (String.IsN
fe60: 75 6c 6c 4f 72 45 6d 70 74 79 28 61 72 67 29 29  ullOrEmpty(arg))
fe70: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
fe90: 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  ntinue;....     
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fed0: 2f 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 67  / NOTE: We are g
fee0: 6f 69 6e 67 20 74 6f 20 6d 6f 64 69 66 79 20 74  oing to modify t
fef0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 61 72 67 75  he original argu
ff00: 6d 65 6e 74 0d 0a 20 20 20 20 20 20 20 20 20 20  ment..          
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
ff20: 20 20 20 20 20 20 20 62 79 20 72 65 6d 6f 76 69         by removi
ff30: 6e 67 20 61 6e 79 20 6c 65 61 64 69 6e 67 20 6f  ng any leading o
ff40: 70 74 69 6f 6e 20 63 68 61 72 61 63 74 65 72 73  ption characters
ff50: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
ff60: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
ff70: 20 20 20 20 74 68 65 72 65 66 6f 72 65 2c 20 77      therefore, w
ff80: 65 20 75 73 65 20 61 20 6e 65 77 20 73 74 72 69  e use a new stri
ff90: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 0d 0a  ng to hold the..
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
ffc0: 20 6d 6f 64 69 66 69 65 64 20 61 72 67 75 6d 65   modified argume
ffd0: 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nt...           
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
fff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10000 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
10010 6e 65 77 41 72 67 20 3d 20 61 72 67 3b 0d 0a 0d  newArg = arg;...
10020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10030 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c       // NOTE: Al
10060 6c 20 74 68 65 20 73 75 70 70 6f 72 74 65 64 20  l the supported 
10070 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
10080 69 6f 6e 73 20 6d 75 73 74 0d 0a 20 20 20 20 20  ions must..     
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 2f 2f 20 20 20 20 20 20 20 62 65 67 69     //       begi
100b0 6e 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e  n with an option
100c0 20 63 68 61 72 61 63 74 65 72 20 28 65 2e 67 2e   character (e.g.
100d0 20 61 20 6d 69 6e 75 73 0d 0a 20 20 20 20 20 20   a minus..      
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 2f 2f 20 20 20 20 20 20 20 6f 72 20 66 6f    //       or fo
10100 72 77 61 72 64 20 73 6c 61 73 68 29 3b 20 61 74  rward slash); at
10110 74 65 6d 70 74 20 74 6f 20 76 61 6c 69 64 61 74  tempt to validat
10120 65 20 74 68 61 74 0d 0a 20 20 20 20 20 20 20 20  e that..        
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 2f 2f 20 20 20 20 20 20 20 6e 6f 77 2e 20 20 49  //       now.  I
10150 66 20 77 65 20 66 61 69 6c 20 69 6e 20 73 74 72  f we fail in str
10160 69 63 74 20 6d 6f 64 65 2c 20 77 65 20 61 72 65  ict mode, we are
10170 20 64 6f 6e 65 3b 0d 0a 20 20 20 20 20 20 20 20   done;..        
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 2f 2f 20 20 20 20 20 20 20 6f 74 68 65 72 77 69  //       otherwi
101a0 73 65 2c 20 6a 75 73 74 20 73 6b 69 70 20 74 68  se, just skip th
101b0 69 73 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  is argument and 
101c0 61 64 76 61 6e 63 65 0d 0a 20 20 20 20 20 20 20  advance..       
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 2f 2f 20 20 20 20 20 20 20 74 6f 20 74 68 65   //       to the
101f0 20 6e 65 78 74 20 6f 6e 65 2e 0d 0a 20 20 20 20   next one...    
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10210 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 69 66 20 28 21 43 68 65 63 6b 4f 70 74 69 6f 6e  if (!CheckOption
10240 28 72 65 66 20 6e 65 77 41 72 67 29 29 0d 0a 20  (ref newArg)).. 
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72        error = Tr
10290 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54  aceOps.DebugAndT
102a0 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
102d0 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62  rity.Lowest, deb
102e0 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ugCallback,..   
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
10310 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
10320 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 73              "Uns
10350 75 70 70 6f 72 74 65 64 20 63 6f 6d 6d 61 6e 64  upported command
10360 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 3a 20   line argument: 
10370 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {0}",..         
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
103a0 79 28 61 72 67 29 29 2c 20 74 72 61 63 65 43 61  y(arg)), traceCa
103b0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
103e0 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
10410 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
10490 20 4e 4f 54 45 3a 20 41 6c 6c 20 74 68 65 20 73   NOTE: All the s
104a0 75 70 70 6f 72 74 65 64 20 63 6f 6d 6d 61 6e 64  upported command
104b0 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 6d 75   line options mu
104c0 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
104d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
104e0 20 20 20 20 20 68 61 76 65 20 61 20 76 61 6c 75       have a valu
104f0 65 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 61 74  e; therefore, at
10500 74 65 6d 70 74 20 74 6f 20 61 64 76 61 6e 63 65  tempt to advance
10510 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10520 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
10530 20 20 20 74 6f 20 69 74 20 6e 6f 77 2e 20 20 49     to it now.  I
10540 66 20 77 65 20 66 61 69 6c 2c 20 77 65 20 61 72  f we fail, we ar
10550 65 20 64 6f 6e 65 2e 0d 0a 20 20 20 20 20 20 20  e done...       
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
10590 65 78 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ex++;....       
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 69 66 20 28 69 6e 64 65 78 20 3e 3d 20 6c 65   if (index >= le
105c0 6e 67 74 68 29 0d 0a 20 20 20 20 20 20 20 20 20  ngth)..         
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
105e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
10600 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 44  ror = TraceOps.D
10610 65 62 75 67 41 6e 64 54 72 61 63 65 28 0d 0a 20  ebugAndTrace(.. 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
10640 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77  racePriority.Low
10650 65 73 74 2c 20 64 65 62 75 67 43 61 6c 6c 62 61  est, debugCallba
10660 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
10690 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
106a0 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 22 4d 69 73 73 69 6e 67 20 76 61 6c      "Missing val
106d0 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 3a 20 7b  ue for option: {
106e0 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  0}",..          
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
10710 28 61 72 67 29 29 2c 20 74 72 61 63 65 43 61 74  (arg)), traceCat
10720 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
10750 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10770 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
10780 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 62 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20   break;..       
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
107e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
107f0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
10800 45 3a 20 47 72 61 62 20 74 68 65 20 74 65 78 74  E: Grab the text
10810 75 61 6c 20 76 61 6c 75 65 20 6f 66 20 74 68 69  ual value of thi
10820 73 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0d 0a  s command line..
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
10850 20 6f 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20   option...      
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
10890 72 69 6e 67 20 74 65 78 74 20 3d 20 61 72 67 73  ring text = args
108a0 5b 69 6e 64 65 78 5d 3b 0d 0a 0d 0a 20 20 20 20  [index];....    
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 2f 2f 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20  // NOTE: Figure 
108f0 6f 75 74 20 77 68 69 63 68 20 63 6f 6d 6d 61 6e  out which comman
10900 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 74 68  d line option th
10910 69 73 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20  is is..         
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10930 2f 20 20 20 20 20 20 20 28 62 61 73 65 64 20 6f  /       (based o
10940 6e 20 61 20 70 61 72 74 69 61 6c 20 6e 61 6d 65  n a partial name
10950 20 6d 61 74 63 68 29 20 61 6e 64 20 74 68 65 6e   match) and then
10960 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20   try..          
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
10980 20 20 20 20 20 20 20 74 6f 20 69 6e 74 65 72 70         to interp
10990 72 65 74 20 74 68 65 20 74 65 78 74 75 61 6c 20  ret the textual 
109a0 76 61 6c 75 65 20 61 73 20 74 68 65 20 63 6f 72  value as the cor
109b0 72 65 63 74 0d 0a 20 20 20 20 20 20 20 20 20 20  rect..          
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
109d0 20 20 20 20 20 20 20 74 79 70 65 2e 0d 0a 20 20         type...  
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a10 20 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f    if (MatchOptio
10a20 6e 28 6e 65 77 41 72 67 2c 20 22 73 74 72 69 63  n(newArg, "stric
10a30 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  t"))..          
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
10a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
10a70 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
10a80 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
10a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
10ab0 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29   (value == null)
10ac0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
10ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b00 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
10b10 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28  s.DebugAndTrace(
10b20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
10b50 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62 75  ity.Lowest, debu
10b60 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20  gCallback,..    
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
10ba0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20     "Invalid {0} 
10be0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b  boolean value: {
10bf0 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
10c20 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69  play(arg), ForDi
10c30 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20  splay(text)),.. 
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
10c70 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c90 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74        if (strict
10ca0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
10cd0 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
10d00 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10d20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 2f 2f 20 4e 4f 54 45 3a 20 41 6c 6c 6f 77 20 74  // NOTE: Allow t
10d70 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
10d80 61 72 67 75 6d 65 6e 74 73 20 74 6f 0d 0a 20 20  arguments to..  
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
10db0 20 20 20 6f 76 65 72 72 69 64 65 20 74 68 65 20     override the 
10dc0 22 73 74 72 69 63 74 6e 65 73 73 22 20 73 65 74  "strictness" set
10dd0 74 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  ting..          
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 2f 2f 20 20 20 20 20 20 20 70 72 6f 76 69    //       provi
10e00 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
10e10 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 73 74 72 69 63 74 20 3d 20 28 62 6f 6f 6c 29 76  strict = (bool)v
10e60 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
10e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10e90 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
10ea0 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
10eb0 65 77 41 72 67 2c 20 22 6c 6f 67 46 69 6c 65 4e  ewArg, "logFileN
10ec0 61 6d 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ame"))..        
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
10f00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67  onfiguration.log
10f10 46 69 6c 65 4e 61 6d 65 20 3d 20 74 65 78 74 3b  FileName = text;
10f20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10f30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
10f60 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
10f70 2c 20 22 64 69 72 65 63 74 6f 72 79 22 29 29 0d  , "directory")).
10f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f90 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
10fc0 61 74 69 6f 6e 2e 64 69 72 65 63 74 6f 72 79 20  ation.directory 
10fd0 3d 20 74 65 78 74 3b 0d 0a 0d 0a 20 20 20 20 20  = text;....     
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
11020 2a 53 50 45 43 49 41 4c 2a 20 4d 75 73 74 20 72  *SPECIAL* Must r
11030 65 66 72 65 73 68 20 74 68 65 20 66 69 6c 65 20  efresh the file 
11040 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  names..         
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 20 20 20 2f 2f 20 20 20 20 20 20 20 68 65 72 65     //       here
11070 20 62 65 63 61 75 73 65 20 74 68 65 20 75 6e 64   because the und
11080 65 72 6c 79 69 6e 67 20 64 69 72 65 63 74 6f 72  erlying director
11090 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110b0 2f 20 20 20 20 20 20 20 68 61 73 20 63 68 61 6e  /       has chan
110c0 67 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ged...          
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c    string coreFil
11110 65 4e 61 6d 65 20 3d 20 63 6f 6e 66 69 67 75 72  eName = configur
11120 61 74 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61  ation.coreFileNa
11130 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me;....         
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11150 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49     if (!String.I
11160 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 6f 72  sNullOrEmpty(cor
11170 65 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  eFileName))..   
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 72               cor
111a0 65 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68  eFileName = Path
111b0 2e 47 65 74 46 69 6c 65 4e 61 6d 65 28 63 6f 72  .GetFileName(cor
111c0 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  eFileName);.... 
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 53             if (S
111f0 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d  tring.IsNullOrEm
11200 70 74 79 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65  pty(coreFileName
11210 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65      coreFileName
11240 20 3d 20 49 6e 73 74 61 6c 6c 65 72 2e 43 6f 72   = Installer.Cor
11250 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  eFileName;....  
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
11280 75 72 61 74 69 6f 6e 2e 63 6f 72 65 46 69 6c 65  uration.coreFile
11290 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62  Name = Path.Comb
112a0 69 6e 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ine(..          
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
112d0 69 6f 6e 2e 64 69 72 65 63 74 6f 72 79 2c 20 63  ion.directory, c
112e0 6f 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d  oreFileName);...
112f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
11310 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  ing linqFileName
11320 20 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   = configuration
11330 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a  .linqFileName;..
11340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
11360 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
11370 4f 72 45 6d 70 74 79 28 6c 69 6e 71 46 69 6c 65  OrEmpty(linqFile
11380 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20  Name))..        
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 20 20 20 6c 69 6e 71 46 69 6c 65          linqFile
113b0 4e 61 6d 65 20 3d 20 50 61 74 68 2e 47 65 74 46  Name = Path.GetF
113c0 69 6c 65 4e 61 6d 65 28 6c 69 6e 71 46 69 6c 65  ileName(linqFile
113d0 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
11400 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 6c  .IsNullOrEmpty(l
11410 69 6e 71 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20  inqFileName)).. 
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
11440 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 49 6e  inqFileName = In
11450 73 74 61 6c 6c 65 72 2e 4c 69 6e 71 46 69 6c 65  staller.LinqFile
11460 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  Name;....       
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
11490 6f 6e 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20  on.linqFileName 
114a0 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d  = Path.Combine(.
114b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64   configuration.d
114e0 69 72 65 63 74 6f 72 79 2c 20 6c 69 6e 71 46 69  irectory, linqFi
114f0 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  leName);....    
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64          string d
11520 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20  esignerFileName 
11530 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  = configuration.
11540 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  designerFileName
11550 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49 73 4e   if (!String.IsN
11580 75 6c 6c 4f 72 45 6d 70 74 79 28 64 65 73 69 67  ullOrEmpty(desig
11590 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20  nerFileName)).. 
115a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
115c0 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20  esignerFileName 
115d0 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e 61  = Path.GetFileNa
115e0 6d 65 28 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  me(designerFileN
115f0 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
11620 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 65  IsNullOrEmpty(de
11630 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29  signerFileName))
11640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61    designerFileNa
11670 6d 65 20 3d 20 49 6e 73 74 61 6c 6c 65 72 2e 44  me = Installer.D
11680 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b  esignerFileName;
11690 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 65  configuration.de
116c0 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d  signerFileName =
116d0 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d 0a   Path.Combine(..
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69  configuration.di
11710 72 65 63 74 6f 72 79 2c 20 64 65 73 69 67 6e 65  rectory, designe
11720 72 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20  rFileName);..   
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70  else if (MatchOp
11770 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 63 6f  tion(newArg, "co
11780 72 65 46 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20  reFileName")).. 
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
117d0 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61 6d 65  ion.coreFileName
117e0 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20   = text;..      
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
11820 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f  e if (MatchOptio
11830 6e 28 6e 65 77 41 72 67 2c 20 22 6c 69 6e 71 46  n(newArg, "linqF
11840 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20 20 20 20  ileName"))..    
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
11890 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
118a0 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
118c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
118d0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
118e0 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
118f0 65 77 41 72 67 2c 20 22 64 65 73 69 67 6e 65 72  ewArg, "designer
11900 46 69 6c 65 4e 61 6d 65 22 29 29 0d 0a 20 20 20  FileName"))..   
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
11950 6e 2e 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  n.designerFileNa
11960 6d 65 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20  me = text;..    
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
119a0 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74  lse if (MatchOpt
119b0 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 64 65 62  ion(newArg, "deb
119c0 75 67 46 6f 72 6d 61 74 22 29 29 0d 0a 20 20 20  ugFormat"))..   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
11a10 6e 2e 64 65 62 75 67 46 6f 72 6d 61 74 20 3d 20  n.debugFormat = 
11a20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75     TraceOps.Debu
11a50 67 46 6f 72 6d 61 74 20 3d 20 63 6f 6e 66 69 67  gFormat = config
11a60 75 72 61 74 69 6f 6e 2e 64 65 62 75 67 46 6f 72  uration.debugFor
11a70 6d 61 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  mat;..          
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
11a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11aa0 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
11ab0 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65   (MatchOption(ne
11ac0 77 41 72 67 2c 20 22 74 72 61 63 65 46 6f 72 6d  wArg, "traceForm
11ad0 61 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  at"))..         
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
11af0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
11b10 6e 66 69 67 75 72 61 74 69 6f 6e 2e 74 72 61 63  nfiguration.trac
11b20 65 46 6f 72 6d 61 74 20 3d 20 74 65 78 74 3b 0d  eFormat = text;.
11b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
11b50 63 65 4f 70 73 2e 54 72 61 63 65 46 6f 72 6d 61  ceOps.TraceForma
11b60 74 20 3d 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  t = configuratio
11b70 6e 2e 74 72 61 63 65 46 6f 72 6d 61 74 3b 0d 0a  n.traceFormat;..
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bb0 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
11bc0 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
11bd0 22 64 65 62 75 67 50 72 69 6f 72 69 74 79 22 29  "debugPriority")
11be0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
11bf0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c10 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
11c20 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 45 6e   value = ParseEn
11c30 75 6d 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  um(..           
11c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c50 20 20 20 20 20 74 79 70 65 6f 66 28 54 72 61 63       typeof(Trac
11c60 65 50 72 69 6f 72 69 74 79 29 2c 20 74 65 78 74  ePriority), text
11c70 2c 20 74 72 75 65 29 3b 0d 0a 0d 0a 20 20 20 20  , true);....    
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c90 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
11ca0 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
11cf0 20 3d 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75   = TraceOps.Debu
11d00 67 41 6e 64 54 72 61 63 65 28 0d 0a 20 20 20 20  gAndTrace(..    
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f  TracePriority.Lo
11d40 77 65 73 74 2c 20 64 65 62 75 67 43 61 6c 6c 62  west, debugCallb
11d50 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ack,..          
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
11d80 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
11d90 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
11dc0 76 61 6c 69 64 20 7b 30 7d 20 76 61 6c 75 65 3a  valid {0} value:
11dd0 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
11e00 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72  isplay(arg), For
11e10 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d  Display(text)),.
11e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e40 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
11e50 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
11e80 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11eb0 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
11ee0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
11f30 64 65 62 75 67 50 72 69 6f 72 69 74 79 20 3d 20  debugPriority = 
11f40 28 54 72 61 63 65 50 72 69 6f 72 69 74 79 29 76  (TracePriority)v
11f50 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75     TraceOps.Debu
11f80 67 50 72 69 6f 72 69 74 79 20 3d 20 63 6f 6e 66  gPriority = conf
11f90 69 67 75 72 61 74 69 6f 6e 2e 64 65 62 75 67 50  iguration.debugP
11fa0 72 69 6f 72 69 74 79 3b 0d 0a 20 20 20 20 20 20  riority;..      
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
11fe0 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f  e if (MatchOptio
11ff0 6e 28 6e 65 77 41 72 67 2c 20 22 74 72 61 63 65  n(newArg, "trace
12000 50 72 69 6f 72 69 74 79 22 29 29 0d 0a 20 20 20  Priority"))..   
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65      object value
12050 20 3d 20 50 61 72 73 65 45 6e 75 6d 28 0d 0a 20   = ParseEnum(.. 
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12080 79 70 65 6f 66 28 54 72 61 63 65 50 72 69 6f 72  ypeof(TracePrior
12090 69 74 79 29 2c 20 74 65 78 74 2c 20 74 72 75 65  ity), text, true
120a0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e    if (value == n
120d0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12110 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
12120 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72  ceOps.DebugAndTr
12130 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50            TraceP
12160 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20  riority.Lowest, 
12170 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a  debugCallback,..
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121a0 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
121b0 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
121c0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121e0 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20         "Invalid 
121f0 7b 30 7d 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c  {0} value: {1}",
12200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
12230 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61  (arg), ForDispla
12240 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20  y(text)),..     
12250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
12270 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
12280 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
122e0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
12350 69 67 75 72 61 74 69 6f 6e 2e 74 72 61 63 65 50  iguration.traceP
12360 72 69 6f 72 69 74 79 20 3d 20 28 54 72 61 63 65  riority = (Trace
12370 50 72 69 6f 72 69 74 79 29 76 61 6c 75 65 3b 0d  Priority)value;.
12380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12390 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
123a0 63 65 4f 70 73 2e 54 72 61 63 65 50 72 69 6f 72  ceOps.TracePrior
123b0 69 74 79 20 3d 20 63 6f 6e 66 69 67 75 72 61 74  ity = configurat
123c0 69 6f 6e 2e 74 72 61 63 65 50 72 69 6f 72 69 74  ion.tracePriorit
123d0 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y;..            
123e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
12410 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41  MatchOption(newA
12420 72 67 2c 20 22 69 6e 73 74 61 6c 6c 22 29 29 0d  rg, "install")).
12430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12440 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61          bool? va
12470 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65  lue = ParseBoole
12480 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20  an(text);....   
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
124b0 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ue == null)..   
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
12500 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 44 65 62  r = TraceOps.Deb
12510 75 67 41 6e 64 54 72 61 63 65 28 0d 0a 20 20 20  ugAndTrace(..   
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12540 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c   TracePriority.L
12550 6f 77 65 73 74 2c 20 64 65 62 75 67 43 61 6c 6c  owest, debugCall
12560 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12590 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
125a0 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
125d0 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65  nvalid {0} boole
125e0 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d  an value: {1}",.
125f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28       ForDisplay(
12620 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79  arg), ForDisplay
12630 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20  (text)),..      
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
12660 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
12670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12690 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20   if (strict)..  
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
126d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20     continue;..  
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
12740 67 75 72 61 74 69 6f 6e 2e 69 6e 73 74 61 6c 6c  guration.install
12750 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d   = (bool)value;.
12760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12770 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
127a0 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
127b0 20 22 69 6e 73 74 61 6c 6c 46 6c 61 67 73 22 29   "installFlags")
127c0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
127d0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
12800 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 45 6e   value = ParseEn
12810 75 6d 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  um(..           
12820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12830 20 20 20 20 20 74 79 70 65 6f 66 28 49 6e 73 74       typeof(Inst
12840 61 6c 6c 46 6c 61 67 73 29 2c 20 74 65 78 74 2c  allFlags), text,
12850 20 74 72 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20   true);....     
12860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12870 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
12880 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128c0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
128d0 3d 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67  = TraceOps.Debug
128e0 41 6e 64 54 72 61 63 65 28 0d 0a 20 20 20 20 20  AndTrace(..     
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
12910 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77  racePriority.Low
12920 65 73 74 2c 20 64 65 62 75 67 43 61 6c 6c 62 61  est, debugCallba
12930 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
12940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12950 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
12960 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
12970 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76              "Inv
129a0 61 6c 69 64 20 69 6e 73 74 61 6c 6c 20 66 6c 61  alid install fla
129b0 67 73 20 76 61 6c 75 65 3a 20 7b 30 7d 22 2c 0d  gs value: {0}",.
129c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
129d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129e0 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28       ForDisplay(
129f0 74 65 78 74 29 29 2c 20 74 72 61 63 65 43 61 74  text)), traceCat
12a00 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
12a30 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12a60 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
12a90 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
12ae0 6f 6e 2e 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20  on.installFlags 
12af0 3d 20 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 29  = (InstallFlags)
12b00 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
12b30 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
12b40 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28  if (MatchOption(
12b50 6e 65 77 41 72 67 2c 20 22 6e 6f 52 75 6e 74 69  newArg, "noRunti
12b60 6d 65 56 65 72 73 69 6f 6e 22 29 29 0d 0a 20 20  meVersion"))..  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65       bool? value
12bb0 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28   = ParseBoolean(
12bc0 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  text);....      
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
12bf0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
12c40 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41   TraceOps.DebugA
12c50 6e 64 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  ndTrace(..      
12c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
12c80 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65  acePriority.Lowe
12c90 73 74 2c 20 64 65 62 75 67 43 61 6c 6c 62 61 63  st, debugCallbac
12ca0 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
12cd0 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
12ce0 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61             "Inva
12d10 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20  lid {0} boolean 
12d20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20  value: {1}",..  
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
12d60 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65  ), ForDisplay(te
12d70 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  xt)),..         
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
12da0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
12dd0 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20   (strict)..     
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12e00 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e30 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
12e80 61 74 69 6f 6e 2e 6e 6f 52 75 6e 74 69 6d 65 56  ation.noRuntimeV
12e90 65 72 73 69 6f 6e 20 3d 20 28 62 6f 6f 6c 29 76  ersion = (bool)v
12ea0 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
12ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12ed0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
12ee0 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
12ef0 65 77 41 72 67 2c 20 22 74 68 72 6f 77 4f 6e 4d  ewArg, "throwOnM
12f00 69 73 73 69 6e 67 22 29 29 0d 0a 20 20 20 20 20  issing"))..     
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
12f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f40 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20    bool? value = 
12f50 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78  ParseBoolean(tex
12f60 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t);....         
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f80 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20     if (value == 
12f90 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72        error = Tr
12fe0 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54  aceOps.DebugAndT
12ff0 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20  race(..         
13000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13010 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
13020 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c  Priority.Lowest,
13030 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d   debugCallback,.
13040 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
13070 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
13080 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64          "Invalid
130b0 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   {0} boolean val
130c0 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  ue: {1}",..     
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
130f0 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20  orDisplay(arg), 
13100 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
13110 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
13140 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
13170 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
131a0 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
131d0 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
13220 6f 6e 2e 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e  on.throwOnMissin
13230 67 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b  g = (bool)value;
13240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13250 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
13280 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
13290 2c 20 22 77 68 61 74 49 66 22 29 29 0d 0a 20 20  , "whatIf"))..  
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65       bool? value
132e0 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28   = ParseBoolean(
132f0 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  text);....      
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13310 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
13320 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13360 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
13370 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41   TraceOps.DebugA
13380 6e 64 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20  ndTrace(..      
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
133b0 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 65  acePriority.Lowe
133c0 73 74 2c 20 64 65 62 75 67 43 61 6c 6c 62 61 63  st, debugCallbac
133d0 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
13400 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
13410 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61             "Inva
13440 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20  lid {0} boolean 
13450 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20  value: {1}",..  
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
13490 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65  ), ForDisplay(te
134a0 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  xt)),..         
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
134d0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
13500 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20   (strict)..     
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13530 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13560 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
135b0 61 74 69 6f 6e 2e 77 68 61 74 49 66 20 3d 20 28  ation.whatIf = (
135c0 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20  bool)value;..   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70  else if (MatchOp
13610 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 76 65  tion(newArg, "ve
13620 72 62 6f 73 65 22 29 29 0d 0a 20 20 20 20 20 20  rbose"))..      
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13640 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50   bool? value = P
13670 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74  arseBoolean(text
13680 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e    if (value == n
136b0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
13700 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72  ceOps.DebugAndTr
13710 61 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ace(..          
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50            TraceP
13740 72 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20  riority.Lowest, 
13750 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a  debugCallback,..
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
13790 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
137a0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20         "Invalid 
137d0 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  {0} boolean valu
137e0 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20  e: {1}",..      
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
13810 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46  rDisplay(arg), F
13820 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29  orDisplay(text))
13830 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13850 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
13860 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
13890 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  rict)..         
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
138c0 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  n false;....    
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
138f0 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
13940 6e 2e 76 65 72 62 6f 73 65 20 3d 20 28 62 6f 6f  n.verbose = (boo
13950 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20  l)value;..      
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
13990 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f  e if (MatchOptio
139a0 6e 28 6e 65 77 41 72 67 2c 20 22 63 6f 6e 66 69  n(newArg, "confi
139b0 72 6d 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  rm"))..         
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
139d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
139f0 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73  ol? value = Pars
13a00 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d  eBoolean(text);.
13a10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
13a30 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
13a40 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
13a60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a80 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f    error = TraceO
13a90 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65  ps.DebugAndTrace
13aa0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
13ad0 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62  rity.Lowest, deb
13ae0 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ugCallback,..   
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b10 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
13b20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d      "Invalid {0}
13b60 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
13b70 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
13ba0 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44  splay(arg), ForD
13bb0 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a  isplay(text)),..
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13be0 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
13bf0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c10 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
13c20 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
13c50 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
13c80 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ca0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63   configuration.c
13cd0 6f 6e 66 69 72 6d 20 3d 20 28 62 6f 6f 6c 29 76  onfirm = (bool)v
13ce0 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
13d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13d10 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
13d20 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
13d30 65 77 41 72 67 2c 20 22 6e 6f 44 65 73 6b 74 6f  ewArg, "noDeskto
13d40 70 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  p"))..          
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
13d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
13d80 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
13d90 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
13da0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
13dc0 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29   (value == null)
13dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
13df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
13e20 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28  s.DebugAndTrace(
13e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
13e60 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62 75  ity.Lowest, debu
13e70 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20  gCallback,..    
13e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
13eb0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20     "Invalid {0} 
13ef0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b  boolean value: {
13f00 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
13f30 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69  play(arg), ForDi
13f40 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20  splay(text)),.. 
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
13f80 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74        if (strict
13fb0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
13fe0 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
14010 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
14030 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14050 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
14060 44 65 73 6b 74 6f 70 20 3d 20 28 62 6f 6f 6c 29  Desktop = (bool)
14070 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
140a0 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
140b0 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28  if (MatchOption(
140c0 6e 65 77 41 72 67 2c 20 22 6e 6f 43 6f 6d 70 61  newArg, "noCompa
140d0 63 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ct"))..         
140e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
140f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
14110 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73  ol? value = Pars
14120 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d  eBoolean(text);.
14130 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
14150 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
14160 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
14180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f    error = TraceO
141b0 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65  ps.DebugAndTrace
141c0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f         TracePrio
141f0 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62  rity.Lowest, deb
14200 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ugCallback,..   
14210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
14240 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d      "Invalid {0}
14280 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
14290 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
142c0 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44  splay(arg), ForD
142d0 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a  isplay(text)),..
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
14310 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
14340 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
14370 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
143a0 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e   configuration.n
143f0 6f 43 6f 6d 70 61 63 74 20 3d 20 28 62 6f 6f 6c  oCompact = (bool
14400 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14420 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
14430 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
14440 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
14450 28 6e 65 77 41 72 67 2c 20 22 6e 6f 4e 65 74 46  (newArg, "noNetF
14460 78 32 30 22 29 29 0d 0a 20 20 20 20 20 20 20 20  x20"))..        
14470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14480 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
144a0 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72  ool? value = Par
144b0 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b  seBoolean(text);
144c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
144f0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65     error = Trace
14540 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63  Ops.DebugAndTrac
14550 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69          TracePri
14580 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65  ority.Lowest, de
14590 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20  bugCallback,..  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c    traceCallback,
145d0 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
145e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
14610 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
14620 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14640 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
14650 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72  isplay(arg), For
14660 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d  Display(text)),.
14670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
146a0 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
146d0 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14700 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
14730 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
14780 6e 6f 4e 65 74 46 78 32 30 20 3d 20 28 62 6f 6f  noNetFx20 = (boo
14790 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20  l)value;..      
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147b0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
147c0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
147d0 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f  e if (MatchOptio
147e0 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 4e 65 74  n(newArg, "noNet
147f0 46 78 34 30 22 29 29 0d 0a 20 20 20 20 20 20 20  Fx40"))..       
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14830 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61  bool? value = Pa
14840 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29  rseBoolean(text)
14850 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75   if (value == nu
14880 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63      error = Trac
148d0 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
148e0 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72           TracePr
14910 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64  iority.Lowest, d
14920 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20  ebugCallback,.. 
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14950 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
14960 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
14970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b        "Invalid {
149a0 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  0} boolean value
149b0 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {1}",..       
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
149e0 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f  Display(arg), Fo
149f0 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c  rDisplay(text)),
14a00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
14a30 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a50 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
14a60 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ict)..          
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14a90 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
14ac0 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
14ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ae0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b00 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
14b10 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 28 62 6f  .noNetFx40 = (bo
14b20 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  ol)value;..     
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
14b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
14b60 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
14b70 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 56 73  on(newArg, "noVs
14b80 32 30 30 38 22 29 29 0d 0a 20 20 20 20 20 20 20  2008"))..       
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61  bool? value = Pa
14bd0 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29  rseBoolean(text)
14be0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75   if (value == nu
14c10 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63      error = Trac
14c60 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
14c70 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce(..           
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72           TracePr
14ca0 69 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64  iority.Lowest, d
14cb0 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20  ebugCallback,.. 
14cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ce0 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
14cf0 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
14d00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b        "Invalid {
14d30 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  0} boolean value
14d40 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {1}",..       
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
14d70 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f  Display(arg), Fo
14d80 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c  rDisplay(text)),
14d90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
14dc0 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
14df0 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ict)..          
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14e20 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
14e50 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
14ea0 2e 6e 6f 56 73 32 30 30 38 20 3d 20 28 62 6f 6f  .noVs2008 = (boo
14eb0 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20  l)value;..      
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
14ef0 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f  e if (MatchOptio
14f00 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 56 73 32  n(newArg, "noVs2
14f10 30 31 30 22 29 29 0d 0a 20 20 20 20 20 20 20 20  010"))..        
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
14f50 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72  ool? value = Par
14f60 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b  seBoolean(text);
14f70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
14fa0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fe0 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65     error = Trace
14ff0 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63  Ops.DebugAndTrac
15000 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 20 20 20 54 72 61 63 65 50 72 69          TracePri
15030 6f 72 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65  ority.Lowest, de
15040 62 75 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20  bugCallback,..  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15070 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c    traceCallback,
15080 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
15090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
150c0 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
150d0 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
15100 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72  isplay(arg), For
15110 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d  Display(text)),.
15120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
15150 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
15180 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
151b0 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
151e0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
15230 6e 6f 56 73 32 30 31 30 20 3d 20 28 62 6f 6f 6c  noVs2010 = (bool
15240 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
15250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15260 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
15270 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
15280 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e   if (MatchOption
15290 28 6e 65 77 41 72 67 2c 20 22 6e 6f 54 72 61 63  (newArg, "noTrac
152a0 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  e"))..          
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
152c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
152e0 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65  l? value = Parse
152f0 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a  Boolean(text);..
15300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15320 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29   (value == null)
15330 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
15350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
15380 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28  s.DebugAndTrace(
15390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72        TracePrior
153c0 69 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62 75  ity.Lowest, debu
153d0 67 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20  gCallback,..    
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
15410 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20     "Invalid {0} 
15450 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b  boolean value: {
15460 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
15490 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69  play(arg), ForDi
154a0 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20  splay(text)),.. 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
154e0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74        if (strict
15510 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
15540 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
15550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15560 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15570 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
15580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
15590 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
155c0 54 72 61 63 65 20 3d 20 28 62 6f 6f 6c 29 76 61  Trace = (bool)va
155d0 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lue;..          
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
155f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15600 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
15610 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65   (MatchOption(ne
15620 77 41 72 67 2c 20 22 6e 6f 43 6f 6e 73 6f 6c 65  wArg, "noConsole
15630 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
15670 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42  ? value = ParseB
15680 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d  oolean(text);...
15690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
156b0 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d  (value == null).
156c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15700 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73  error = TraceOps
15710 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 0d  .DebugAndTrace(.
15720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15740 20 20 20 20 20 54 72 61 63 65 50 72 69 6f 72 69       TracePriori
15750 74 79 2e 4c 6f 77 65 73 74 2c 20 64 65 62 75 67  ty.Lowest, debug
15760 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20  Callback,..     
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
15790 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
157a0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157d0 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62    "Invalid {0} b
157e0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31  oolean value: {1
157f0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
15820 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73  lay(arg), ForDis
15830 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20  play(text)),..  
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15860 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
15870 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29       if (strict)
158a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
158d0 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15900 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
15920 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
15940 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 43  onfiguration.noC
15950 6f 6e 73 6f 6c 65 20 3d 20 28 62 6f 6f 6c 29 76  onsole = (bool)v
15960 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
15980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15990 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
159a0 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
159b0 65 77 41 72 67 2c 20 22 6e 6f 4c 6f 67 22 29 29  ewArg, "noLog"))
159c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
159d0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76           bool? v
15a00 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c  alue = ParseBool
15a10 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20  ean(text);....  
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
15a40 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a60 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
15a90 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 44 65  or = TraceOps.De
15aa0 62 75 67 41 6e 64 54 72 61 63 65 28 0d 0a 20 20  bugAndTrace(..  
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e    TracePriority.
15ae0 4c 6f 77 65 73 74 2c 20 64 65 62 75 67 43 61 6c  Lowest, debugCal
15af0 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20  lback,..        
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
15b20 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
15b30 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15b60 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c  Invalid {0} bool
15b70 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c  ean value: {1}",
15b80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
15bb0 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61  (arg), ForDispla
15bc0 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20  y(text)),..     
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
15bf0 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
15c00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
15c60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
15cd0 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 4c 6f 67 20  iguration.noLog 
15ce0 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a  = (bool)value;..
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73  error = TraceOps
15d70 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 0d  .DebugAndTrace(.
15d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c   TracePriority.L
15db0 6f 77 65 73 74 2c 20 64 65 62 75 67 43 61 6c 6c  owest, debugCall
15dc0 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
15df0 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
15e00 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72 74        "Unsupport
15e30 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ed command line 
15e40 6f 70 74 69 6f 6e 3a 20 7b 30 7d 22 2c 0d 0a 20  option: {0}",.. 
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
15e70 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 29 2c  orDisplay(arg)),
15e80 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
15e90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20  if (strict)..   
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
15ee0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
15f10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
15f40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15f50 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
15f60 20 20 20 20 20 63 61 74 63 68 20 28 45 78 63 65       catch (Exce
15f70 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20 20 20 20  ption e)..      
15f80 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fa0 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41   TraceOps.DebugA
15fb0 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72 69  ndTrace(TracePri
15fc0 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a  ority.Highest,..
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61 6c          debugCal
15ff0 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c  lback, traceCall
16000 62 61 63 6b 2c 20 65 2c 20 74 72 61 63 65 43 61  back, e, traceCa
16010 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 65 72 72 6f 72 20 3d 20 22 46 61 69 6c 65 64 20  error = "Failed 
16040 74 6f 20 6d 6f 64 69 66 79 20 63 6f 6e 66 69 67  to modify config
16050 75 72 61 74 69 6f 6e 2e 22 3b 0d 0a 20 20 20 20  uration.";..    
16060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
16070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16080 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
16090 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
160a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
160b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
160c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
160d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
160e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
160f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16100 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 62 6f  public static bo
16110 6f 6c 20 50 72 6f 63 65 73 73 28 0d 0a 20 20 20  ol Process(..   
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
16130 69 6e 67 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20  ing[] args,..   
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e               Con
16150 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69  figuration confi
16160 67 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20  guration,..     
16170 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
16180 73 74 72 69 63 74 2c 0d 0a 20 20 20 20 20 20 20  strict,..       
16190 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
161a0 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ing error..     
161b0 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
161c0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79               try
161e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
161f0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
16200 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
16210 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75  figuration == nu
16220 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
16230 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 65 72 72 6f 72 20 3d 20 22 49 6e 76      error = "Inv
16260 61 6c 69 64 20 63 6f 6e 66 69 67 75 72 61 74 69  alid configurati
16270 6f 6e 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  on.";..         
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16290 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
162c0 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d             Assem
162d0 62 6c 79 20 61 73 73 65 6d 62 6c 79 20 3d 20 63  bly assembly = c
162e0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 61 73 73  onfiguration.ass
162f0 65 6d 62 6c 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  embly;....      
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16310 20 28 61 73 73 65 6d 62 6c 79 20 3d 3d 20 6e 75   (assembly == nu
16320 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
16330 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 20 20 20 20 65 72 72 6f 72 20 3d 20 22 49 6e 76      error = "Inv
16360 61 6c 69 64 20 61 73 73 65 6d 62 6c 79 2e 22 3b  alid assembly.";
16370 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16380 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16390 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
163b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
163c0 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69        if (!confi
163d0 67 75 72 61 74 69 6f 6e 2e 6e 6f 54 72 61 63 65  guration.noTrace
163e0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
163f0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
16400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16410 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61    if (!configura
16420 74 69 6f 6e 2e 6e 6f 4c 6f 67 20 26 26 0d 0a 20  tion.noLog &&.. 
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
16450 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28  g.IsNullOrEmpty(
16460 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f  configuration.lo
16470 67 46 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20  gFileName))..   
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164b0 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
164c0 6e 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20  n.logFileName = 
164d0 47 65 74 4c 6f 67 46 69 6c 65 4e 61 6d 65 28 29  GetLogFileName()
164e0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
164f0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
16520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
16540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
16550 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16560 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
16570 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
16580 43 6f 6e 73 6f 6c 65 29 0d 0a 20 20 20 20 20 20  Console)..      
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 2f 2f 20 4e 4f 54 45 3a 20 49 6e 20 76 65 72   // NOTE: In ver
165f0 62 6f 73 65 20 6d 6f 64 65 2c 20 64 65 62 75 67  bose mode, debug
16600 20 6f 75 74 70 75 74 20 28 74 68 61 74 20 6d 65   output (that me
16610 65 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ets..           
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 63 6f   //       the co
16640 6e 66 69 67 75 72 65 64 20 70 72 69 6f 72 69 74  nfigured priorit
16650 79 20 63 72 69 74 65 72 69 61 29 20 77 69 6c 6c  y criteria) will
16660 20 62 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20   be..           
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 2f 2f 20 20 20 20 20 20 20 64 69 73 70 6c 61   //       displa
16690 79 65 64 20 74 6f 20 74 68 65 20 63 6f 6e 73 6f  yed to the conso
166a0 6c 65 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  le; otherwise, t
166b0 72 61 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20  race..          
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 2f 2f 20 20 20 20 20 20 20 6f 75 74 70 75    //       outpu
166e0 74 20 28 74 68 61 74 20 6d 65 65 74 73 20 74 68  t (that meets th
166f0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 70 72 69  e configured pri
16700 6f 72 69 74 79 0d 0a 20 20 20 20 20 20 20 20 20  ority..         
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 2f 2f 20 20 20 20 20 20 20 63 72 69 74     //       crit
16730 65 72 69 61 29 20 77 69 6c 6c 20 62 65 20 64 69  eria) will be di
16740 73 70 6c 61 79 65 64 20 74 6f 20 74 68 65 20 63  splayed to the c
16750 6f 6e 73 6f 6c 65 2e 0d 0a 20 20 20 20 20 20 20  onsole...       
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67       if (!config
167a0 75 72 61 74 69 6f 6e 2e 76 65 72 62 6f 73 65 29  uration.verbose)
167b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
167d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 20 54 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73   Trace.Listeners
16800 2e 41 64 64 28 6e 65 77 20 43 6f 6e 73 6f 6c 65  .Add(new Console
16810 54 72 61 63 65 4c 69 73 74 65 6e 65 72 28 29 29  TraceListener())
16820 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
16840 0d 0a 23 69 66 20 44 45 42 55 47 0d 0a 20 20 20  ..#if DEBUG..   
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
16870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16880 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
168b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 2f 2f 20 4e 4f 54 45 3a 20 46 6f 72 20 61    // NOTE: For a
168e0 20 62 75 69 6c 64 20 77 69 74 68 20 22 44 45 42   build with "DEB
168f0 55 47 22 20 64 65 66 69 6e 65 64 2c 20 77 65 0d  UG" defined, we.
16900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16920 20 2f 2f 20 20 20 20 20 20 20 63 61 6e 20 73 69   //       can si
16930 6d 70 6c 79 20 75 73 65 20 74 68 65 20 44 65 62  mply use the Deb
16940 75 67 20 63 6c 61 73 73 3b 0d 0a 20 20 20 20 20  ug class;..     
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16960 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
16970 20 20 20 20 6f 74 68 65 72 77 69 73 65 2c 20 74      otherwise, t
16980 68 65 20 63 6f 6e 73 6f 6c 65 20 77 69 6c 6c 20  he console will 
16990 62 65 20 75 73 65 64 0d 0a 20 20 20 20 20 20 20  be used..       
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
169c0 20 20 64 69 72 65 63 74 6c 79 20 28 62 79 20 44    directly (by D
169d0 65 62 75 67 43 6f 72 65 29 2e 0d 0a 20 20 20 20  ebugCore)...    
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 44 65 62 75 67 2e 4c 69 73 74 65 6e 65 72 73 2e  Debug.Listeners.
16a30 41 64 64 28 6e 65 77 20 43 6f 6e 73 6f 6c 65 54  Add(new ConsoleT
16a40 72 61 63 65 4c 69 73 74 65 6e 65 72 28 29 29 3b  raceListener());
16a50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
16a70 0a 23 65 6e 64 69 66 0d 0a 20 20 20 20 20 20 20  .#endif..       
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
16ab0 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!configuration
16ac0 2e 6e 6f 4c 6f 67 20 26 26 0d 0a 20 20 20 20 20  .noLog &&..     
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 20 20 20 21 53 74 72 69 6e 67 2e 49         !String.I
16af0 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 6f 6e  sNullOrEmpty(con
16b00 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67 46 69  figuration.logFi
16b10 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20  leName))..      
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 54 72 61 63 65 2e 4c 69 73 74 65 6e 65 72 73   Trace.Listeners
16b60 2e 41 64 64 28 6e 65 77 20 54 65 78 74 57 72 69  .Add(new TextWri
16b70 74 65 72 54 72 61 63 65 4c 69 73 74 65 6e 65 72  terTraceListener
16b80 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
16bb0 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 3b 0d  .logFileName));.
16bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16bd0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
16c00 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 2f 2f 20 4e 4f 54 45 3a 20 44 75 6d 70 20 74   // NOTE: Dump t
16c30 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
16c40 20 6e 6f 77 20 69 6e 20 63 61 73 65 20 77 65 20   now in case we 
16c50 6e 65 65 64 20 74 6f 0d 0a 20 20 20 20 20 20 20  need to..       
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16c70 20 20 20 20 20 20 74 72 6f 75 62 6c 65 73 68 6f        troublesho
16c80 6f 74 20 61 6e 79 20 69 73 73 75 65 73 2e 0d 0a  ot any issues...
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
16cc0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 65  configuration.de
16cd0 62 75 67 50 72 69 6f 72 69 74 79 20 3c 3d 20 54  bugPriority <= T
16ce0 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4d 65 64  racePriority.Med
16cf0 69 75 6d 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ium)..          
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
16d10 6e 66 69 67 75 72 61 74 69 6f 6e 2e 44 75 6d 70  nfiguration.Dump
16d20 28 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 29 3b  (debugCallback);
16d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
16d40 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66          if (conf
16d50 69 67 75 72 61 74 69 6f 6e 2e 74 72 61 63 65 50  iguration.traceP
16d60 72 69 6f 72 69 74 79 20 3c 3d 20 54 72 61 63 65  riority <= Trace
16d70 50 72 69 6f 72 69 74 79 2e 4d 65 64 69 75 6d 29  Priority.Medium)
16d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16d90 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
16da0 75 72 61 74 69 6f 6e 2e 44 75 6d 70 28 74 72 61  uration.Dump(tra
16db0 63 65 43 61 6c 6c 62 61 63 6b 29 3b 0d 0a 0d 0a  ceCallback);....
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
16de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
16df0 4f 54 45 3a 20 53 68 6f 77 20 77 68 65 72 65 20  OTE: Show where 
16e00 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 66  we are running f
16e10 72 6f 6d 20 61 6e 64 20 68 6f 77 20 77 65 20 77  rom and how we w
16e20 65 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ere..           
16e30 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
16e40 20 20 69 6e 76 6f 6b 65 64 2e 0d 0a 20 20 20 20    invoked...    
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e60 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
16e70 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6c          string l
16e80 6f 63 61 74 69 6f 6e 20 3d 20 61 73 73 65 6d 62  ocation = assemb
16e90 6c 79 2e 4c 6f 63 61 74 69 6f 6e 3b 0d 0a 0d 0a  ly.Location;....
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 20 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62      TraceOps.Deb
16ec0 75 67 41 6e 64 54 72 61 63 65 28 54 72 61 63 65  ugAndTrace(Trace
16ed0 50 72 69 6f 72 69 74 79 2e 4d 65 64 69 75 6d 2c  Priority.Medium,
16ee0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16ef0 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43            debugC
16f00 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61  allback, traceCa
16f10 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
16f20 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 22 52 75 6e 6e 69 6e 67 20 65 78 65 63 75 74 61  "Running executa
16f50 62 6c 65 20 69 73 3a 20 7b 30 7d 22 2c 20 46 6f  ble is: {0}", Fo
16f60 72 44 69 73 70 6c 61 79 28 6c 6f 63 61 74 69 6f  rDisplay(locatio
16f70 6e 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  n)),..          
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
16f90 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
16fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fb0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65       TraceOps.De
16fc0 62 75 67 41 6e 64 54 72 61 63 65 28 54 72 61 63  bugAndTrace(Trac
16fd0 65 50 72 69 6f 72 69 74 79 2e 4d 65 64 69 75 6d  ePriority.Medium
16fe0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
16ff0 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67             debug
17000 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43  Callback, traceC
17010 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
17020 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
17030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17040 20 22 4f 72 69 67 69 6e 61 6c 20 63 6f 6d 6d 61   "Original comma
17050 6e 64 20 6c 69 6e 65 20 69 73 3a 20 7b 30 7d 22  nd line is: {0}"
17060 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
17070 20 20 20 20 20 20 20 20 20 20 20 45 6e 76 69 72             Envir
17080 6f 6e 6d 65 6e 74 2e 43 6f 6d 6d 61 6e 64 4c 69  onment.CommandLi
17090 6e 65 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f  ne), traceCatego
170a0 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
170b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
170c0 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 77  !configuration.w
170d0 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
170e0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74     // NOTE: If t
17130 68 65 20 64 65 62 75 67 67 65 72 20 69 73 20 61  he debugger is a
17140 74 74 61 63 68 65 64 20 61 6e 64 20 57 68 61 74  ttached and What
17150 2d 49 66 20 6d 6f 64 65 0d 0a 20 20 20 20 20 20  -If mode..      
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 2f 2f 20 20 20 20 20 20 20 69 73 20 5b 6e    //       is [n
17180 6f 77 5d 20 64 69 73 61 62 6c 65 64 2c 20 69 73  ow] disabled, is
17190 73 75 65 20 61 20 77 61 72 6e 69 6e 67 2e 0d 0a  sue a warning...
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 69 66 20 28 44 65 62 75 67 67 65 72      if (Debugger
171e0 2e 49 73 41 74 74 61 63 68 65 64 29 0d 0a 20 20  .IsAttached)..  
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
17210 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65  ps.DebugAndTrace
17220 28 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4d  (TracePriority.M
17230 65 64 69 75 6d 2c 0d 0a 20 20 20 20 20 20 20 20  edium,..        
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61 6c          debugCal
17260 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c  lback, traceCall
17270 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 20 20 20 20 22 46 6f 72 63 65 64 20 74         "Forced t
172a0 6f 20 64 69 73 61 62 6c 65 20 5c 22 77 68 61 74  o disable \"what
172b0 2d 69 66 5c 22 20 6d 6f 64 65 20 77 69 74 68 20  -if\" mode with 
172c0 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " +..           
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 22 64 65 62 75 67 67 65 72 20 61       "debugger a
172f0 74 74 61 63 68 65 64 2e 22 2c 20 74 72 61 63 65  ttached.", trace
17300 43 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20  Category);..    
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
17330 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20         else..   
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17360 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
17370 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
17380 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
17390 2e 48 69 67 68 65 72 2c 0d 0a 20 20 20 20 20 20  .Higher,..      
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62        debugCallb
173c0 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  ack, traceCallba
173d0 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ck,..           
173e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173f0 20 22 4e 6f 20 61 63 74 75 61 6c 20 63 68 61 6e   "No actual chan
17400 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ges will be made
17410 20 74 6f 20 74 68 69 73 20 22 20 2b 0d 0a 20 20   to this " +..  
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 20 20 20 20 20 20 20 20 22 73 79 73 74 65            "syste
17440 6d 20 62 65 63 61 75 73 65 20 5c 22 77 68 61 74  m because \"what
17450 2d 69 66 5c 22 20 6d 6f 64 65 20 69 73 20 65 6e  -if\" mode is en
17460 61 62 6c 65 64 2e 22 2c 0d 0a 20 20 20 20 20 20  abled.",..      
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17480 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
17490 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ory);..         
174a0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
174d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
174e0 4f 54 45 3a 20 49 66 20 74 68 65 20 63 6f 6d 6d  OTE: If the comm
174f0 61 6e 64 20 6c 69 6e 65 20 68 61 73 20 6e 6f 74  and line has not
17500 20 62 65 65 6e 20 6d 61 6e 75 61 6c 6c 79 0d 0a   been manually..
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 20 20 2f 2f 20 20 20 20 20 20 20 63 6f 6e      //       con
17530 66 69 72 6d 65 64 20 28 69 2e 65 2e 20 76 69 61  firmed (i.e. via
17540 20 74 68 65 20 65 78 70 6c 69 63 69 74 20 63 6f   the explicit co
17550 6d 6d 61 6e 64 20 6c 69 6e 65 0d 0a 20 20 20 20  mmand line..    
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 2f 2f 20 20 20 20 20 20 20 6f 70 74 69 6f 6e 29  //       option)
17580 2c 20 74 68 65 6e 20 73 74 6f 70 20 70 72 6f 63  , then stop proc
17590 65 73 73 69 6e 67 20 6e 6f 77 2e 20 20 57 65 20  essing now.  We 
175a0 65 6e 66 6f 72 63 65 0d 0a 20 20 20 20 20 20 20  enforce..       
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
175c0 20 20 20 20 20 20 74 68 69 73 20 72 75 6c 65 20        this rule 
175d0 73 6f 20 74 68 61 74 20 73 69 6d 70 6c 79 20 64  so that simply d
175e0 6f 75 62 6c 65 2d 63 6c 69 63 6b 69 6e 67 20 74  ouble-clicking t
175f0 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  he..            
17600 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
17610 20 65 78 65 63 75 74 61 62 6c 65 20 77 69 6c 6c   executable will
17620 20 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e 20 61   not result in a
17630 6e 79 20 63 68 61 6e 67 65 73 20 62 65 69 6e 67  ny changes being
17640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17650 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6d        //       m
17660 61 64 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ade to the syste
17670 6d 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  m...            
17680 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176a0 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69  if (!configurati
176b0 6f 6e 2e 63 6f 6e 66 69 72 6d 29 0d 0a 20 20 20  on.confirm)..   
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
176e0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
176f0 72 20 3d 20 22 43 61 6e 6e 6f 74 20 63 6f 6e 74  r = "Cannot cont
17700 69 6e 75 65 2c 20 74 68 65 20 5c 22 63 6f 6e 66  inue, the \"conf
17710 69 72 6d 5c 22 20 6f 70 74 69 6f 6e 20 69 73 20  irm\" option is 
17720 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " +..           
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 22 6e 6f 74 20 65 6e 61 62 6c 65 64 2e 22 3b   "not enabled.";
17750 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17760 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
17770 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
17790 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
177a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
177b0 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  rue;..          
177c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
177d0 20 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28           catch (
177e0 45 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20  Exception e)..  
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
17800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17810 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65       TraceOps.De
17820 62 75 67 41 6e 64 54 72 61 63 65 28 54 72 61 63  bugAndTrace(Trac
17830 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73  ePriority.Highes
17840 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
17850 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75              debu
17860 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65  gCallback, trace
17870 43 61 6c 6c 62 61 63 6b 2c 20 65 2c 20 74 72 61  Callback, e, tra
17880 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 20 20 20 65 72 72 6f 72 20 3d 20 22 46 61 69      error = "Fai
178b0 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 63  led to process c
178c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 3b 0d  onfiguration.";.
178d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
178e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
178f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
17900 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
17910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
17920 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
17930 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17940 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17950 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
17960 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
17970 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
17980 69 63 20 62 6f 6f 6c 20 43 68 65 63 6b 52 75 6e  ic bool CheckRun
17990 74 69 6d 65 56 65 72 73 69 6f 6e 28 0d 0a 20 20  timeVersion(..  
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
179b0 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66  nfiguration conf
179c0 69 67 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  iguration,..    
179d0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
179e0 20 73 74 72 69 63 74 2c 0d 0a 20 20 20 20 20 20   strict,..      
179f0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
17a00 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
17a10 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
17a20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
17a40 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
17a50 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
17a60 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f            if (co
17a70 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e  nfiguration == n
17a80 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
17a90 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 49 6e       error = "In
17ac0 76 61 6c 69 64 20 63 6f 6e 66 69 67 75 72 61 74  valid configurat
17ad0 69 6f 6e 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20  ion.";..        
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17af0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b40 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57 68 61      // NOTE: Wha
17b50 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  t version of the
17b60 20 72 75 6e 74 69 6d 65 20 77 61 73 20 74 68 65   runtime was the
17b70 20 63 6f 72 65 20 28 70 72 69 6d 61 72 79 29 0d   core (primary).
17b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b90 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 61 73       //       as
17ba0 73 65 6d 62 6c 79 20 63 6f 6d 70 69 6c 65 64 20  sembly compiled 
17bb0 61 67 61 69 6e 73 74 20 28 65 2e 67 2e 20 22 76  against (e.g. "v
17bc0 32 2e 30 2e 35 30 37 32 37 22 20 6f 72 0d 0a 20  2.0.50727" or.. 
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 2f 2f 20 20 20 20 20 20 20 22 76 34 2e     //       "v4.
17bf0 30 2e 33 30 33 31 39 22 29 2e 0d 0a 20 20 20 20  0.30319")...    
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
17c20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 63          string c
17c30 6f 72 65 49 6d 61 67 65 52 75 6e 74 69 6d 65 56  oreImageRuntimeV
17c40 65 72 73 69 6f 6e 20 3d 20 47 65 74 49 6d 61 67  ersion = GetImag
17c50 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 28  eRuntimeVersion(
17c60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17c70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67            config
17c80 75 72 61 74 69 6f 6e 2e 63 6f 72 65 46 69 6c 65  uration.coreFile
17c90 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
17cb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17cc0 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 57        // NOTE: W
17cd0 65 20 61 6c 6c 6f 77 20 74 68 65 20 61 63 74 75  e allow the actu
17ce0 61 6c 20 69 6d 61 67 65 20 72 75 6e 74 69 6d 65  al image runtime
17cf0 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 62 65 0d   checking to be.
17d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d10 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 62 79       //       by
17d20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 22  passed via the "
17d30 2d 6e 6f 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  -noRuntimeVersio
17d40 6e 22 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0d  n" command line.
17d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17d60 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70       //       op
17d70 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 6d 6d 61  tion.  The comma
17d80 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 69  nd line option i
17d90 73 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 0d 0a  s intended for..
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17db0 20 20 20 20 2f 2f 20 20 20 20 20 20 20 65 78 70      //       exp
17dc0 65 72 74 20 75 73 65 20 6f 6e 6c 79 2e 0d 0a 20  ert use only... 
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
17df0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
17e00 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 52  onfiguration.noR
17e10 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 0d 0a  untimeVersion)..
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
17e50 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64  raceOps.DebugAnd
17e60 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f 72  Trace(TracePrior
17e70 69 74 79 2e 4d 65 64 69 75 6d 2c 0d 0a 20 20 20  ity.Medium,..   
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61           debugCa
17ea0 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c  llback, traceCal
17eb0 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
17ec0 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ee0 20 20 20 22 41 73 73 65 6d 62 6c 79 20 69 73 20     "Assembly is 
17ef0 63 6f 6d 70 69 6c 65 64 20 66 6f 72 20 74 68 65  compiled for the
17f00 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
17f10 7b 30 7d 3b 20 22 20 2b 0d 0a 20 20 20 20 20 20  {0}; " +..      
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 22 68 6f 77 65 76 65 72 2c 20        "however, 
17f40 69 6e 73 74 61 6c 6c 61 74 69 6f 6e 20 72 65 73  installation res
17f50 74 72 69 63 74 69 6f 6e 73 20 62 61 73 65 64 20  trictions based 
17f60 6f 6e 20 74 68 69 73 20 22 20 2b 0d 0a 20 20 20  on this " +..   
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 20 20 22 66 61 63 74 20 68           "fact h
17f90 61 76 65 20 62 65 65 6e 20 64 69 73 61 62 6c 65  ave been disable
17fa0 64 20 76 69 61 20 74 68 65 20 63 6f 6d 6d 61 6e  d via the comman
17fb0 64 20 6c 69 6e 65 2e 22 2c 0d 0a 20 20 20 20 20  d line.",..     
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 20 63 6f 72 65 49 6d 61 67 65         coreImage
17fe0 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 2c  RuntimeVersion),
17ff0 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
18000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18010 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18020 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
18040 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
18050 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18070 2f 20 54 4f 44 4f 3a 20 52 65 73 74 72 69 63 74  / TODO: Restrict
18080 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
18090 6f 6e 20 62 61 73 65 64 20 6f 6e 20 77 68 69 63  on based on whic
180a0 68 20 69 6d 61 67 65 0d 0a 20 20 20 20 20 20 20  h image..       
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
180c0 20 20 20 20 20 20 72 75 6e 74 69 6d 65 20 76 65        runtime ve
180d0 72 73 69 6f 6e 73 20 28 77 68 69 63 68 20 6d 6f  rsions (which mo
180e0 72 65 2d 6f 72 2d 6c 65 73 73 20 63 6f 72 72 65  re-or-less corre
180f0 73 70 6f 6e 64 0d 0a 20 20 20 20 20 20 20 20 20  spond..         
18100 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
18110 20 20 20 20 74 6f 20 2e 4e 45 54 20 46 72 61 6d      to .NET Fram
18120 65 77 6f 72 6b 20 76 65 72 73 69 6f 6e 73 29 20  ework versions) 
18130 61 72 65 20 73 75 70 70 6f 72 74 65 64 20 62 79  are supported by
18140 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20   the..          
18150 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
18160 20 20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 56     versions of V
18170 69 73 75 61 6c 20 53 74 75 64 69 6f 20 74 68 61  isual Studio tha
18180 74 20 61 72 65 20 69 6e 73 74 61 6c 6c 65 64 2e  t are installed.
18190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
181a0 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
181c0 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f   (String.IsNullO
181d0 72 45 6d 70 74 79 28 63 6f 72 65 49 6d 61 67 65  rEmpty(coreImage
181e0 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 29  RuntimeVersion))
181f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18200 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69   error = "invali
18230 64 20 63 6f 72 65 20 66 69 6c 65 20 69 6d 61 67  d core file imag
18240 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69 6f  e runtime versio
18250 6e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n";..           
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
18270 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
182a0 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
182b0 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 0d 0a  String.Equals(..
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 72 65              core
182e0 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73  ImageRuntimeVers
182f0 69 6f 6e 2c 20 43 4c 52 76 32 49 6d 61 67 65 52  ion, CLRv2ImageR
18300 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 2c 0d 0a  untimeVersion,..
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18320 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
18330 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76  ngComparison.Inv
18340 61 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d  ariantCulture)).
18350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18360 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
18390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
183a0 4f 54 45 3a 20 46 6f 72 20 74 68 65 20 43 4c 52  OTE: For the CLR
183b0 20 76 32 2e 30 20 72 75 6e 74 69 6d 65 2c 20 6d   v2.0 runtime, m
183c0 61 6b 65 20 73 75 72 65 20 77 65 20 64 69 73 61  ake sure we disa
183d0 62 6c 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ble..           
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
183f0 20 20 20 20 20 20 61 6e 79 20 61 74 74 65 6d 70        any attemp
18400 74 20 74 6f 20 75 73 65 20 69 74 20 66 6f 72 20  t to use it for 
18410 74 68 69 6e 67 73 20 74 68 61 74 20 72 65 71 75  things that requ
18420 69 72 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ire..           
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
18440 20 20 20 20 20 20 61 6e 20 61 73 73 65 6d 62 6c        an assembl
18450 79 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 20 74  y compiled for t
18460 68 65 20 43 4c 52 20 76 34 2e 30 2e 20 20 49 74  he CLR v4.0.  It
18470 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
18490 20 20 20 20 20 20 75 6e 63 65 72 74 61 69 6e 20        uncertain 
184a0 69 66 20 74 68 69 73 20 69 73 20 61 63 74 75 61  if this is actua
184b0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 20 69 6e  lly a problem in
184c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
184d0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
184e0 20 20 20 70 72 61 63 74 69 63 65 20 61 73 20 74     practice as t
184f0 68 65 20 43 4c 52 20 76 34 2e 30 20 63 61 6e 20  he CLR v4.0 can 
18500 6c 6f 61 64 20 61 6e 64 20 75 73 65 20 61 6e 0d  load and use an.
18510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18520 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
18530 20 20 61 73 73 65 6d 62 6c 79 20 63 6f 6d 70 69    assembly compi
18540 6c 65 64 20 77 69 74 68 20 74 68 65 20 43 4c 52  led with the CLR
18550 20 76 32 2e 30 3b 20 68 6f 77 65 76 65 72 2c 0d   v2.0; however,.
18560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18570 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
18580 20 20 73 69 6e 63 65 20 74 68 69 73 20 70 72 6f    since this pro
18590 6a 65 63 74 20 6f 66 66 65 72 73 20 62 6f 74 68  ject offers both
185a0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 2c   configurations,
185b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
185c0 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
185d0 20 20 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20     we currently 
185e0 64 69 73 61 6c 6c 6f 77 20 74 68 69 73 20 6d 69  disallow this mi
185f0 73 6d 61 74 63 68 2e 0d 0a 20 20 20 20 20 20 20  smatch...       
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
18630 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 4e 65 74  figuration.noNet
18640 46 78 34 30 20 3d 20 74 72 75 65 3b 0d 0a 20 20  Fx40 = true;..  
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
18670 69 6f 6e 2e 6e 6f 56 73 32 30 31 30 20 3d 20 74  ion.noVs2010 = t
18680 72 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  rue;....        
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186a0 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e  TraceOps.DebugAn
186b0 64 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f  dTrace(TracePrio
186c0 72 69 74 79 2e 4d 65 64 69 75 6d 2c 0d 0a 20 20  rity.Medium,..  
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43            debugC
186f0 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61  allback, traceCa
18700 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
18710 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 20 22 41 73 73 65 6d 62 6c 79 20 69 73      "Assembly is
18740 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72 20 74 68   compiled for th
18750 65 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  e .NET Framework
18760 20 7b 30 7d 2c 20 22 20 2b 0d 0a 20 20 20 20 20   {0}, " +..     
18770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18780 20 20 20 20 20 20 20 22 73 75 70 70 6f 72 74 20         "support 
18790 66 6f 72 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f  for .NET Framewo
187a0 72 6b 20 7b 31 7d 20 69 73 20 6e 6f 77 20 64 69  rk {1} is now di
187b0 73 61 62 6c 65 64 2e 22 2c 0d 0a 20 20 20 20 20  sabled.",..     
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 20 20 43 4c 52 76 32 49 6d 61 67         CLRv2Imag
187e0 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 2c  eRuntimeVersion,
187f0 20 43 4c 52 76 34 49 6d 61 67 65 52 75 6e 74 69   CLRv4ImageRunti
18800 6d 65 56 65 72 73 69 6f 6e 29 2c 0d 0a 20 20 20  meVersion),..   
18810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18820 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
18830 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20  tegory);..      
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
18850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18860 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 53 74       else if (St
18870 72 69 6e 67 2e 45 71 75 61 6c 73 28 0d 0a 20 20  ring.Equals(..  
18880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18890 20 20 20 20 20 20 20 20 20 20 63 6f 72 65 49 6d            coreIm
188a0 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
188b0 6e 2c 20 43 4c 52 76 34 49 6d 61 67 65 52 75 6e  n, CLRv4ImageRun
188c0 74 69 6d 65 56 65 72 73 69 6f 6e 2c 0d 0a 20 20  timeVersion,..  
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
188f0 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72  Comparison.Invar
18900 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20  iantCulture)).. 
18910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18920 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
18940 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18950 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54            // NOT
18960 45 3a 20 46 6f 72 20 74 68 65 20 43 4c 52 20 76  E: For the CLR v
18970 34 2e 30 20 72 75 6e 74 69 6d 65 2c 20 6d 61 6b  4.0 runtime, mak
18980 65 20 73 75 72 65 20 77 65 20 64 69 73 61 62 6c  e sure we disabl
18990 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
189a0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
189b0 20 20 20 20 61 6e 79 20 61 74 74 65 6d 70 74 20      any attempt 
189c0 74 6f 20 75 73 65 20 69 74 20 66 6f 72 20 74 68  to use it for th
189d0 69 6e 67 73 20 74 68 61 74 20 72 65 71 75 69 72  ings that requir
189e0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
189f0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
18a00 20 20 20 20 61 6e 20 61 73 73 65 6d 62 6c 79 20      an assembly 
18a10 63 6f 6d 70 69 6c 65 64 20 66 6f 72 20 74 68 65  compiled for the
18a20 20 43 4c 52 20 76 32 2e 30 2e 0d 0a 20 20 20 20   CLR v2.0...    
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
18a70 4e 65 74 46 78 32 30 20 3d 20 74 72 75 65 3b 0d  NetFx20 = true;.
18a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a90 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
18aa0 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30 30 38 20  ration.noVs2008 
18ab0 3d 20 74 72 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  = true;....     
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75     TraceOps.Debu
18ae0 67 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50  gAndTrace(TraceP
18af0 72 69 6f 72 69 74 79 2e 4d 65 64 69 75 6d 2c 0d  riority.Medium,.
18b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62               deb
18b20 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63  ugCallback, trac
18b30 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
18b40 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 20 20 20 20 20 22 41 73 73 65 6d 62 6c 79         "Assembly
18b70 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 66 6f 72   is compiled for
18b80 20 74 68 65 20 2e 4e 45 54 20 46 72 61 6d 65 77   the .NET Framew
18b90 6f 72 6b 20 7b 30 7d 2c 20 22 20 2b 0d 0a 20 20  ork {0}, " +..  
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 22 73 75 70 70 6f            "suppo
18bc0 72 74 20 66 6f 72 20 2e 4e 45 54 20 46 72 61 6d  rt for .NET Fram
18bd0 65 77 6f 72 6b 20 7b 31 7d 20 69 73 20 6e 6f 77  ework {1} is now
18be0 20 64 69 73 61 62 6c 65 64 2e 22 2c 0d 0a 20 20   disabled.",..  
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
18c10 70 6c 61 79 28 43 4c 52 76 34 49 6d 61 67 65 52  play(CLRv4ImageR
18c20 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 2c 0d  untimeVersion),.
18c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
18c50 44 69 73 70 6c 61 79 28 43 4c 52 76 32 49 6d 61  Display(CLRv2Ima
18c60 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
18c70 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
18ca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18cb0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
18cd0 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
18ce0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d00 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
18d10 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 20 20 20 22 75 6e 73 75 70 70 6f 72 74        "unsupport
18d40 65 64 20 63 6f 72 65 20 66 69 6c 65 20 69 6d 61  ed core file ima
18d50 67 65 20 72 75 6e 74 69 6d 65 20 76 65 72 73 69  ge runtime versi
18d60 6f 6e 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  on " +..        
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d80 20 20 20 20 22 7b 30 7d 2c 20 6d 75 73 74 20 62      "{0}, must b
18d90 65 20 7b 31 7d 20 6f 72 20 7b 32 7d 22 2c 0d 0a  e {1} or {2}",..
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
18dc0 69 73 70 6c 61 79 28 63 6f 72 65 49 6d 61 67 65  isplay(coreImage
18dd0 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 29 2c  RuntimeVersion),
18de0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
18e00 72 44 69 73 70 6c 61 79 28 43 4c 52 76 32 49 6d  rDisplay(CLRv2Im
18e10 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f  ageRuntimeVersio
18e20 6e 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n),..           
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 46 6f 72 44 69 73 70 6c 61 79 28 43 4c 52 76   ForDisplay(CLRv
18e50 34 49 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72  4ImageRuntimeVer
18e60 73 69 6f 6e 29 29 3b 0d 0a 0d 0a 20 20 20 20 20  sion));....     
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
18e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18ea0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
18ec0 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20  eturn true;..   
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
18f00 20 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   e)..           
18f10 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
18f20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
18f30 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
18f40 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
18f50 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20 20  .Highest,..     
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b     debugCallback
18f80 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  , traceCallback,
18f90 20 65 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72   e, traceCategor
18fa0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
18fb0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
18fc0 20 3d 20 22 46 61 69 6c 65 64 20 74 6f 20 63 68   = "Failed to ch
18fd0 65 63 6b 20 69 6d 61 67 65 20 72 75 6e 74 69 6d  eck image runtim
18fe0 65 20 76 65 72 73 69 6f 6e 2e 22 3b 0d 0a 20 20  e version.";..  
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
19000 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19010 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
19020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
19030 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
19040 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
19050 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
19060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19080 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19090 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
190a0 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
190b0 6e 20 50 75 62 6c 69 63 20 4d 65 74 68 6f 64 73  n Public Methods
190c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
190d0 62 6c 69 63 20 62 6f 6f 6c 20 48 61 73 46 6c 61  blic bool HasFla
190e0 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gs(..           
190f0 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67       InstallFlag
19100 73 20 68 61 73 46 6c 61 67 73 2c 0d 0a 20 20 20  s hasFlags,..   
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
19120 6c 20 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  l all..         
19130 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
19140 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
19150 20 20 20 20 20 20 20 20 20 69 66 20 28 61 6c 6c           if (all
19160 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
19170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28         return ((
19180 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 26 20 68  installFlags & h
19190 61 73 46 6c 61 67 73 29 20 3d 3d 20 68 61 73 46  asFlags) == hasF
191a0 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  lags);..        
191b0 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 72 65 74 75 72 6e 20 28 28 69 6e 73 74 61    return ((insta
191e0 6c 6c 46 6c 61 67 73 20 26 20 68 61 73 46 6c 61  llFlags & hasFla
191f0 67 73 29 20 21 3d 20 49 6e 73 74 61 6c 6c 46 6c  gs) != InstallFl
19200 61 67 73 2e 4e 6f 6e 65 29 3b 0d 0a 20 20 20 20  ags.None);..    
19210 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19220 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
19230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19240 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19250 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19260 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
19270 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
19280 69 63 20 76 6f 69 64 20 44 75 6d 70 28 0d 0a 20  ic void Dump(.. 
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
192a0 72 61 63 65 43 61 6c 6c 62 61 63 6b 20 74 72 61  raceCallback tra
192b0 63 65 43 61 6c 6c 62 61 63 6b 0d 0a 20 20 20 20  ceCallback..    
192c0 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
192d0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
192f0 20 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 20   (traceCallback 
19300 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  != null)..      
19310 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53   traceCallback(S
19340 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d  tring.Format(Nam
19350 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c  eAndValueFormat,
19360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19370 20 20 20 20 20 20 20 20 20 20 22 41 73 73 65 6d            "Assem
19380 62 6c 79 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  bly", ForDisplay
19390 28 61 73 73 65 6d 62 6c 79 29 29 2c 0d 0a 20 20  (assembly)),..  
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
193c0 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
193e0 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e  ceCallback(Strin
193f0 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64  g.Format(NameAnd
19400 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20  ValueFormat,..  
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 22 4c 6f 67 46 69 6c 65 4e 61        "LogFileNa
19430 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  me", ForDisplay(
19440 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 2c 0d 0a  logFileName)),..
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
19470 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19490 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
194a0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
194b0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 20 22 44 69 72 65 63 74 6f          "Directo
194e0 72 79 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ry", ForDisplay(
194f0 64 69 72 65 63 74 6f 72 79 29 29 2c 0d 0a 20 20  directory)),..  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
19520 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
19540 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e  ceCallback(Strin
19550 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64  g.Format(NameAnd
19560 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20  ValueFormat,..  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 20 20 22 43 6f 72 65 46 69 6c 65 4e        "CoreFileN
19590 61 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  ame", ForDisplay
195a0 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29 2c  (coreFileName)),
195b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
195c0 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
195d0 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53   traceCallback(S
19600 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d  tring.Format(Nam
19610 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c  eAndValueFormat,
19620 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19630 20 20 20 20 20 20 20 20 20 20 22 4c 69 6e 71 46            "LinqF
19640 69 6c 65 4e 61 6d 65 22 2c 20 46 6f 72 44 69 73  ileName", ForDis
19650 70 6c 61 79 28 6c 69 6e 71 46 69 6c 65 4e 61 6d  play(linqFileNam
19660 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  e)),..          
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
19680 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
19690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
196a0 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
196b0 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
196c0 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
196d0 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
196f0 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 22  esignerFileName"
19700 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 64 65 73  , ForDisplay(des
19710 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29 2c  ignerFileName)),
19720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19730 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
19740 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19760 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53   traceCallback(S
19770 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d  tring.Format(Nam
19780 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c  eAndValueFormat,
19790 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
197a0 20 20 20 20 20 20 20 20 20 20 22 44 65 62 75 67            "Debug
197b0 46 6f 72 6d 61 74 22 2c 20 46 6f 72 44 69 73 70  Format", ForDisp
197c0 6c 61 79 28 64 65 62 75 67 46 6f 72 6d 61 74 29  lay(debugFormat)
197d0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
197e0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
197f0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
19800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19810 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
19820 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e  (String.Format(N
19830 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
19840 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
19850 20 20 20 20 20 20 20 20 20 20 20 20 22 54 72 61              "Tra
19860 63 65 46 6f 72 6d 61 74 22 2c 20 46 6f 72 44 69  ceFormat", ForDi
19870 73 70 6c 61 79 28 74 72 61 63 65 46 6f 72 6d 61  splay(traceForma
19880 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  t)),..          
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
198a0 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
198b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
198c0 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
198d0 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
198e0 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
198f0 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
19910 6e 73 74 61 6c 6c 46 6c 61 67 73 22 2c 20 46 6f  nstallFlags", Fo
19920 72 44 69 73 70 6c 61 79 28 69 6e 73 74 61 6c 6c  rDisplay(install
19930 46 6c 61 67 73 29 29 2c 0d 0a 20 20 20 20 20 20  Flags)),..      
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
19960 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
19970 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
19980 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
19990 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
199a0 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199c0 20 20 22 44 65 62 75 67 50 72 69 6f 72 69 74 79    "DebugPriority
199d0 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 64 65  ", ForDisplay(de
199e0 62 75 67 50 72 69 6f 72 69 74 79 29 29 2c 0d 0a  bugPriority)),..
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
19a10 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19a30 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
19a40 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
19a50 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 22 54 72 61 63 65 50 72          "TracePr
19a80 69 6f 72 69 74 79 22 2c 20 46 6f 72 44 69 73 70  iority", ForDisp
19a90 6c 61 79 28 74 72 61 63 65 50 72 69 6f 72 69 74  lay(tracePriorit
19aa0 79 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  y)),..          
19ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
19ac0 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
19ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ae0 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
19af0 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
19b00 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
19b10 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
19b30 6e 73 74 61 6c 6c 22 2c 20 46 6f 72 44 69 73 70  nstall", ForDisp
19b40 6c 61 79 28 69 6e 73 74 61 6c 6c 29 29 2c 0d 0a  lay(install)),..
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
19b70 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19b90 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
19ba0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
19bb0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 20 20 20 20 20 20 22 4e 6f 52 75 6e 74 69          "NoRunti
19be0 6d 65 56 65 72 73 69 6f 6e 22 2c 20 46 6f 72 44  meVersion", ForD
19bf0 69 73 70 6c 61 79 28 6e 6f 52 75 6e 74 69 6d 65  isplay(noRuntime
19c00 56 65 72 73 69 6f 6e 29 29 2c 0d 0a 20 20 20 20  Version)),..    
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
19c30 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
19c40 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
19c50 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
19c60 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
19c70 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 22 4e 6f 44 65 73 6b 74 6f 70 22 2c      "NoDesktop",
19ca0 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 44 65   ForDisplay(noDe
19cb0 73 6b 74 6f 70 29 29 2c 0d 0a 20 20 20 20 20 20  sktop)),..      
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
19ce0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
19cf0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
19d00 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
19d10 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
19d20 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d40 20 20 22 4e 6f 43 6f 6d 70 61 63 74 22 2c 20 46    "NoCompact", F
19d50 6f 72 44 69 73 70 6c 61 79 28 6e 6f 43 6f 6d 70  orDisplay(noComp
19d60 61 63 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  act)),..        
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d80 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
19d90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19da0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
19db0 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d  back(String.Form
19dc0 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46  at(NameAndValueF
19dd0 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20  ormat,..        
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 22 4e 6f 4e 65 74 46 78 32 30 22 2c 20 46 6f 72  "NoNetFx20", For
19e00 44 69 73 70 6c 61 79 28 6e 6f 4e 65 74 46 78 32  Display(noNetFx2
19e10 30 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  0)),..          
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
19e30 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
19e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e50 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
19e60 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
19e70 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
19e80 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
19ea0 6f 4e 65 74 46 78 34 30 22 2c 20 46 6f 72 44 69  oNetFx40", ForDi
19eb0 73 70 6c 61 79 28 6e 6f 4e 65 74 46 78 34 30 29  splay(noNetFx40)
19ec0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
19ee0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f00 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
19f10 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e  (String.Format(N
19f20 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
19f30 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
19f40 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f 56              "NoV
19f50 73 32 30 30 38 22 2c 20 46 6f 72 44 69 73 70 6c  s2008", ForDispl
19f60 61 79 28 6e 6f 56 73 32 30 30 38 29 29 2c 0d 0a  ay(noVs2008)),..
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
19f90 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19fb0 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72  raceCallback(Str
19fc0 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41  ing.Format(NameA
19fd0 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a  ndValueFormat,..
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 20 20 22 4e 6f 56 73 32 30 31          "NoVs201
1a000 30 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e  0", ForDisplay(n
1a010 6f 56 73 32 30 31 30 29 29 2c 0d 0a 20 20 20 20  oVs2010)),..    
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a030 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
1a040 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
1a050 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
1a060 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e  Callback(String.
1a070 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61  Format(NameAndVa
1a080 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20  lueFormat,..    
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0a0 20 20 20 20 22 4e 6f 54 72 61 63 65 22 2c 20 46      "NoTrace", F
1a0b0 6f 72 44 69 73 70 6c 61 79 28 6e 6f 54 72 61 63  orDisplay(noTrac
1a0c0 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  e)),..          
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1a0e0 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
1a0f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a100 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61       traceCallba
1a110 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  ck(String.Format
1a120 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72  (NameAndValueFor
1a130 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  mat,..          
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e                "N
1a150 6f 43 6f 6e 73 6f 6c 65 22 2c 20 46 6f 72 44 69  oConsole", ForDi
1a160 73 70 6c 61 79 28 6e 6f 43 6f 6e 73 6f 6c 65 29  splay(noConsole)
1a170 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
1a180 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
1a190 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
1a1c0 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e  (String.Format(N
1a1d0 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
1a1e0 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f 4c              "NoL
1a200 6f 67 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  og", ForDisplay(
1a210 6e 6f 4c 6f 67 29 29 2c 0d 0a 20 20 20 20 20 20  noLog)),..      
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
1a240 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1a250 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
1a260 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
1a270 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
1a280 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
1a290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2a0 20 20 22 54 68 72 6f 77 4f 6e 4d 69 73 73 69 6e    "ThrowOnMissin
1a2b0 67 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74  g", ForDisplay(t
1a2c0 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 29 29 2c  hrowOnMissing)),
1a2d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a2e0 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
1a2f0 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53   traceCallback(S
1a320 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d  tring.Format(Nam
1a330 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c  eAndValueFormat,
1a340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a350 20 20 20 20 20 20 20 20 20 20 22 57 68 61 74 49            "WhatI
1a360 66 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 77  f", ForDisplay(w
1a370 68 61 74 49 66 29 29 2c 0d 0a 20 20 20 20 20 20  hatIf)),..      
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a390 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
1a3a0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1a3b0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
1a3c0 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f  llback(String.Fo
1a3d0 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75  rmat(NameAndValu
1a3e0 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20  eFormat,..      
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a400 20 20 22 56 65 72 62 6f 73 65 22 2c 20 46 6f 72    "Verbose", For
1a410 44 69 73 70 6c 61 79 28 76 65 72 62 6f 73 65 29  Display(verbose)
1a420 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
1a430 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
1a440 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a460 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
1a470 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e  (String.Format(N
1a480 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61  ameAndValueForma
1a490 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 22 43 6f 6e              "Con
1a4b0 66 69 72 6d 22 2c 20 46 6f 72 44 69 73 70 6c 61  firm", ForDispla
1a4c0 79 28 63 6f 6e 66 69 72 6d 29 29 2c 0d 0a 20 20  y(confirm)),..  
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67        traceCateg
1a4f0 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ory);..         
1a500 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1a510 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1a520 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
1a530 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
1a540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a550 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a560 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a570 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a580 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
1a590 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63    #region Public
1a5a0 20 50 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20   Properties..   
1a5b0 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
1a5c0 20 41 73 73 65 6d 62 6c 79 20 61 73 73 65 6d 62   Assembly assemb
1a5d0 6c 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ly;..           
1a5e0 20 70 75 62 6c 69 63 20 41 73 73 65 6d 62 6c 79   public Assembly
1a5f0 20 41 73 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20   Assembly..     
1a600 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1a610 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
1a620 72 65 74 75 72 6e 20 61 73 73 65 6d 62 6c 79 3b  return assembly;
1a630 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1a640 20 20 20 20 73 65 74 20 7b 20 61 73 73 65 6d 62      set { assemb
1a650 6c 79 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20  ly = value; }.. 
1a660 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1a670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
1a680 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a690 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a6a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a6b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1a6c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
1a6d0 72 69 76 61 74 65 20 73 74 72 69 6e 67 20 6c 6f  rivate string lo
1a6e0 67 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  gFileName;..    
1a6f0 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
1a700 74 72 69 6e 67 20 4c 6f 67 46 69 6c 65 4e 61 6d  tring LogFileNam
1a710 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
1a720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a730 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6c    get { return l
1a740 6f 67 46 69 6c 65 4e 61 6d 65 3b 20 7d 0d 0a 20  ogFileName; }.. 
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a760 65 74 20 7b 20 6c 6f 67 46 69 6c 65 4e 61 6d 65  et { logFileName
1a770 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20   = value; }..   
1a780 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1a790 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
1a7a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a7b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a7c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a7d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1a7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
1a7f0 76 61 74 65 20 73 74 72 69 6e 67 20 64 69 72 65  vate string dire
1a800 63 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20 20 20  ctory;..        
1a810 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e      public strin
1a820 67 20 44 69 72 65 63 74 6f 72 79 0d 0a 20 20 20  g Directory..   
1a830 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1a840 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
1a850 7b 20 72 65 74 75 72 6e 20 64 69 72 65 63 74 6f  { return directo
1a860 72 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ry; }..         
1a870 20 20 20 20 20 20 20 73 65 74 20 7b 20 64 69 72         set { dir
1a880 65 63 74 6f 72 79 20 3d 20 76 61 6c 75 65 3b 20  ectory = value; 
1a890 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1a8a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1a8b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a8c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a8d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a8e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a8f0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1a900 20 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e     private strin
1a910 67 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 0d  g coreFileName;.
1a920 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
1a930 6c 69 63 20 73 74 72 69 6e 67 20 43 6f 72 65 46  lic string CoreF
1a940 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  ileName..       
1a950 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1a960 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
1a970 74 75 72 6e 20 63 6f 72 65 46 69 6c 65 4e 61 6d  turn coreFileNam
1a980 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
1a990 20 20 20 20 20 20 73 65 74 20 7b 20 63 6f 72 65        set { core
1a9a0 46 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65  FileName = value
1a9b0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1a9c0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1a9d0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1a9e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a9f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aa00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aa10 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1aa20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 72       private str
1aa30 69 6e 67 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  ing linqFileName
1aa40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
1aa50 75 62 6c 69 63 20 73 74 72 69 6e 67 20 4c 69 6e  ublic string Lin
1aa60 71 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20  qFileName..     
1aa70 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1aa80 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
1aa90 72 65 74 75 72 6e 20 6c 69 6e 71 46 69 6c 65 4e  return linqFileN
1aaa0 61 6d 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  ame; }..        
1aab0 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6c 69          set { li
1aac0 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c  nqFileName = val
1aad0 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1aae0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1aaf0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1ab00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ab10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ab20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ab30 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1ab40 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
1ab50 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72 46 69  tring designerFi
1ab60 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20  leName;..       
1ab70 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69       public stri
1ab80 6e 67 20 44 65 73 69 67 6e 65 72 46 69 6c 65 4e  ng DesignerFileN
1ab90 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ame..           
1aba0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1abb0 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
1abc0 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d   designerFileNam
1abd0 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
1abe0 20 20 20 20 20 20 73 65 74 20 7b 20 64 65 73 69        set { desi
1abf0 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 76  gnerFileName = v
1ac00 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
1ac10 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1ac20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1ac30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ac40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ac50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ac60 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1ac70 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
1ac80 20 73 74 72 69 6e 67 20 64 65 62 75 67 46 6f 72   string debugFor
1ac90 6d 61 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  mat;..          
1aca0 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20    public string 
1acb0 44 65 62 75 67 46 6f 72 6d 61 74 0d 0a 20 20 20  DebugFormat..   
1acc0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
1ace0 7b 20 72 65 74 75 72 6e 20 64 65 62 75 67 46 6f  { return debugFo
1acf0 72 6d 61 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20  rmat; }..       
1ad00 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 64           set { d
1ad10 65 62 75 67 46 6f 72 6d 61 74 20 3d 20 76 61 6c  ebugFormat = val
1ad20 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1ad30 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ad40 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1ad50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ad60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ad70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ad80 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1ad90 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
1ada0 74 72 69 6e 67 20 74 72 61 63 65 46 6f 72 6d 61  tring traceForma
1adb0 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
1adc0 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 54 72  public string Tr
1add0 61 63 65 46 6f 72 6d 61 74 0d 0a 20 20 20 20 20  aceFormat..     
1ade0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1adf0 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
1ae00 72 65 74 75 72 6e 20 74 72 61 63 65 46 6f 72 6d  return traceForm
1ae10 61 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  at; }..         
1ae20 20 20 20 20 20 20 20 73 65 74 20 7b 20 74 72 61         set { tra
1ae30 63 65 46 6f 72 6d 61 74 20 3d 20 76 61 6c 75 65  ceFormat = value
1ae40 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1ae50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1ae60 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1ae70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ae80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ae90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aea0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1aeb0 20 20 20 20 20 70 72 69 76 61 74 65 20 49 6e 73       private Ins
1aec0 74 61 6c 6c 46 6c 61 67 73 20 69 6e 73 74 61 6c  tallFlags instal
1aed0 6c 46 6c 61 67 73 3b 0d 0a 20 20 20 20 20 20 20  lFlags;..       
1aee0 20 20 20 20 20 70 75 62 6c 69 63 20 49 6e 73 74       public Inst
1aef0 61 6c 6c 46 6c 61 67 73 20 49 6e 73 74 61 6c 6c  allFlags Install
1af00 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20 20  Flags..         
1af10 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1af20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
1af30 72 6e 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73 3b  rn installFlags;
1af40 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1af50 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61 6c      set { instal
1af60 6c 46 6c 61 67 73 20 3d 20 76 61 6c 75 65 3b 20  lFlags = value; 
1af70 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1af80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1af90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1afa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1afb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1afc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1afd0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1afe0 20 20 20 70 72 69 76 61 74 65 20 54 72 61 63 65     private Trace
1aff0 50 72 69 6f 72 69 74 79 20 64 65 62 75 67 50 72  Priority debugPr
1b000 69 6f 72 69 74 79 3b 0d 0a 20 20 20 20 20 20 20  iority;..       
1b010 20 20 20 20 20 70 75 62 6c 69 63 20 54 72 61 63       public Trac
1b020 65 50 72 69 6f 72 69 74 79 20 44 65 62 75 67 50  ePriority DebugP
1b030 72 69 6f 72 69 74 79 0d 0a 20 20 20 20 20 20 20  riority..       
1b040 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1b050 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
1b060 74 75 72 6e 20 64 65 62 75 67 50 72 69 6f 72 69  turn debugPriori
1b070 74 79 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ty; }..         
1b080 20 20 20 20 20 20 20 73 65 74 20 7b 20 64 65 62         set { deb
1b090 75 67 50 72 69 6f 72 69 74 79 20 3d 20 76 61 6c  ugPriority = val
1b0a0 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1b0b0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b0c0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1b0d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b0e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b0f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b100 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1b110 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 54         private T
1b120 72 61 63 65 50 72 69 6f 72 69 74 79 20 74 72 61  racePriority tra
1b130 63 65 50 72 69 6f 72 69 74 79 3b 0d 0a 20 20 20  cePriority;..   
1b140 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
1b150 54 72 61 63 65 50 72 69 6f 72 69 74 79 20 54 72  TracePriority Tr
1b160 61 63 65 50 72 69 6f 72 69 74 79 0d 0a 20 20 20  acePriority..   
1b170 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1b180 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
1b190 7b 20 72 65 74 75 72 6e 20 74 72 61 63 65 50 72  { return tracePr
1b1a0 69 6f 72 69 74 79 3b 20 7d 0d 0a 20 20 20 20 20  iority; }..     
1b1b0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
1b1c0 20 74 72 61 63 65 50 72 69 6f 72 69 74 79 20 3d   tracePriority =
1b1d0 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20   value; }..     
1b1e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b1f0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1b200 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b210 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b220 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1b240 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
1b250 74 65 20 62 6f 6f 6c 20 69 6e 73 74 61 6c 6c 3b  te bool install;
1b260 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
1b270 62 6c 69 63 20 62 6f 6f 6c 20 49 6e 73 74 61 6c  blic bool Instal
1b280 6c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  l..            {
1b290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b2a0 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 69    get { return i
1b2b0 6e 73 74 61 6c 6c 3b 20 7d 0d 0a 20 20 20 20 20  nstall; }..     
1b2c0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
1b2d0 20 69 6e 73 74 61 6c 6c 20 3d 20 76 61 6c 75 65   install = value
1b2e0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1b2f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b300 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1b310 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b320 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b330 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b340 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1b350 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
1b360 6c 20 6e 6f 52 75 6e 74 69 6d 65 56 65 72 73 69  l noRuntimeVersi
1b370 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on;..           
1b380 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 52   public bool NoR
1b390 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e 0d 0a 20  untimeVersion.. 
1b3a0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
1b3c0 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 52 75 6e  t { return noRun
1b3d0 74 69 6d 65 56 65 72 73 69 6f 6e 3b 20 7d 0d 0a  timeVersion; }..
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 73 65 74 20 7b 20 6e 6f 52 75 6e 74 69 6d 65 56  set { noRuntimeV
1b400 65 72 73 69 6f 6e 20 3d 20 76 61 6c 75 65 3b 20  ersion = value; 
1b410 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1b420 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1b430 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b440 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b450 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b460 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b470 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1b480 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
1b490 6e 6f 44 65 73 6b 74 6f 70 3b 0d 0a 20 20 20 20  noDesktop;..    
1b4a0 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
1b4b0 6f 6f 6c 20 4e 6f 44 65 73 6b 74 6f 70 0d 0a 20  ool NoDesktop.. 
1b4c0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
1b4e0 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 44 65 73  t { return noDes
1b4f0 6b 74 6f 70 3b 20 7d 0d 0a 20 20 20 20 20 20 20  ktop; }..       
1b500 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e           set { n
1b510 6f 44 65 73 6b 74 6f 70 20 3d 20 76 61 6c 75 65  oDesktop = value
1b520 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1b530 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1b540 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1b550 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b560 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b570 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b580 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1b590 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
1b5a0 6c 20 6e 6f 43 6f 6d 70 61 63 74 3b 0d 0a 20 20  l noCompact;..  
1b5b0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
1b5c0 20 62 6f 6f 6c 20 4e 6f 43 6f 6d 70 61 63 74 0d   bool NoCompact.
1b5d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5f0 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 43  get { return noC
1b600 6f 6d 70 61 63 74 3b 20 7d 0d 0a 20 20 20 20 20  ompact; }..     
1b610 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
1b620 20 6e 6f 43 6f 6d 70 61 63 74 20 3d 20 76 61 6c   noCompact = val
1b630 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1b640 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1b650 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1b660 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b670 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b680 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b690 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1b6a0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
1b6b0 6f 6f 6c 20 6e 6f 4e 65 74 46 78 32 30 3b 0d 0a  ool noNetFx20;..
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
1b6d0 69 63 20 62 6f 6f 6c 20 4e 6f 4e 65 74 46 78 32  ic bool NoNetFx2
1b6e0 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  0..            {
1b6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b700 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e    get { return n
1b710 6f 4e 65 74 46 78 32 30 3b 20 7d 0d 0a 20 20 20  oNetFx20; }..   
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1b730 20 7b 20 6e 6f 4e 65 74 46 78 32 30 20 3d 20 76   { noNetFx20 = v
1b740 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
1b750 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b760 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1b770 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b780 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b790 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b7a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1b7b0 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
1b7c0 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46 78 34 30 3b   bool noNetFx40;
1b7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
1b7e0 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 4e 65 74 46  blic bool NoNetF
1b7f0 78 34 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  x40..           
1b800 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b810 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
1b820 20 6e 6f 4e 65 74 46 78 34 30 3b 20 7d 0d 0a 20   noNetFx40; }.. 
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b840 65 74 20 7b 20 6e 6f 4e 65 74 46 78 34 30 20 3d  et { noNetFx40 =
1b850 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20   value; }..     
1b860 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b870 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1b880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b8a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b8b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1b8c0 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
1b8d0 74 65 20 62 6f 6f 6c 20 6e 6f 56 73 32 30 30 38  te bool noVs2008
1b8e0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
1b8f0 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 56 73 32  ublic bool NoVs2
1b900 30 30 38 0d 0a 20 20 20 20 20 20 20 20 20 20 20  008..           
1b910 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b920 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
1b930 20 6e 6f 56 73 32 30 30 38 3b 20 7d 0d 0a 20 20   noVs2008; }..  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
1b950 74 20 7b 20 6e 6f 56 73 32 30 30 38 20 3d 20 76  t { noVs2008 = v
1b960 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20  alue; }..       
1b970 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1b980 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1b990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b9a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b9b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b9c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1b9d0 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
1b9e0 20 62 6f 6f 6c 20 6e 6f 56 73 32 30 31 30 3b 0d   bool noVs2010;.
1b9f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
1ba00 6c 69 63 20 62 6f 6f 6c 20 4e 6f 56 73 32 30 31  lic bool NoVs201
1ba10 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  0..            {
1ba20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ba30 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e    get { return n
1ba40 6f 56 73 32 30 31 30 3b 20 7d 0d 0a 20 20 20 20  oVs2010; }..    
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
1ba60 7b 20 6e 6f 56 73 32 30 31 30 20 3d 20 76 61 6c  { noVs2010 = val
1ba70 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1ba80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ba90 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1baa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bab0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bac0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bad0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1bae0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62         private b
1baf0 6f 6f 6c 20 6e 6f 54 72 61 63 65 3b 0d 0a 20 20  ool noTrace;..  
1bb00 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
1bb10 20 62 6f 6f 6c 20 4e 6f 54 72 61 63 65 0d 0a 20   bool NoTrace.. 
1bb20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1bb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
1bb40 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 54 72 61  t { return noTra
1bb50 63 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ce; }..         
1bb60 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 54         set { noT
1bb70 72 61 63 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  race = value; }.
1bb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1bb90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1bba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bbb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bbc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bbd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bbe0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
1bbf0 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f   private bool no
1bc00 43 6f 6e 73 6f 6c 65 3b 0d 0a 20 20 20 20 20 20  Console;..      
1bc10 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f        public boo
1bc20 6c 20 4e 6f 43 6f 6e 73 6f 6c 65 0d 0a 20 20 20  l NoConsole..   
1bc30 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20              get 
1bc50 7b 20 72 65 74 75 72 6e 20 6e 6f 43 6f 6e 73 6f  { return noConso
1bc60 6c 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  le; }..         
1bc70 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 43         set { noC
1bc80 6f 6e 73 6f 6c 65 20 3d 20 76 61 6c 75 65 3b 20  onsole = value; 
1bc90 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1bca0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1bcb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bcc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bcd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bce0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bcf0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
1bd00 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20     private bool 
1bd10 6e 6f 4c 6f 67 3b 0d 0a 20 20 20 20 20 20 20 20  noLog;..        
1bd20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20      public bool 
1bd30 4e 6f 4c 6f 67 0d 0a 20 20 20 20 20 20 20 20 20  NoLog..         
1bd40 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1bd50 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75        get { retu
1bd60 72 6e 20 6e 6f 4c 6f 67 3b 20 7d 0d 0a 20 20 20  rn noLog; }..   
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1bd80 20 7b 20 6e 6f 4c 6f 67 20 3d 20 76 61 6c 75 65   { noLog = value
1bd90 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1bda0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1bdb0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1bdc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bdd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bde0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bdf0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1be00 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f       private boo
1be10 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67  l throwOnMissing
1be20 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
1be30 75 62 6c 69 63 20 62 6f 6f 6c 20 54 68 72 6f 77  ublic bool Throw
1be40 4f 6e 4d 69 73 73 69 6e 67 0d 0a 20 20 20 20 20  OnMissing..     
1be50 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1be60 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20            get { 
1be70 72 65 74 75 72 6e 20 74 68 72 6f 77 4f 6e 4d 69  return throwOnMi
1be80 73 73 69 6e 67 3b 20 7d 0d 0a 20 20 20 20 20 20  ssing; }..      
1be90 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
1bea0 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 20 3d  throwOnMissing =
1beb0 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20   value; }..     
1bec0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1bed0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1bee0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bef0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bf10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1bf20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
1bf30 74 65 20 62 6f 6f 6c 20 77 68 61 74 49 66 3b 0d  te bool whatIf;.
1bf40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
1bf50 6c 69 63 20 62 6f 6f 6c 20 57 68 61 74 49 66 0d  lic bool WhatIf.
1bf60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 67 65 74 20 7b 20 72 65 74 75 72 6e 20 77 68 61  get { return wha
1bf90 74 49 66 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  tIf; }..        
1bfa0 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 77 68          set { wh
1bfb0 61 74 49 66 20 3d 20 76 61 6c 75 65 3b 20 7d 0d  atIf = value; }.
1bfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1bfd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1bfe0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bff0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c000 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c010 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c020 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
1c030 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 76 65   private bool ve
1c040 72 62 6f 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  rbose;..        
1c050 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20      public bool 
1c060 56 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20  Verbose..       
1c070 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c080 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65          get { re
1c090 74 75 72 6e 20 76 65 72 62 6f 73 65 3b 20 7d 0d  turn verbose; }.
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c0b0 20 73 65 74 20 7b 20 76 65 72 62 6f 73 65 20 3d   set { verbose =
1c0c0 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20   value; }..     
1c0d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1c0e0 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1c0f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c100 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c110 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c120 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1c130 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61             priva
1c140 74 65 20 62 6f 6f 6c 20 63 6f 6e 66 69 72 6d 3b  te bool confirm;
1c150 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
1c160 62 6c 69 63 20 62 6f 6f 6c 20 43 6f 6e 66 69 72  blic bool Confir
1c170 6d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  m..            {
1c180 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c190 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 63    get { return c
1c1a0 6f 6e 66 69 72 6d 3b 20 7d 0d 0a 20 20 20 20 20  onfirm; }..     
1c1b0 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b             set {
1c1c0 20 63 6f 6e 66 69 72 6d 20 3d 20 76 61 6c 75 65   confirm = value
1c1d0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
1c1e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1c1f0 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20  #endregion..    
1c200 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23      }..        #
1c210 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
1c220 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1c230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c240 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c250 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c260 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1c270 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1c280 46 72 61 6d 65 77 6f 72 6b 4c 69 73 74 20 43 6c  FrameworkList Cl
1c290 61 73 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69  ass..        pri
1c2a0 76 61 74 65 20 73 65 61 6c 65 64 20 63 6c 61 73  vate sealed clas
1c2b0 73 20 46 72 61 6d 65 77 6f 72 6b 4c 69 73 74 0d  s FrameworkList.
1c2c0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
1c2d0 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1c2e0 50 75 62 6c 69 63 20 43 6f 6e 73 74 72 75 63 74  Public Construct
1c2f0 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ors..           
1c300 20 70 75 62 6c 69 63 20 46 72 61 6d 65 77 6f 72   public Framewor
1c310 6b 4c 69 73 74 28 29 0d 0a 20 20 20 20 20 20 20  kList()..       
1c320 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c330 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
1c340 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
1c350 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c360 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
1c370 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
1c380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c390 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c3a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c3b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c3c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c3d0 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 4d  #region Public M
1c3e0 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20 20  ethods..        
1c3f0 20 20 20 20 70 72 69 76 61 74 65 20 4d 6f 63 6b      private Mock
1c400 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
1c410 4b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  Key;..          
1c420 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
1c430 69 73 74 72 79 4b 65 79 20 52 6f 6f 74 4b 65 79  istryKey RootKey
1c440 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c460 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 72 6f   get { return ro
1c470 6f 74 4b 65 79 3b 20 7d 0d 0a 20 20 20 20 20 20  otKey; }..      
1c480 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
1c490 72 6f 6f 74 4b 65 79 20 3d 20 76 61 6c 75 65 3b  rootKey = value;
1c4a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1c4b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c4c0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1c4d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c4e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c4f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c500 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
1c510 20 20 20 20 70 72 69 76 61 74 65 20 53 74 72 69      private Stri
1c520 6e 67 4c 69 73 74 20 6e 61 6d 65 73 3b 0d 0a 20  ngList names;.. 
1c530 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1c540 63 20 53 74 72 69 6e 67 4c 69 73 74 20 4e 61 6d  c StringList Nam
1c550 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
1c560 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c570 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20     get { return 
1c580 6e 61 6d 65 73 3b 20 7d 0d 0a 20 20 20 20 20 20  names; }..      
1c590 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
1c5a0 6e 61 6d 65 73 20 3d 20 76 61 6c 75 65 3b 20 7d  names = value; }
1c5b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c5c0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
1c5d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c5f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c600 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c610 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
1c620 20 20 70 72 69 76 61 74 65 20 56 65 72 73 69 6f    private Versio
1c630 6e 4d 61 70 20 76 65 72 73 69 6f 6e 73 3b 0d 0a  nMap versions;..
1c640 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
1c650 69 63 20 56 65 72 73 69 6f 6e 4d 61 70 20 56 65  ic VersionMap Ve
1c660 72 73 69 6f 6e 73 0d 0a 20 20 20 20 20 20 20 20  rsions..        
1c670 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1c680 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
1c690 75 72 6e 20 76 65 72 73 69 6f 6e 73 3b 20 7d 0d  urn versions; }.
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6b0 20 73 65 74 20 7b 20 76 65 72 73 69 6f 6e 73 20   set { versions 
1c6c0 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
1c6d0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1c6e0 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
1c6f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1c730 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
1c740 61 74 65 20 53 74 72 69 6e 67 4c 69 73 74 20 70  ate StringList p
1c750 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 3b 0d 0a 20  latformNames;.. 
1c760 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1c770 63 20 53 74 72 69 6e 67 4c 69 73 74 20 50 6c 61  c StringList Pla
1c780 74 66 6f 72 6d 4e 61 6d 65 73 0d 0a 20 20 20 20  tformNames..    
1c790 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1c7a0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
1c7b0 20 72 65 74 75 72 6e 20 70 6c 61 74 66 6f 72 6d   return platform
1c7c0 4e 61 6d 65 73 3b 20 7d 0d 0a 20 20 20 20 20 20  Names; }..      
1c7d0 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
1c7e0 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 20 3d 20  platformNames = 
1c7f0 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20  value; }..      
1c800 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1c810 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
1c820 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1c830 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
1c840 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1c850 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c870 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c880 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c890 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
1c8a0 67 69 6f 6e 20 56 73 4c 69 73 74 20 43 6c 61 73  gion VsList Clas
1c8b0 73 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  s..        priva
1c8c0 74 65 20 73 65 61 6c 65 64 20 63 6c 61 73 73 20  te sealed class 
1c8d0 56 73 4c 69 73 74 0d 0a 20 20 20 20 20 20 20 20  VsList..        
1c8e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  {..            #
1c8f0 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f  region Public Co
1c900 6e 73 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20  nstructors..    
1c910 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 56          public V
1c920 73 4c 69 73 74 28 29 0d 0a 20 20 20 20 20 20 20  sList()..       
1c930 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1c940 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
1c950 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
1c960 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
1c970 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
1c980 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
1c990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c9a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c9b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c9c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c9d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1c9e0 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50  #region Public P
1c9f0 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
1ca00 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 4d         private M
1ca10 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72  ockRegistryKey r
1ca20 6f 6f 74 4b 65 79 3b 0d 0a 20 20 20 20 20 20 20  ootKey;..       
1ca30 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b       public Mock
1ca40 52 65 67 69 73 74 72 79 4b 65 79 20 52 6f 6f 74  RegistryKey Root
1ca50 4b 65 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  Key..           
1ca60 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ca70 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
1ca80 20 72 6f 6f 74 4b 65 79 3b 20 7d 0d 0a 20 20 20   rootKey; }..   
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
1caa0 20 7b 20 72 6f 6f 74 4b 65 79 20 3d 20 76 61 6c   { rootKey = val
1cab0 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  ue; }..         
1cac0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1cad0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
1cae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1caf0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cb00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cb10 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1cb20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 56         private V
1cb30 65 72 73 69 6f 6e 4c 69 73 74 20 76 65 72 73 69  ersionList versi
1cb40 6f 6e 73 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ons;..          
1cb50 20 20 70 75 62 6c 69 63 20 56 65 72 73 69 6f 6e    public Version
1cb60 4c 69 73 74 20 56 65 72 73 69 6f 6e 73 0d 0a 20  List Versions.. 
1cb70 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
1cb90 74 20 7b 20 72 65 74 75 72 6e 20 76 65 72 73 69  t { return versi
1cba0 6f 6e 73 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  ons; }..        
1cbb0 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 76 65          set { ve
1cbc0 72 73 69 6f 6e 73 20 3d 20 76 61 6c 75 65 3b 20  rsions = value; 
1cbd0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
1cbe0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65  ..            #e
1cbf0 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20  ndregion..      
1cc00 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
1cc10 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20  dregion..       
1cc20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
1cc30 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
1cc40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cc50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cc60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cc70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
1cc80 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  ..        #regio
1cc90 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73 74 61  n Private Consta
1cca0 6e 74 20 44 61 74 61 0d 0a 20 20 20 20 20 20 20  nt Data..       
1ccb0 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73   private const s
1ccc0 74 72 69 6e 67 20 43 6f 72 65 46 69 6c 65 4e 61  tring CoreFileNa
1ccd0 6d 65 20 3d 20 22 53 79 73 74 65 6d 2e 44 61 74  me = "System.Dat
1cce0 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22 3b 0d 0a  a.SQLite.dll";..
1ccf0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1cd00 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 4c 69 6e  const string Lin
1cd10 71 46 69 6c 65 4e 61 6d 65 20 3d 20 22 53 79 73  qFileName = "Sys
1cd20 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e  tem.Data.SQLite.
1cd30 4c 69 6e 71 2e 64 6c 6c 22 3b 0d 0a 20 20 20 20  Linq.dll";..    
1cd40 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73      private cons
1cd50 74 20 73 74 72 69 6e 67 20 44 65 73 69 67 6e 65  t string Designe
1cd60 72 46 69 6c 65 4e 61 6d 65 20 3d 20 22 53 51 4c  rFileName = "SQL
1cd70 69 74 65 2e 44 65 73 69 67 6e 65 72 2e 64 6c 6c  ite.Designer.dll
1cd80 22 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ";..        priv
1cd90 61 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67  ate const string
1cda0 20 50 72 6f 76 69 64 65 72 4e 61 6d 65 20 3d 20   ProviderName = 
1cdb0 22 53 51 4c 69 74 65 20 44 61 74 61 20 50 72 6f  "SQLite Data Pro
1cdc0 76 69 64 65 72 22 3b 0d 0a 20 20 20 20 20 20 20  vider";..       
1cdd0 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73   private const s
1cde0 74 72 69 6e 67 20 50 72 6f 6a 65 63 74 4e 61 6d  tring ProjectNam
1cdf0 65 20 3d 20 22 53 79 73 74 65 6d 2e 44 61 74 61  e = "System.Data
1ce00 2e 53 51 4c 69 74 65 22 3b 0d 0a 20 20 20 20 20  .SQLite";..     
1ce10 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
1ce20 20 73 74 72 69 6e 67 20 4c 65 67 61 63 79 50 72   string LegacyPr
1ce30 6f 6a 65 63 74 4e 61 6d 65 20 3d 20 22 53 51 4c  ojectName = "SQL
1ce40 69 74 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 70  ite";..        p
1ce50 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72  rivate const str
1ce60 69 6e 67 20 49 6e 76 61 72 69 61 6e 74 4e 61 6d  ing InvariantNam
1ce70 65 20 3d 20 22 53 79 73 74 65 6d 2e 44 61 74 61  e = "System.Data
1ce80 2e 53 51 4c 69 74 65 22 3b 0d 0a 20 20 20 20 20  .SQLite";..     
1ce90 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
1cea0 20 73 74 72 69 6e 67 20 46 61 63 74 6f 72 79 54   string FactoryT
1ceb0 79 70 65 4e 61 6d 65 20 3d 20 22 53 79 73 74 65  ypeName = "Syste
1cec0 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65 2e 53 51  m.Data.SQLite.SQ
1ced0 4c 69 74 65 46 61 63 74 6f 72 79 22 3b 0d 0a 20  LiteFactory";.. 
1cee0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63         private c
1cef0 6f 6e 73 74 20 73 74 72 69 6e 67 20 44 65 73 63  onst string Desc
1cf00 72 69 70 74 69 6f 6e 20 3d 20 22 2e 4e 45 54 20  ription = ".NET 
1cf10 46 72 61 6d 65 77 6f 72 6b 20 44 61 74 61 20 50  Framework Data P
1cf20 72 6f 76 69 64 65 72 20 66 6f 72 20 53 51 4c 69  rovider for SQLi
1cf30 74 65 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  te";....        
1cf40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cf80 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1cf90 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
1cfa0 20 73 74 72 69 6e 67 20 43 4c 52 76 32 49 6d 61   string CLRv2Ima
1cfb0 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69 6f 6e  geRuntimeVersion
1cfc0 20 3d 20 22 76 32 2e 30 2e 35 30 37 32 37 22 3b   = "v2.0.50727";
1cfd0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
1cfe0 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 43  e const string C
1cff0 4c 52 76 34 49 6d 61 67 65 52 75 6e 74 69 6d 65  LRv4ImageRuntime
1d000 56 65 72 73 69 6f 6e 20 3d 20 22 76 34 2e 30 2e  Version = "v4.0.
1d010 33 30 33 31 39 22 3b 0d 0a 0d 0a 20 20 20 20 20  30319";....     
1d020 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1d030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1d070 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
1d080 6e 73 74 20 73 74 72 69 6e 67 20 4e 61 6d 65 41  nst string NameA
1d090 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 20 3d 20  ndValueFormat = 
1d0a0 22 7b 30 7d 3a 20 7b 31 7d 22 3b 0d 0a 20 20 20  "{0}: {1}";..   
1d0b0 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e       private con
1d0c0 73 74 20 73 74 72 69 6e 67 20 4c 6f 67 46 69 6c  st string LogFil
1d0d0 65 53 75 66 66 69 78 20 3d 20 22 2e 6c 6f 67 22  eSuffix = ".log"
1d0e0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  ;....        ///
1d0f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d100 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d110 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d120 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d130 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
1d140 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 72  private static r
1d150 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 56  eadonly string V
1d160 73 49 64 46 6f 72 6d 61 74 20 3d 20 22 42 22 3b  sIdFormat = "B";
1d170 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
1d180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d1a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d1b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d1c0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
1d1d0 72 69 76 61 74 65 20 73 74 61 74 69 63 20 72 65  rivate static re
1d1e0 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 46 72  adonly string Fr
1d1f0 61 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d 65 20 3d  ameworkKeyName =
1d200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ..            "S
1d210 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f  oftware\\Microso
1d220 66 74 5c 5c 2e 4e 45 54 46 72 61 6d 65 77 6f 72  ft\\.NETFramewor
1d230 6b 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  k";....        /
1d240 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d250 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d260 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d270 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d280 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1d290 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1d2a0 20 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67   readonly string
1d2b0 20 58 50 61 74 68 46 6f 72 41 64 64 45 6c 65 6d   XPathForAddElem
1d2c0 65 6e 74 20 3d 0d 0a 20 20 20 20 20 20 20 20 20  ent =..         
1d2d0 20 20 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f     "configuratio
1d2e0 6e 2f 73 79 73 74 65 6d 2e 64 61 74 61 2f 44 62  n/system.data/Db
1d2f0 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72 69 65  ProviderFactorie
1d300 73 2f 61 64 64 5b 40 69 6e 76 61 72 69 61 6e 74  s/add[@invariant
1d310 3d 5c 22 7b 30 7d 5c 22 5d 22 3b 0d 0a 0d 0a 20  =\"{0}\"]";.... 
1d320 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
1d330 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73  tatic readonly s
1d340 74 72 69 6e 67 20 58 50 61 74 68 46 6f 72 52 65  tring XPathForRe
1d350 6d 6f 76 65 45 6c 65 6d 65 6e 74 20 3d 0d 0a 20  moveElement =.. 
1d360 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1d370 69 67 75 72 61 74 69 6f 6e 2f 73 79 73 74 65 6d  iguration/system
1d380 2e 64 61 74 61 2f 44 62 50 72 6f 76 69 64 65 72  .data/DbProvider
1d390 46 61 63 74 6f 72 69 65 73 2f 72 65 6d 6f 76 65  Factories/remove
1d3a0 5b 40 69 6e 76 61 72 69 61 6e 74 3d 5c 22 7b 30  [@invariant=\"{0
1d3b0 7d 5c 22 5d 22 3b 0d 0a 20 20 20 20 20 20 20 20  }\"]";..        
1d3c0 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
1d3d0 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1d3e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d3f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d400 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d410 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1d420 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e  .        #region
1d430 20 50 72 69 76 61 74 65 20 53 74 61 74 69 63 20   Private Static 
1d440 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20 70 72  Data..        pr
1d450 69 76 61 74 65 20 73 74 61 74 69 63 20 41 73 73  ivate static Ass
1d460 65 6d 62 6c 79 20 74 68 69 73 41 73 73 65 6d 62  embly thisAssemb
1d470 6c 79 20 3d 20 41 73 73 65 6d 62 6c 79 2e 47 65  ly = Assembly.Ge
1d480 74 45 78 65 63 75 74 69 6e 67 41 73 73 65 6d 62  tExecutingAssemb
1d490 6c 79 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ly();....       
1d4a0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1d4b0 73 74 72 69 6e 67 20 74 72 61 63 65 43 61 74 65  string traceCate
1d4c0 67 6f 72 79 20 3d 20 50 61 74 68 2e 47 65 74 46  gory = Path.GetF
1d4d0 69 6c 65 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20  ileName(..      
1d4e0 20 20 20 20 20 20 74 68 69 73 41 73 73 65 6d 62        thisAssemb
1d4f0 6c 79 2e 4c 6f 63 61 74 69 6f 6e 29 3b 20 2f 2a  ly.Location); /*
1d500 20 4e 4f 54 45 3a 20 53 61 6d 65 20 66 6f 72 20   NOTE: Same for 
1d510 64 65 62 75 67 20 61 6e 64 20 74 72 61 63 65 2e  debug and trace.
1d520 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70   */....        p
1d530 72 69 76 61 74 65 20 73 74 61 74 69 63 20 54 72  rivate static Tr
1d540 61 63 65 43 61 6c 6c 62 61 63 6b 20 64 65 62 75  aceCallback debu
1d550 67 43 61 6c 6c 62 61 63 6b 20 3d 20 41 70 70 44  gCallback = AppD
1d560 65 62 75 67 3b 0d 0a 20 20 20 20 20 20 20 20 70  ebug;..        p
1d570 72 69 76 61 74 65 20 73 74 61 74 69 63 20 54 72  rivate static Tr
1d580 61 63 65 43 61 6c 6c 62 61 63 6b 20 74 72 61 63  aceCallback trac
1d590 65 43 61 6c 6c 62 61 63 6b 20 3d 20 41 70 70 54  eCallback = AppT
1d5a0 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20 20 23  race;..        #
1d5b0 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
1d5c0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1d5d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d5e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d5f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d600 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1d610 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1d620 54 72 61 63 65 20 48 61 6e 64 6c 69 6e 67 0d 0a  Trace Handling..
1d630 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1d640 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47 65  static string Ge
1d650 74 4c 6f 67 46 69 6c 65 4e 61 6d 65 28 29 20 2f  tLogFileName() /
1d660 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20  * throw */..    
1d670 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1d680 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61     string fileNa
1d690 6d 65 20 3d 20 50 61 74 68 2e 47 65 74 54 65 6d  me = Path.GetTem
1d6a0 70 46 69 6c 65 4e 61 6d 65 28 29 3b 0d 0a 20 20  pFileName();..  
1d6b0 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1d6c0 20 64 69 72 65 63 74 6f 72 79 20 3d 20 50 61 74   directory = Pat
1d6d0 68 2e 47 65 74 44 69 72 65 63 74 6f 72 79 4e 61  h.GetDirectoryNa
1d6e0 6d 65 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20  me(fileName);.. 
1d6f0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1d700 67 20 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 3d  g fileNameOnly =
1d710 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e 61 6d   Path.GetFileNam
1d720 65 57 69 74 68 6f 75 74 45 78 74 65 6e 73 69 6f  eWithoutExtensio
1d730 6e 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  n(fileName);....
1d740 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1d750 6e 67 20 6e 65 77 46 69 6c 65 4e 61 6d 65 20 3d  ng newFileName =
1d760 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69   Path.Combine(di
1d770 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  rectory,..      
1d780 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
1d790 61 74 65 67 6f 72 79 20 2b 20 22 2e 22 20 2b 20  ategory + "." + 
1d7a0 66 69 6c 65 4e 61 6d 65 4f 6e 6c 79 20 2b 20 4c  fileNameOnly + L
1d7b0 6f 67 46 69 6c 65 53 75 66 66 69 78 29 3b 0d 0a  ogFileSuffix);..
1d7c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ..            Fi
1d7d0 6c 65 2e 4d 6f 76 65 28 66 69 6c 65 4e 61 6d 65  le.Move(fileName
1d7e0 2c 20 6e 65 77 46 69 6c 65 4e 61 6d 65 29 3b 0d  , newFileName);.
1d7f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ...            r
1d800 65 74 75 72 6e 20 6e 65 77 46 69 6c 65 4e 61 6d  eturn newFileNam
1d810 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d  e;..        }...
1d820 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
1d830 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d840 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d850 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d870 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
1d880 61 74 65 20 73 74 61 74 69 63 20 76 6f 69 64 20  ate static void 
1d890 41 70 70 44 65 62 75 67 28 0d 0a 20 20 20 20 20  AppDebug(..     
1d8a0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6d 65         string me
1d8b0 73 73 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20  ssage,..        
1d8c0 20 20 20 20 73 74 72 69 6e 67 20 63 61 74 65 67      string categ
1d8d0 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ory..           
1d8e0 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
1d8f0 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1d900 4f 70 73 2e 44 65 62 75 67 43 6f 72 65 28 53 74  Ops.DebugCore(St
1d910 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1d930 61 63 65 4f 70 73 2e 44 65 62 75 67 46 6f 72 6d  aceOps.DebugForm
1d940 61 74 2c 20 54 72 61 63 65 4f 70 73 2e 4e 65 78  at, TraceOps.Nex
1d950 74 44 65 62 75 67 49 64 28 29 2c 0d 0a 20 20 20  tDebugId(),..   
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
1d970 63 65 4f 70 73 2e 54 69 6d 65 53 74 61 6d 70 28  ceOps.TimeStamp(
1d980 44 61 74 65 54 69 6d 65 2e 55 74 63 4e 6f 77 29  DateTime.UtcNow)
1d990 2c 20 6d 65 73 73 61 67 65 29 2c 20 63 61 74 65  , message), cate
1d9a0 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20  gory);..        
1d9b0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
1d9c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d9d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d9e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d9f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1da00 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
1da10 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 76  private static v
1da20 6f 69 64 20 41 70 70 54 72 61 63 65 28 0d 0a 20  oid AppTrace(.. 
1da30 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1da40 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20  g message,..    
1da50 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 63          string c
1da60 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20 20 20  ategory..       
1da70 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1da80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  {..            T
1da90 72 61 63 65 4f 70 73 2e 54 72 61 63 65 43 6f 72  raceOps.TraceCor
1daa0 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
1dab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1dac0 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
1dad0 46 6f 72 6d 61 74 2c 20 54 72 61 63 65 4f 70 73  Format, TraceOps
1dae0 2e 4e 65 78 74 54 72 61 63 65 49 64 28 29 2c 0d  .NextTraceId(),.
1daf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db00 20 54 72 61 63 65 4f 70 73 2e 54 69 6d 65 53 74   TraceOps.TimeSt
1db10 61 6d 70 28 44 61 74 65 54 69 6d 65 2e 55 74 63  amp(DateTime.Utc
1db20 4e 6f 77 29 2c 20 6d 65 73 73 61 67 65 29 2c 20  Now), message), 
1db30 63 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20  category);..    
1db40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23      }..        #
1db50 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
1db60 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1db70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1db80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1db90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
1dbb0 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
1dbc0 47 65 6e 65 72 69 63 20 53 74 72 69 6e 67 20 48  Generic String H
1dbd0 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  andling..       
1dbe0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1dbf0 73 74 72 69 6e 67 20 46 6f 72 44 69 73 70 6c 61  string ForDispla
1dc00 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
1dc10 6f 62 6a 65 63 74 20 76 61 6c 75 65 0d 0a 20 20  object value..  
1dc20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
1dc30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1dc40 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d      if (value ==
1dc50 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1dc60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
1dc70 3c 6e 75 6c 6c 3e 22 3b 0d 0a 0d 0a 20 20 20 20  <null>";....    
1dc80 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 72          string r
1dc90 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20  esult;..        
1dca0 20 20 20 20 54 79 70 65 20 74 79 70 65 20 3d 20      Type type = 
1dcb0 76 61 6c 75 65 2e 47 65 74 54 79 70 65 28 29 3b  value.GetType();
1dcc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1dcd0 69 66 20 28 74 79 70 65 20 3d 3d 20 74 79 70 65  if (type == type
1dce0 6f 66 28 58 6d 6c 45 6c 65 6d 65 6e 74 29 29 0d  of(XmlElement)).
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd10 58 6d 6c 45 6c 65 6d 65 6e 74 20 65 6c 65 6d 65  XmlElement eleme
1dd20 6e 74 20 3d 20 28 58 6d 6c 45 6c 65 6d 65 6e 74  nt = (XmlElement
1dd30 29 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20  )value;....     
1dd40 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1dd50 74 20 3d 20 65 6c 65 6d 65 6e 74 2e 4f 75 74 65  t = element.Oute
1dd60 72 58 6d 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  rXml;..         
1dd70 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dd80 20 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20    else if (type 
1dd90 3d 3d 20 74 79 70 65 6f 66 28 56 65 72 73 69 6f  == typeof(Versio
1dda0 6e 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n))..           
1ddb0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ddc0 20 20 20 20 56 65 72 73 69 6f 6e 20 76 65 72 73      Version vers
1ddd0 69 6f 6e 20 3d 20 28 56 65 72 73 69 6f 6e 29 76  ion = (Version)v
1dde0 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alue;....       
1ddf0 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
1de00 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
1de10 22 76 7b 30 7d 22 2c 20 76 65 72 73 69 6f 6e 29  "v{0}", version)
1de20 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1de30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ..            el
1de40 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
1de50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1de60 20 20 20 72 65 73 75 6c 74 20 3d 20 76 61 6c 75     result = valu
1de70 65 2e 54 6f 53 74 72 69 6e 67 28 29 3b 0d 0a 0d  e.ToString();...
1de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de90 20 69 66 20 28 72 65 73 75 6c 74 2e 4c 65 6e 67   if (result.Leng
1dea0 74 68 20 3d 3d 20 30 29 0d 0a 20 20 20 20 20 20  th == 0)..      
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1dec0 74 75 72 6e 20 22 3c 65 6d 70 74 79 3e 22 3b 0d  turn "<empty>";.
1ded0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1dee0 20 20 20 72 65 73 75 6c 74 20 3d 20 53 74 72 69     result = Stri
1def0 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 74 79 70 65 2e 49 73 53 75 62 63 6c 61 73 73 4f  type.IsSubclassO
1df20 66 28 74 79 70 65 6f 66 28 56 61 6c 75 65 54 79  f(typeof(ValueTy
1df30 70 65 29 29 20 3f 20 22 7b 30 7d 22 20 3a 20 22  pe)) ? "{0}" : "
1df40 5c 22 7b 30 7d 5c 22 22 2c 0d 0a 20 20 20 20 20  \"{0}\"",..     
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1df60 65 73 75 6c 74 29 3b 0d 0a 20 20 20 20 20 20 20  esult);..       
1df70 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1df80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73        return res
1df90 75 6c 74 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  ult;..        }.
1dfa0 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
1dfb0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
1dfc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dfd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dfe0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dff0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e000 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1e010 20 20 23 72 65 67 69 6f 6e 20 2e 4e 45 54 20 46    #region .NET F
1e020 72 61 6d 65 77 6f 72 6b 20 48 61 6e 64 6c 69 6e  ramework Handlin
1e030 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  g..        priva
1e040 74 65 20 73 74 61 74 69 63 20 73 74 72 69 6e 67  te static string
1e050 20 47 65 74 49 6d 61 67 65 52 75 6e 74 69 6d 65   GetImageRuntime
1e060 56 65 72 73 69 6f 6e 28 0d 0a 20 20 20 20 20 20  Version(..      
1e070 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c        string fil
1e080 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20  eName..         
1e090 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
1e0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
1e0b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1e0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e0d0 20 41 73 73 65 6d 62 6c 79 20 61 73 73 65 6d 62   Assembly assemb
1e0e0 6c 79 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20  ly =..          
1e0f0 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d 62            Assemb
1e100 6c 79 2e 52 65 66 6c 65 63 74 69 6f 6e 4f 6e 6c  ly.ReflectionOnl
1e110 79 4c 6f 61 64 46 72 6f 6d 28 66 69 6c 65 4e 61  yLoadFrom(fileNa
1e120 6d 65 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  me); /* throw */
1e130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1e140 20 20 20 20 69 66 20 28 61 73 73 65 6d 62 6c 79      if (assembly
1e150 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e170 65 74 75 72 6e 20 61 73 73 65 6d 62 6c 79 2e 49  eturn assembly.I
1e180 6d 61 67 65 52 75 6e 74 69 6d 65 56 65 72 73 69  mageRuntimeVersi
1e190 6f 6e 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on;..           
1e1a0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1e1b0 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20 20 20  catch..         
1e1c0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1e1d0 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
1e1e0 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
1e1f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1e200 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d     return null;.
1e210 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1e220 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1e230 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e240 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e250 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e260 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1e270 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
1e280 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 47   static string G
1e290 65 74 46 72 61 6d 65 77 6f 72 6b 44 69 72 65 63  etFrameworkDirec
1e2a0 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20  tory(..         
1e2b0 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b     MockRegistryK
1e2c0 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
1e2d0 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e           Version
1e2e0 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
1e2f0 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
1e300 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
1e310 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
1e320 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
1e330 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
1e340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
1e350 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
1e360 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73  yKey key = Regis
1e370 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
1e380 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1e390 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
1e3a0 65 79 2c 20 46 72 61 6d 65 77 6f 72 6b 4b 65 79  ey, FrameworkKey
1e3b0 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61  Name, false, wha
1e3c0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1e3f0 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  f (key == null).
1e400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e410 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
1e420 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1e430 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
1e440 65 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70  e = RegistryHelp
1e450 65 72 2e 47 65 74 56 61 6c 75 65 28 0d 0a 20 20  er.GetValue(..  
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 6b 65 79 2c 20 22 49 6e 73 74 61 6c 6c 52    key, "InstallR
1e480 6f 6f 74 22 2c 20 6e 75 6c 6c 2c 20 77 68 61 74  oot", null, what
1e490 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d  If, verbose);...
1e4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e4b0 20 69 66 20 28 21 28 76 61 6c 75 65 20 69 73 20   if (!(value is 
1e4c0 73 74 72 69 6e 67 29 29 0d 0a 20 20 20 20 20 20  string))..      
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e4e0 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1e500 74 75 72 6e 20 50 61 74 68 2e 43 6f 6d 62 69 6e  turn Path.Combin
1e510 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
1e520 20 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 29          (string)
1e530 76 61 6c 75 65 2c 20 53 74 72 69 6e 67 2e 46 6f  value, String.Fo
1e540 72 6d 61 74 28 22 76 7b 30 7d 22 2c 20 66 72 61  rmat("v{0}", fra
1e550 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 29 3b  meworkVersion));
1e560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1e570 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1e580 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
1e590 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1e5a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e5b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e5c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e5d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e5e0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
1e5f0 67 69 6f 6e 20 50 65 72 2d 46 72 61 6d 65 77 6f  gion Per-Framewo
1e600 72 6b 2f 50 6c 61 74 66 6f 72 6d 20 48 61 6e 64  rk/Platform Hand
1e610 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72  ling..        pr
1e620 69 76 61 74 65 20 73 74 61 74 69 63 20 76 6f 69  ivate static voi
1e630 64 20 49 6e 69 74 69 61 6c 69 7a 65 46 72 61 6d  d InitializeFram
1e640 65 77 6f 72 6b 4c 69 73 74 28 0d 0a 20 20 20 20  eworkList(..    
1e650 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
1e660 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
1e670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f  ..            Co
1e680 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66  nfiguration conf
1e690 69 67 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  iguration,..    
1e6a0 20 20 20 20 20 20 20 20 72 65 66 20 46 72 61 6d          ref Fram
1e6b0 65 77 6f 72 6b 4c 69 73 74 20 66 72 61 6d 65 77  eworkList framew
1e6c0 6f 72 6b 4c 69 73 74 0d 0a 20 20 20 20 20 20 20  orkList..       
1e6d0 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1e6e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
1e6f0 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74  f (frameworkList
1e700 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1e710 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d 65             frame
1e720 77 6f 72 6b 4c 69 73 74 20 3d 20 6e 65 77 20 46  workList = new F
1e730 72 61 6d 65 77 6f 72 6b 4c 69 73 74 28 29 3b 0d  rameworkList();.
1e740 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1e750 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74  f (frameworkList
1e760 2e 52 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c  .RootKey == null
1e770 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1e780 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74     frameworkList
1e790 2e 52 6f 6f 74 4b 65 79 20 3d 20 72 6f 6f 74 4b  .RootKey = rootK
1e7a0 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ey;....         
1e7b0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1e7c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e7d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e7e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e7f0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1e800 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77        if (framew
1e810 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 20 3d 3d  orkList.Names ==
1e820 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1e830 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1e840 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b         framework
1e850 4c 69 73 74 2e 4e 61 6d 65 73 20 3d 20 6e 65 77  List.Names = new
1e860 20 53 74 72 69 6e 67 4c 69 73 74 28 29 3b 0d 0a   StringList();..
1e870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e880 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61    if ((configura
1e890 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c  tion == null) ||
1e8a0 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   !configuration.
1e8b0 4e 6f 44 65 73 6b 74 6f 70 29 0d 0a 20 20 20 20  NoDesktop)..    
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e 61  frameworkList.Na
1e8e0 6d 65 73 2e 41 64 64 28 22 2e 4e 45 54 46 72 61  mes.Add(".NETFra
1e8f0 6d 65 77 6f 72 6b 22 29 3b 0d 0a 0d 0a 20 20 20  mework");....   
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1e910 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ((configuration 
1e920 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e  == null) || !con
1e930 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f 6d  figuration.NoCom
1e940 70 61 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  pact)..         
1e950 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
1e970 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65  ameworkList.Name
1e980 73 2e 41 64 64 28 22 2e 4e 45 54 43 6f 6d 70 61  s.Add(".NETCompa
1e990 63 74 46 72 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a  ctFramework");..
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73      frameworkLis
1e9c0 74 2e 4e 61 6d 65 73 2e 41 64 64 28 22 2e 4e 45  t.Names.Add(".NE
1e9d0 54 43 6f 6d 70 61 63 74 46 72 61 6d 65 77 6f 72  TCompactFramewor
1e9e0 6b 22 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  k");..          
1e9f0 20 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 77            framew
1ea00 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 2e 41 64  orkList.Names.Ad
1ea10 64 28 22 2e 4e 45 54 43 6f 6d 70 61 63 74 46 72  d(".NETCompactFr
1ea20 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a 20 20 20 20  amework");..    
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
1ea40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
1ea60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ea70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ea80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ea90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1eaa0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1eab0 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74  f (frameworkList
1eac0 2e 56 65 72 73 69 6f 6e 73 20 3d 3d 20 6e 75 6c  .Versions == nul
1ead0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1eae0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1eaf0 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74     frameworkList
1eb00 2e 56 65 72 73 69 6f 6e 73 20 3d 20 6e 65 77 20  .Versions = new 
1eb10 56 65 72 73 69 6f 6e 4d 61 70 28 29 3b 0d 0a 0d  VersionMap();...
1eb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb30 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74   if ((configurat
1eb40 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20  ion == null) || 
1eb50 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e  !configuration.N
1eb60 6f 44 65 73 6b 74 6f 70 29 0d 0a 20 20 20 20 20  oDesktop)..     
1eb70 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 56 65 72 73 69 6f 6e 4c 69 73 74 20 64 65    VersionList de
1eba0 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74  sktopVersionList
1ebb0 20 3d 20 6e 65 77 20 56 65 72 73 69 6f 6e 4c 69   = new VersionLi
1ebc0 73 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  st();....       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1ebe0 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ((configuration 
1ebf0 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e  == null) || !con
1ec00 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 4e 65 74  figuration.NoNet
1ec10 46 78 32 30 29 0d 0a 20 20 20 20 20 20 20 20 20  Fx20)..         
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1ec30 65 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73  esktopVersionLis
1ec40 74 2e 41 64 64 28 6e 65 77 20 56 65 72 73 69 6f  t.Add(new Versio
1ec50 6e 28 32 2c 20 30 2c 20 35 30 37 32 37 29 29 3b  n(2, 0, 50727));
1ec60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ec70 20 20 20 20 20 20 20 20 69 66 20 28 28 63 6f 6e          if ((con
1ec80 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75  figuration == nu
1ec90 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75 72  ll) || !configur
1eca0 61 74 69 6f 6e 2e 4e 6f 4e 65 74 46 78 34 30 29  ation.NoNetFx40)
1ecb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1ecc0 20 20 20 20 20 20 20 20 20 20 64 65 73 6b 74 6f            deskto
1ecd0 70 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64  pVersionList.Add
1ece0 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 34 2c 20  (new Version(4, 
1ecf0 30 2c 20 33 30 33 31 39 29 29 3b 0d 0a 0d 0a 20  0, 30319));.... 
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74     frameworkList
1ed20 2e 56 65 72 73 69 6f 6e 73 2e 41 64 64 28 22 2e  .Versions.Add(".
1ed30 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22 2c 0d 0a  NETFramework",..
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 20 20 20 20 20 20 64 65 73 6b 74 6f 70 56          desktopV
1ed60 65 72 73 69 6f 6e 4c 69 73 74 29 3b 0d 0a 20 20  ersionList);..  
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1ed80 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1ed90 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75 72     if ((configur
1eda0 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c  ation == null) |
1edb0 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  | !configuration
1edc0 2e 4e 6f 43 6f 6d 70 61 63 74 29 0d 0a 20 20 20  .NoCompact)..   
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73      frameworkLis
1ee00 74 2e 56 65 72 73 69 6f 6e 73 2e 41 64 64 28 22  t.Versions.Add("
1ee10 2e 4e 45 54 43 6f 6d 70 61 63 74 46 72 61 6d 65  .NETCompactFrame
1ee20 77 6f 72 6b 22 2c 0d 0a 20 20 20 20 20 20 20 20  work",..        
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 6e 65 77 20 56 65 72 73 69 6f 6e 4c 69 73 74 28  new VersionList(
1ee50 6e 65 77 20 56 65 72 73 69 6f 6e 5b 5d 20 7b 0d  new Version[] {.
1ee60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee70 20 20 20 20 20 20 20 20 20 6e 65 77 20 56 65 72           new Ver
1ee80 73 69 6f 6e 28 32 2c 20 30 2c 20 30 2c 20 30 29  sion(2, 0, 0, 0)
1ee90 2c 20 6e 65 77 20 56 65 72 73 69 6f 6e 28 33 2c  , new Version(3,
1eea0 20 35 2c 20 30 2c 20 30 29 0d 0a 20 20 20 20 20   5, 0, 0)..     
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1eec0 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ));..           
1eed0 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
1eee0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1eef0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
1ef00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ef10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ef20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ef30 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1ef40 20 20 20 20 20 20 20 20 69 66 20 28 66 72 61 6d          if (fram
1ef50 65 77 6f 72 6b 4c 69 73 74 2e 50 6c 61 74 66 6f  eworkList.Platfo
1ef60 72 6d 4e 61 6d 65 73 20 3d 3d 20 6e 75 6c 6c 29  rmNames == null)
1ef70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1ef80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef90 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 50   frameworkList.P
1efa0 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 20 3d 20 6e  latformNames = n
1efb0 65 77 20 53 74 72 69 6e 67 4c 69 73 74 28 29 3b  ew StringList();
1efc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1efd0 20 20 20 20 69 66 20 28 28 63 6f 6e 66 69 67 75      if ((configu
1efe0 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 20  ration == null) 
1eff0 7c 7c 20 21 63 6f 6e 66 69 67 75 72 61 74 69 6f  || !configuratio
1f000 6e 2e 4e 6f 44 65 73 6b 74 6f 70 29 0d 0a 20 20  n.NoDesktop)..  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e    frameworkList.
1f030 50 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 2e 41 64  PlatformNames.Ad
1f040 64 28 6e 75 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20  d(null);....    
1f050 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1f060 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d  (configuration =
1f070 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66  = null) || !conf
1f080 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f 6d 70  iguration.NoComp
1f090 61 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  act)..          
1f0a0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61               fra
1f0c0 6d 65 77 6f 72 6b 4c 69 73 74 2e 50 6c 61 74 66  meworkList.Platf
1f0d0 6f 72 6d 4e 61 6d 65 73 2e 41 64 64 28 22 50 6f  ormNames.Add("Po
1f0e0 63 6b 65 74 50 43 22 29 3b 0d 0a 20 20 20 20 20  cketPC");..     
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1f100 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 50 6c 61  rameworkList.Pla
1f110 74 66 6f 72 6d 4e 61 6d 65 73 2e 41 64 64 28 22  tformNames.Add("
1f120 53 6d 61 72 74 70 68 6f 6e 65 22 29 3b 0d 0a 20  Smartphone");.. 
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74     frameworkList
1f150 2e 50 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 2e 41  .PlatformNames.A
1f160 64 64 28 22 57 69 6e 64 6f 77 73 43 45 22 29 3b  dd("WindowsCE");
1f170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f180 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
1f190 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
1f1a0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
1f1b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f1c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f1d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f1e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f1f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
1f200 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20  ate static bool 
1f210 48 61 76 65 46 72 61 6d 65 77 6f 72 6b 28 0d 0a  HaveFramework(..
1f220 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
1f230 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
1f240 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
1f250 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f    string framewo
1f260 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  rkName,..       
1f270 20 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61       Version fra
1f280 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a  meworkVersion,..
1f290 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1f2a0 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c  ng platformName,
1f2b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1f2c0 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
1f2d0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
1f2e0 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  bose..          
1f2f0 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
1f300 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1f310 6e 67 20 66 6f 72 6d 61 74 20 3d 20 21 53 74 72  ng format = !Str
1f320 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
1f330 79 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 20  y(platformName) 
1f340 3f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ?..             
1f350 20 20 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69     "Software\\Mi
1f360 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d 5c 5c 76 7b  crosoft\\{0}\\v{
1f370 31 7d 5c 5c 7b 32 7d 22 20 3a 0d 0a 20 20 20 20  1}\\{2}" :..    
1f380 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 66              "Sof
1f390 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74  tware\\Microsoft
1f3a0 5c 5c 7b 30 7d 5c 5c 76 7b 31 7d 22 3b 0d 0a 0d  \\{0}\\v{1}";...
1f3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1f3c0 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20 53 74  ing keyName = St
1f3d0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
1f3f0 72 6d 61 74 2c 20 66 72 61 6d 65 77 6f 72 6b 4e  rmat, frameworkN
1f400 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65  ame, frameworkVe
1f410 72 73 69 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e  rsion, platformN
1f420 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
1f430 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
1f440 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20  RegistryKey key 
1f450 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
1f460 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20  .OpenSubKey(..  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f480 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61    rootKey, keyNa
1f490 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49  me, false, whatI
1f4a0 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
1f4b0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1f4d0 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  (key == null).. 
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
1f500 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f510 20 20 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d      if (platform
1f520 4e 61 6d 65 20 21 3d 20 6e 75 6c 6c 29 20 2f 2f  Name != null) //
1f530 20 4e 4f 54 45 3a 20 53 6b 69 70 20 6e 6f 6e 2d   NOTE: Skip non-
1f540 64 65 73 6b 74 6f 70 2e 0d 0a 20 20 20 20 20 20  desktop...      
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1f560 74 75 72 6e 20 74 72 75 65 3b 0d 0a 0d 0a 20 20  turn true;....  
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1f580 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 3d  ring directory =
1f590 20 47 65 74 46 72 61 6d 65 77 6f 72 6b 44 69 72   GetFrameworkDir
1f5a0 65 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20  ectory(..       
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1f5c0 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 56  tKey, frameworkV
1f5d0 65 72 73 69 6f 6e 2c 20 77 68 61 74 49 66 2c 20  ersion, whatIf, 
1f5e0 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1f600 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72  (String.IsNullOr
1f610 45 6d 70 74 79 28 64 69 72 65 63 74 6f 72 79 29  Empty(directory)
1f620 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1f630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
1f640 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
1f650 20 20 20 20 20 20 20 20 69 66 20 28 21 44 69 72          if (!Dir
1f660 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 64 69  ectory.Exists(di
1f670 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20  rectory))..     
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f690 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1f6c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
1f6d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f6e0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1f6f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f720 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1f730 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
1f740 74 69 63 20 62 6f 6f 6c 20 46 6f 72 45 61 63 68  tic bool ForEach
1f750 46 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 28  FrameworkConfig(
1f760 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f  ..            Mo
1f770 63 6b 52 65 67 69 73 74 72 79 20 72 65 67 69 73  ckRegistry regis
1f780 74 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  try,..          
1f790 20 20 46 72 61 6d 65 77 6f 72 6b 4c 69 73 74 20    FrameworkList 
1f7a0 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2c 0d 0a  frameworkList,..
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 46 72 61 6d              Fram
1f7c0 65 77 6f 72 6b 43 6f 6e 66 69 67 43 61 6c 6c 62  eworkConfigCallb
1f7d0 61 63 6b 20 63 61 6c 6c 62 61 63 6b 2c 0d 0a 20  ack callback,.. 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1f7f0 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20  g invariant,..  
1f800 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1f810 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20   name,..        
1f820 20 20 20 20 73 74 72 69 6e 67 20 64 65 73 63 72      string descr
1f830 69 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  iption,..       
1f840 20 20 20 20 20 73 74 72 69 6e 67 20 74 79 70 65       string type
1f850 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1f860 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
1f870 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20  assemblyName,.. 
1f880 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
1f890 74 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20  t clientData,.. 
1f8a0 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
1f8b0 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c 0d  throwOnMissing,.
1f8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1f8d0 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
1f8e0 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
1f8f0 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ose,..          
1f900 20 20 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64    ref bool saved
1f910 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
1f920 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
1f930 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
1f940 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1f950 20 20 20 20 20 20 20 69 66 20 28 72 65 67 69 73         if (regis
1f960 74 72 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  try == null)..  
1f970 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1f990 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 65  or = "invalid re
1f9a0 67 69 73 74 72 79 22 3b 0d 0a 20 20 20 20 20 20  gistry";..      
1f9b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f9c0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
1f9d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1f9e0 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77        if (framew
1f9f0 6f 72 6b 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29  orkList == null)
1fa00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1fa10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69   error = "invali
1fa30 64 20 66 72 61 6d 65 77 6f 72 6b 20 6c 69 73 74  d framework list
1fa40 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
1fa50 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1fa60 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1fa70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1fa80 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
1fa90 72 6f 6f 74 4b 65 79 20 3d 20 66 72 61 6d 65 77  rootKey = framew
1faa0 6f 72 6b 4c 69 73 74 2e 52 6f 6f 74 4b 65 79 3b  orkList.RootKey;
1fab0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1fac0 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
1fad0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1fae0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1faf0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
1fb00 76 61 6c 69 64 20 72 6f 6f 74 20 6b 65 79 22 3b  valid root key";
1fb10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
1fb30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1fb40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1fb50 20 28 21 4f 62 6a 65 63 74 2e 52 65 66 65 72 65   (!Object.Refere
1fb60 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b 65  nceEquals(rootKe
1fb70 79 2c 20 72 65 67 69 73 74 72 79 2e 43 75 72 72  y, registry.Curr
1fb80 65 6e 74 55 73 65 72 29 20 26 26 0d 0a 20 20 20  entUser) &&..   
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 21 4f 62               !Ob
1fba0 6a 65 63 74 2e 52 65 66 65 72 65 6e 63 65 45 71  ject.ReferenceEq
1fbb0 75 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20 72 65  uals(rootKey, re
1fbc0 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63 68  gistry.LocalMach
1fbd0 69 6e 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ine))..         
1fbe0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1fbf0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 72        error = "r
1fc00 6f 6f 74 20 6b 65 79 20 6d 75 73 74 20 62 65 20  oot key must be 
1fc10 70 65 72 2d 75 73 65 72 20 6f 72 20 70 65 72 2d  per-user or per-
1fc20 6d 61 63 68 69 6e 65 22 3b 0d 0a 20 20 20 20 20  machine";..     
1fc30 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1fc40 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1fc50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1fc60 20 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65         if (frame
1fc70 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 20 3d  workList.Names =
1fc80 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1fc90 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1fca0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
1fcb0 22 6e 6f 20 66 72 61 6d 65 77 6f 72 6b 20 6e 61  "no framework na
1fcc0 6d 65 73 20 66 6f 75 6e 64 22 3b 0d 0a 20 20 20  mes found";..   
1fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1fce0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1fcf0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1fd00 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72 61           if (fra
1fd10 6d 65 77 6f 72 6b 4c 69 73 74 2e 56 65 72 73 69  meworkList.Versi
1fd20 6f 6e 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ons == null)..  
1fd30 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1fd50 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77 6f  or = "no framewo
1fd60 72 6b 20 76 65 72 73 69 6f 6e 73 20 66 6f 75 6e  rk versions foun
1fd70 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d";..           
1fd80 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
1fd90 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1fda0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1fdb0 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c 69   if (frameworkLi
1fdc0 73 74 2e 50 6c 61 74 66 6f 72 6d 4e 61 6d 65 73  st.PlatformNames
1fdd0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1fde0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1fdf0 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
1fe00 3d 20 22 6e 6f 20 70 6c 61 74 66 6f 72 6d 20 6e  = "no platform n
1fe10 61 6d 65 73 20 66 6f 75 6e 64 22 3b 0d 0a 20 20  ames found";..  
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1fe30 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
1fe40 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1fe50 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72            if (fr
1fe60 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65  ameworkList.Name
1fe70 73 2e 43 6f 75 6e 74 20 21 3d 20 66 72 61 6d 65  s.Count != frame
1fe80 77 6f 72 6b 4c 69 73 74 2e 50 6c 61 74 66 6f 72  workList.Platfor
1fe90 6d 4e 61 6d 65 73 2e 43 6f 75 6e 74 29 0d 0a 20  mNames.Count).. 
1fea0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
1fec0 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
1fed0 6d 61 74 28 22 66 72 61 6d 65 77 6f 72 6b 20 6e  mat("framework n
1fee0 61 6d 65 20 63 6f 75 6e 74 20 7b 30 7d 20 64 6f  ame count {0} do
1fef0 65 73 20 6e 6f 74 20 22 20 2b 0d 0a 20 20 20 20  es not " +..    
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 22 6d 61 74 63 68 20 70 6c 61 74 66 6f 72 6d 20  "match platform 
1ff20 6e 61 6d 65 20 63 6f 75 6e 74 20 7b 31 7d 22 2c  name count {1}",
1ff30 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e   frameworkList.N
1ff40 61 6d 65 73 2e 43 6f 75 6e 74 2c 0d 0a 20 20 20  ames.Count,..   
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 50   frameworkList.P
1ff70 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 2e 43 6f 75  latformNames.Cou
1ff80 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  nt);....        
1ff90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
1ffa0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
1ffb0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ffc0 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 6e 64      for (int ind
1ffd0 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20 3c 20  ex = 0; index < 
1ffe0 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e 61  frameworkList.Na
1fff0 6d 65 73 2e 43 6f 75 6e 74 3b 20 69 6e 64 65 78  mes.Count; index
20000 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++)..           
20010 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20020 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
20030 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
20040 20 47 72 61 62 20 74 68 65 20 6e 61 6d 65 20 6f   Grab the name o
20050 66 20 74 68 65 20 66 72 61 6d 65 77 6f 72 6b 20  f the framework 
20060 28 65 2e 67 2e 20 22 2e 4e 45 54 46 72 61 6d 65  (e.g. ".NETFrame
20070 77 6f 72 6b 22 29 0d 0a 20 20 20 20 20 20 20 20  work")..        
20080 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
20090 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
200a0 20 74 68 65 20 70 6c 61 74 66 6f 72 6d 20 28 65   the platform (e
200b0 2e 67 2e 20 22 57 69 6e 64 6f 77 73 43 45 22 29  .g. "WindowsCE")
200c0 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
200d0 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
200e0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 72         string fr
200f0 61 6d 65 77 6f 72 6b 4e 61 6d 65 20 3d 20 66 72  ameworkName = fr
20100 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65  ameworkList.Name
20110 73 5b 69 6e 64 65 78 5d 3b 0d 0a 20 20 20 20 20  s[index];..     
20120 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
20130 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 3d  g platformName =
20140 20 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 50   frameworkList.P
20150 6c 61 74 66 6f 72 6d 4e 61 6d 65 73 5b 69 6e 64  latformNames[ind
20160 65 78 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ex];....        
20170 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
20180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
20190 4f 54 45 3a 20 53 6b 69 70 20 61 6c 6c 20 6e 6f  OTE: Skip all no
201a0 6e 2d 64 65 73 6b 74 6f 70 20 66 72 61 6d 65 77  n-desktop framew
201b0 6f 72 6b 73 20 28 69 2e 65 2e 20 69 66 20 74 68  orks (i.e. if th
201c0 65 20 70 6c 61 74 66 6f 72 6d 0d 0a 20 20 20 20  e platform..    
201d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
201e0 20 20 20 20 20 6e 61 6d 65 20 69 73 20 6e 6f 74       name is not
201f0 20 6e 75 6c 6c 29 2e 0d 0a 20 20 20 20 20 20 20   null)...       
20200 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
20210 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
20220 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20 21 3d  (platformName !=
20230 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
20240 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20250 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  inue;....       
20260 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
20280 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20 73  NOTE: Grab the s
20290 75 70 70 6f 72 74 65 64 20 76 65 72 73 69 6f 6e  upported version
202a0 73 20 6f 66 20 74 68 69 73 20 70 61 72 74 69 63  s of this partic
202b0 75 6c 61 72 0d 0a 20 20 20 20 20 20 20 20 20 20  ular..          
202c0 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 66        //       f
202d0 72 61 6d 65 77 6f 72 6b 2e 0d 0a 20 20 20 20 20  ramework...     
202e0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
20300 65 72 73 69 6f 6e 4c 69 73 74 20 66 72 61 6d 65  ersionList frame
20310 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 3b  workVersionList;
20320 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20330 20 20 20 20 69 66 20 28 21 66 72 61 6d 65 77 6f      if (!framewo
20340 72 6b 4c 69 73 74 2e 56 65 72 73 69 6f 6e 73 2e  rkList.Versions.
20350 54 72 79 47 65 74 56 61 6c 75 65 28 0d 0a 20 20  TryGetValue(..  
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e        frameworkN
20380 61 6d 65 2c 20 6f 75 74 20 66 72 61 6d 65 77 6f  ame, out framewo
20390 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 29 20 7c  rkVersionList) |
203a0 7c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  |..             
203b0 20 20 20 20 20 20 20 28 66 72 61 6d 65 77 6f 72         (framewor
203c0 6b 56 65 72 73 69 6f 6e 4c 69 73 74 20 3d 3d 20  kVersionList == 
203d0 6e 75 6c 6c 29 29 0d 0a 20 20 20 20 20 20 20 20  null))..        
203e0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20400 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20  ontinue;..      
20410 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
20430 6f 72 65 61 63 68 20 28 56 65 72 73 69 6f 6e 20  oreach (Version 
20440 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
20450 20 69 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72   in frameworkVer
20460 73 69 6f 6e 4c 69 73 74 29 0d 0a 20 20 20 20 20  sionList)..     
20470 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67    TraceOps.Debug
204a0 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72  AndTrace(TracePr
204b0 69 6f 72 69 74 79 2e 4c 6f 77 65 72 2c 0d 0a 20  iority.Lower,.. 
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c         debugCall
204e0 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62  back, traceCallb
204f0 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
20500 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 72               "fr
20520 61 6d 65 77 6f 72 6b 4e 61 6d 65 20 3d 20 7b 30  ameworkName = {0
20530 7d 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  }, frameworkVers
20540 69 6f 6e 20 3d 20 7b 31 7d 2c 20 22 20 2b 0d 0a  ion = {1}, " +..
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72          "platfor
20570 6d 4e 61 6d 65 20 3d 20 7b 32 7d 22 2c 20 46 6f  mName = {2}", Fo
20580 72 44 69 73 70 6c 61 79 28 66 72 61 6d 65 77 6f  rDisplay(framewo
20590 72 6b 4e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20  rkName),..      
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 46 6f 72 44 69 73 70 6c 61 79 28 66 72 61    ForDisplay(fra
205c0 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 2c 0d  meworkVersion),.
205d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
205e0 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
205f0 6c 61 79 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  lay(platformName
20600 29 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  )), traceCategor
20610 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
20620 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
20630 48 61 76 65 46 72 61 6d 65 77 6f 72 6b 28 0d 0a  HaveFramework(..
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
20660 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61  Key, frameworkNa
20670 6d 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72  me, frameworkVer
20680 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c     platformName,
206b0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
206c0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
206d0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75     TraceOps.Debu
20700 67 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50  gAndTrace(TraceP
20710 72 69 6f 72 69 74 79 2e 4c 6f 77 2c 0d 0a 20 20  riority.Low,..  
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43            debugC
20740 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61  allback, traceCa
20750 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20  llback,..       
20760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20770 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61 6d 65       ".NET Frame
20780 77 6f 72 6b 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  work not found, 
20790 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a 20  skipping...",.. 
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
207c0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
207f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20800 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20820 20 28 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75   (callback == nu
20830 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
20850 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  tinue;....      
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
20870 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 3d  ring directory =
20880 20 47 65 74 46 72 61 6d 65 77 6f 72 6b 44 69 72   GetFrameworkDir
20890 65 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20  ectory(..       
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77   rootKey, framew
208c0 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 77 68 61 74  orkVersion, what
208d0 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d  If, verbose);...
208e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
208f0 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e       if (String.
20900 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69  IsNullOrEmpty(di
20910 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20  rectory))..     
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
20930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20940 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
20950 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65  ps.DebugAndTrace
20960 28 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c  (TracePriority.L
20970 6f 77 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ow,..           
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20   debugCallback, 
209a0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
209b0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 22 2e 4e 45 54             ".NET
209e0 20 46 72 61 6d 65 77 6f 72 6b 20 7b 30 7d 20 64   Framework {0} d
209f0 69 72 65 63 74 6f 72 79 20 69 73 20 69 6e 76 61  irectory is inva
20a00 6c 69 64 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20  lid, " +..      
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 20 20 20 22 73 6b 69 70 70 69 6e 67 2e        "skipping.
20a30 2e 2e 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ..", ForDisplay(
20a40 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
20a50 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
20a80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20a90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20aa0 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
20ab0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 3d 20      directory = 
20ae0 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72  Path.Combine(dir
20af0 65 63 74 6f 72 79 2c 20 22 43 6f 6e 66 69 67 22  ectory, "Config"
20b00 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
20b10 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44            if (!D
20b20 69 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28  irectory.Exists(
20b30 64 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20  directory))..   
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20b60 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
20b70 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
20b80 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
20b90 2e 4c 6f 77 2c 0d 0a 20 20 20 20 20 20 20 20 20  .Low,..         
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b     debugCallback
20bc0 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  , traceCallback,
20bd0 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
20be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2e 4e               ".N
20c00 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 7b 30 7d  ET Framework {0}
20c10 20 64 69 72 65 63 74 6f 72 79 20 7b 31 7d 20 64   directory {1} d
20c20 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 22  oes not exist, "
20c30 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   +..            
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 22 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 20 46  "skipping...", F
20c60 6f 72 44 69 73 70 6c 61 79 28 66 72 61 6d 65 77  orDisplay(framew
20c70 6f 72 6b 56 65 72 73 69 6f 6e 29 2c 0d 0a 20 20  orkVersion),..  
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
20ca0 70 6c 61 79 28 64 69 72 65 63 74 6f 72 79 29 29  play(directory))
20cb0 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29  , traceCategory)
20cc0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
20ce0 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
20d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d10 20 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65       string file
20d20 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62  Name = Path.Comb
20d30 69 6e 65 28 64 69 72 65 63 74 6f 72 79 2c 20 22  ine(directory, "
20d40 6d 61 63 68 69 6e 65 2e 63 6f 6e 66 69 67 22 29  machine.config")
20d50 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
20d60 20 20 20 20 20 20 20 20 20 69 66 20 28 21 46 69           if (!Fi
20d70 6c 65 2e 45 78 69 73 74 73 28 66 69 6c 65 4e 61  le.Exists(fileNa
20d80 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  me))..          
20d90 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 44 65       TraceOps.De
20dc0 62 75 67 41 6e 64 54 72 61 63 65 28 54 72 61 63  bugAndTrace(Trac
20dd0 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77 2c 0d 0a  ePriority.Low,..
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75              debu
20e00 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65  gCallback, trace
20e10 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
20e20 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 22 2e 4e 45 54 20 46 72 61 6d        ".NET Fram
20e50 65 77 6f 72 6b 20 7b 30 7d 20 66 69 6c 65 20 7b  ework {0} file {
20e60 31 7d 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  1} does not exis
20e70 74 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  t, " +..        
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e90 20 20 20 20 22 73 6b 69 70 70 69 6e 67 2e 2e 2e      "skipping...
20ea0 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 66 72  ", ForDisplay(fr
20eb0 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 29 2c  ameworkVersion),
20ec0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
20ee0 72 44 69 73 70 6c 61 79 28 66 69 6c 65 4e 61 6d  rDisplay(fileNam
20ef0 65 29 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f  e)), traceCatego
20f00 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
20f40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20f50 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 6c 6f 63          bool loc
20f60 61 6c 53 61 76 65 64 20 3d 20 66 61 6c 73 65 3b  alSaved = false;
20f70 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20f80 20 20 20 20 20 20 20 20 69 66 20 28 21 63 61 6c          if (!cal
20f90 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20  lback(..        
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e      fileName, in
20fc0 76 61 72 69 61 6e 74 2c 20 6e 61 6d 65 2c 20 64  variant, name, d
20fd0 65 73 63 72 69 70 74 69 6f 6e 2c 20 74 79 70 65  escription, type
20fe0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 20 20 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c     assemblyName,
21010 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 74 68 72   clientData, thr
21020 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c 20 77 68 61  owOnMissing, wha
21030 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 6c    verbose, ref l
21060 6f 63 61 6c 53 61 76 65 64 2c 20 72 65 66 20 65  ocalSaved, ref e
21070 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20  rror))..        
21080 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
210b0 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
210c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210e0 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
210f0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 20 20 69 66 20 28 6c 6f 63 61 6c 53        if (localS
21120 61 76 65 64 20 26 26 20 21 73 61 76 65 64 29 0d  aved && !saved).
21130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
21150 65 64 20 3d 20 74 72 75 65 3b 0d 0a 0d 0a 20 20  ed = true;....  
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73        if (verbos
21180 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e  TraceOps.DebugAn
211b0 64 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f  dTrace(TracePrio
211c0 72 69 74 79 2e 4c 6f 77 65 73 74 2c 0d 0a 20 20  rity.Lowest,..  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
211f0 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61  bugCallback, tra
21200 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
21210 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 6f 63              "loc
21240 61 6c 53 61 76 65 64 20 3d 20 7b 30 7d 2c 20 73  alSaved = {0}, s
21250 61 76 65 64 20 3d 20 7b 31 7d 22 2c 0d 0a 20 20  aved = {1}",..  
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
21280 72 44 69 73 70 6c 61 79 28 6c 6f 63 61 6c 53 61  rDisplay(localSa
21290 76 65 64 29 2c 20 46 6f 72 44 69 73 70 6c 61 79  ved), ForDisplay
212a0 28 73 61 76 65 64 29 29 2c 0d 0a 20 20 20 20 20  (saved)),..     
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
212d0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20  Category);..    
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
21300 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
21310 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
21320 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
21330 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
21340 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
21350 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21360 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21370 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
21390 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
213a0 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 6f 72   static bool For
213b0 45 61 63 68 46 72 61 6d 65 77 6f 72 6b 52 65 67  EachFrameworkReg
213c0 69 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20 20  istry(..        
213d0 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
213e0 20 72 65 67 69 73 74 72 79 2c 0d 0a 20 20 20 20   registry,..    
213f0 20 20 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72          Framewor
21400 6b 4c 69 73 74 20 66 72 61 6d 65 77 6f 72 6b 4c  kList frameworkL
21410 69 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ist,..          
21420 20 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69 73    FrameworkRegis
21430 74 72 79 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  tryCallback call
21440 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
21450 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74     object client
21460 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20  Data,..         
21470 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d     bool throwOnM
21480 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  issing,..       
21490 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
214a0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
214b0 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
214c0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
214d0 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
214e0 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
214f0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
21500 20 20 69 66 20 28 72 65 67 69 73 74 72 79 20 3d    if (registry =
21510 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
21520 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
21530 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
21540 22 69 6e 76 61 6c 69 64 20 72 65 67 69 73 74 72  "invalid registr
21550 79 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y";..           
21560 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
21570 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
21580 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
21590 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c 69   if (frameworkLi
215a0 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  st == null)..   
215b0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
215c0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
215d0 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 66 72 61  r = "invalid fra
215e0 6d 65 77 6f 72 6b 20 6c 69 73 74 22 3b 0d 0a 20  mework list";.. 
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
21600 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
21610 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21620 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52             MockR
21630 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
21640 65 79 20 3d 20 66 72 61 6d 65 77 6f 72 6b 4c 69  ey = frameworkLi
21650 73 74 2e 52 6f 6f 74 4b 65 79 3b 0d 0a 0d 0a 20  st.RootKey;.... 
21660 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 72             if (r
21670 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  ootKey == null).
21680 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64  error = "invalid
216b0 20 72 6f 6f 74 20 6b 65 79 22 3b 0d 0a 20 20 20   root key";..   
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
216d0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
216e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
216f0 20 20 20 20 20 20 20 20 20 69 66 20 28 21 4f 62           if (!Ob
21700 6a 65 63 74 2e 52 65 66 65 72 65 6e 63 65 45 71  ject.ReferenceEq
21710 75 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20 72 65  uals(rootKey, re
21720 67 69 73 74 72 79 2e 43 75 72 72 65 6e 74 55 73  gistry.CurrentUs
21730 65 72 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20  er) &&..        
21740 20 20 20 20 20 20 20 20 21 4f 62 6a 65 63 74 2e          !Object.
21750 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28  ReferenceEquals(
21760 72 6f 6f 74 4b 65 79 2c 20 72 65 67 69 73 74 72  rootKey, registr
21770 79 2e 4c 6f 63 61 6c 4d 61 63 68 69 6e 65 29 29  y.LocalMachine))
21780 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
21790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217a0 20 65 72 72 6f 72 20 3d 20 22 72 6f 6f 74 20 6b   error = "root k
217b0 65 79 20 6d 75 73 74 20 62 65 20 70 65 72 2d 75  ey must be per-u
217c0 73 65 72 20 6f 72 20 70 65 72 2d 6d 61 63 68 69  ser or per-machi
217d0 6e 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ne";..          
217e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
217f0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
21800 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
21810 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4c    if (frameworkL
21820 69 73 74 2e 4e 61 6d 65 73 20 3d 3d 20 6e 75 6c  ist.Names == nul
21830 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
21840 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21850 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f 20 66     error = "no f
21860 72 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 73 20 66  ramework names f
21870 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20  ound";..        
21880 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
21890 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
218a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
218b0 20 20 20 20 69 66 20 28 66 72 61 6d 65 77 6f 72      if (framewor
218c0 6b 4c 69 73 74 2e 56 65 72 73 69 6f 6e 73 20 3d  kList.Versions =
218d0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
218e0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
218f0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
21900 22 6e 6f 20 66 72 61 6d 65 77 6f 72 6b 20 76 65  "no framework ve
21910 72 73 69 6f 6e 73 20 66 6f 75 6e 64 22 3b 0d 0a  rsions found";..
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
21940 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
21950 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
21960 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2e 50 6c  frameworkList.Pl
21970 61 74 66 6f 72 6d 4e 61 6d 65 73 20 3d 3d 20 6e  atformNames == n
21980 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
21990 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
219a0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f       error = "no
219b0 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 73 20   platform names 
219c0 66 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20  found";..       
219d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
219e0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
219f0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21a00 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77 6f       if (framewo
21a10 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 2e 43 6f 75  rkList.Names.Cou
21a20 6e 74 20 21 3d 20 66 72 61 6d 65 77 6f 72 6b 4c  nt != frameworkL
21a30 69 73 74 2e 50 6c 61 74 66 6f 72 6d 4e 61 6d 65  ist.PlatformName
21a40 73 2e 43 6f 75 6e 74 29 0d 0a 20 20 20 20 20 20  s.Count)..      
21a50 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
21a60 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
21a70 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
21a80 66 72 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 20 63  framework name c
21a90 6f 75 6e 74 20 7b 30 7d 20 64 6f 65 73 20 6e 6f  ount {0} does no
21aa0 74 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  t " +..         
21ab0 20 20 20 20 20 20 20 20 20 20 20 22 6d 61 74 63             "matc
21ac0 68 20 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20  h platform name 
21ad0 63 6f 75 6e 74 20 7b 31 7d 22 2c 20 66 72 61 6d  count {1}", fram
21ae0 65 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 2e  eworkList.Names.
21af0 43 6f 75 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20  Count,..        
21b00 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
21b10 65 77 6f 72 6b 4c 69 73 74 2e 50 6c 61 74 66 6f  eworkList.Platfo
21b20 72 6d 4e 61 6d 65 73 2e 43 6f 75 6e 74 29 3b 0d  rmNames.Count);.
21b30 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
21b40 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
21b50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
21b60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ...            f
21b70 6f 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20  or (int index = 
21b80 30 3b 20 69 6e 64 65 78 20 3c 20 66 72 61 6d 65  0; index < frame
21b90 77 6f 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 2e 43  workList.Names.C
21ba0 6f 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a  ount; index++)..
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21bd0 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
21be0 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61 62     // NOTE: Grab
21bf0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
21c00 20 66 72 61 6d 65 77 6f 72 6b 20 28 65 2e 67 2e   framework (e.g.
21c10 20 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22   ".NETFramework"
21c20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
21c30 20 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20     //       and 
21c40 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
21c50 70 6c 61 74 66 6f 72 6d 20 28 65 2e 67 2e 20 22  platform (e.g. "
21c60 57 69 6e 64 6f 77 73 43 45 22 29 2e 0d 0a 20 20  WindowsCE")...  
21c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
21c80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21c90 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f    string framewo
21ca0 72 6b 4e 61 6d 65 20 3d 20 66 72 61 6d 65 77 6f  rkName = framewo
21cb0 72 6b 4c 69 73 74 2e 4e 61 6d 65 73 5b 69 6e 64  rkList.Names[ind
21cc0 65 78 5d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ex];..          
21cd0 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61        string pla
21ce0 74 66 6f 72 6d 4e 61 6d 65 20 3d 20 66 72 61 6d  tformName = fram
21cf0 65 77 6f 72 6b 4c 69 73 74 2e 50 6c 61 74 66 6f  eworkList.Platfo
21d00 72 6d 4e 61 6d 65 73 5b 69 6e 64 65 78 5d 3b 0d  rmNames[index];.
21d10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
21d20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
21d30 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
21d40 47 72 61 62 20 74 68 65 20 73 75 70 70 6f 72 74  Grab the support
21d50 65 64 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ed versions of t
21d60 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 0d 0a  his particular..
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 2f 2f 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f  //       framewo
21d90 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rk...           
21da0 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
21db0 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e           Version
21dc0 4c 69 73 74 20 66 72 61 6d 65 77 6f 72 6b 56 65  List frameworkVe
21dd0 72 73 69 6f 6e 4c 69 73 74 3b 0d 0a 0d 0a 20 20  rsionList;....  
21de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
21df0 20 28 21 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74   (!frameworkList
21e00 2e 56 65 72 73 69 6f 6e 73 2e 54 72 79 47 65 74  .Versions.TryGet
21e10 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e30 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 6f  frameworkName, o
21e40 75 74 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  ut frameworkVers
21e50 69 6f 6e 4c 69 73 74 29 20 7c 7c 0d 0a 20 20 20  ionList) ||..   
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69   (frameworkVersi
21e80 6f 6e 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 29  onList == null))
21e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21ea0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
21eb0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21ec0 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
21ed0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
21ee0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
21ef0 20 28 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77   (Version framew
21f00 6f 72 6b 56 65 72 73 69 6f 6e 20 69 6e 20 66 72  orkVersion in fr
21f10 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69  ameworkVersionLi
21f20 73 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st)..           
21f30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
21f40 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
21f50 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
21f60 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
21f70 2e 4c 6f 77 65 72 2c 0d 0a 20 20 20 20 20 20 20  .Lower,..       
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20   debugCallback, 
21fa0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
21fb0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 20 20 20 20 20 22 66 72 61 6d 65 77 6f 72         "framewor
21fe0 6b 4e 61 6d 65 20 3d 20 7b 30 7d 2c 20 66 72 61  kName = {0}, fra
21ff0 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 20 3d 20  meworkVersion = 
22000 7b 31 7d 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20  {1}, " +..      
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 22 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20    "platformName 
22030 3d 20 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70 6c  = {2}", ForDispl
22040 61 79 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  ay(frameworkName
22050 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
22060 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44              ForD
22070 69 73 70 6c 61 79 28 66 72 61 6d 65 77 6f 72 6b  isplay(framework
22080 56 65 72 73 69 6f 6e 29 2c 0d 0a 20 20 20 20 20  Version),..     
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 70 6c     ForDisplay(pl
220b0 61 74 66 6f 72 6d 4e 61 6d 65 29 29 2c 20 74 72  atformName)), tr
220c0 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d  aceCategory);...
220d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
220e0 20 20 20 20 20 69 66 20 28 21 48 61 76 65 46 72       if (!HaveFr
220f0 61 6d 65 77 6f 72 6b 28 0d 0a 20 20 20 20 20 20  amework(..      
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66        rootKey, f
22120 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72  rameworkName, fr
22130 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d  ameworkVersion,.
22140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 61               pla
22160 74 66 6f 72 6d 4e 61 6d 65 2c 20 77 68 61 74 49  tformName, whatI
22170 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22190 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
221b0 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72  ceOps.DebugAndTr
221c0 61 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74  ace(TracePriorit
221d0 79 2e 4c 6f 77 2c 0d 0a 20 20 20 20 20 20 20 20  y.Low,..        
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63      debugCallbac
22200 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  k, traceCallback
22210 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22230 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 6e  .NET Framework n
22240 6f 74 20 66 6f 75 6e 64 2c 20 73 6b 69 70 70 69  ot found, skippi
22250 6e 67 2e 2e 2e 22 2c 0d 0a 20 20 20 20 20 20 20  ng...",..       
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
22280 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
222c0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
222d0 20 20 20 20 20 20 20 20 69 66 20 28 63 61 6c 6c          if (call
222e0 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  back == null).. 
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
22310 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22320 20 20 20 20 20 20 20 20 69 66 20 28 21 63 61 6c          if (!cal
22330 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20  lback(..        
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61      rootKey, fra
22360 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d  meworkName, fram
22370 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 20 20 20 20 20 20 20 20 20 20 70 6c 61 74 66             platf
223a0 6f 72 6d 4e 61 6d 65 2c 20 63 6c 69 65 6e 74 44  ormName, clientD
223b0 61 74 61 2c 20 74 68 72 6f 77 4f 6e 4d 69 73 73  ata, throwOnMiss
223c0 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ing,..          
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73    whatIf, verbos
223f0 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a  e, ref error))..
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22410 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
22430 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
22460 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
22470 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
22480 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
22490 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
224a0 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
224b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
224c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
224d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
224e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
224f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22500 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ///....        #
22510 72 65 67 69 6f 6e 20 50 65 72 2d 56 69 73 75 61  region Per-Visua
22520 6c 20 53 74 75 64 69 6f 20 56 65 72 73 69 6f 6e  l Studio Version
22530 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20   Handling..     
22540 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
22550 63 20 76 6f 69 64 20 49 6e 69 74 69 61 6c 69 7a  c void Initializ
22560 65 56 73 4c 69 73 74 28 0d 0a 20 20 20 20 20 20  eVsList(..      
22570 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
22580 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a  ryKey rootKey,..
22590 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66              Conf
225a0 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67  iguration config
225b0 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  uration,..      
225c0 20 20 20 20 20 20 72 65 66 20 56 73 4c 69 73 74        ref VsList
225d0 20 76 73 4c 69 73 74 0d 0a 20 20 20 20 20 20 20   vsList..       
225e0 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
225f0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
22600 66 20 28 76 73 4c 69 73 74 20 3d 3d 20 6e 75 6c  f (vsList == nul
22610 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
22620 20 20 20 20 76 73 4c 69 73 74 20 3d 20 6e 65 77      vsList = new
22630 20 56 73 4c 69 73 74 28 29 3b 0d 0a 0d 0a 20 20   VsList();....  
22640 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 73            if (vs
22650 4c 69 73 74 2e 52 6f 6f 74 4b 65 79 20 3d 3d 20  List.RootKey == 
22660 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
22670 20 20 20 20 20 20 20 76 73 4c 69 73 74 2e 52 6f         vsList.Ro
22680 6f 74 4b 65 79 20 3d 20 72 6f 6f 74 4b 65 79 3b  otKey = rootKey;
22690 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
226a0 69 66 20 28 76 73 4c 69 73 74 2e 56 65 72 73 69  if (vsList.Versi
226b0 6f 6e 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ons == null)..  
226c0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 73 4c               vsL
226e0 69 73 74 2e 56 65 72 73 69 6f 6e 73 20 3d 20 6e  ist.Versions = n
226f0 65 77 20 56 65 72 73 69 6f 6e 4c 69 73 74 28 29  ew VersionList()
22700 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
22710 20 20 20 20 20 2f 2f 20 76 73 4c 69 73 74 2e 56       // vsList.V
22720 65 72 73 69 6f 6e 73 2e 41 64 64 28 6e 65 77 20  ersions.Add(new 
22730 56 65 72 73 69 6f 6e 28 38 2c 20 30 29 29 3b 20  Version(8, 0)); 
22740 2f 2f 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f  // Visual Studio
22750 20 32 30 30 35 0d 0a 0d 0a 20 20 20 20 20 20 20   2005....       
22760 20 20 20 20 20 20 20 20 20 69 66 20 28 28 63 6f           if ((co
22770 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e  nfiguration == n
22780 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75  ull) || !configu
22790 72 61 74 69 6f 6e 2e 4e 6f 56 73 32 30 30 38 29  ration.NoVs2008)
227a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
227b0 20 20 20 20 20 20 76 73 4c 69 73 74 2e 56 65 72        vsList.Ver
227c0 73 69 6f 6e 73 2e 41 64 64 28 6e 65 77 20 56 65  sions.Add(new Ve
227d0 72 73 69 6f 6e 28 39 2c 20 30 29 29 3b 20 2f 2f  rsion(9, 0)); //
227e0 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 32   Visual Studio 2
227f0 30 30 38 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  008....         
22800 20 20 20 20 20 20 20 69 66 20 28 28 63 6f 6e 66         if ((conf
22810 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c  iguration == nul
22820 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75 72 61  l) || !configura
22830 74 69 6f 6e 2e 4e 6f 56 73 32 30 31 30 29 0d 0a  tion.NoVs2010)..
22840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22850 20 20 20 20 76 73 4c 69 73 74 2e 56 65 72 73 69      vsList.Versi
22860 6f 6e 73 2e 41 64 64 28 6e 65 77 20 56 65 72 73  ons.Add(new Vers
22870 69 6f 6e 28 31 30 2c 20 30 29 29 3b 2f 2f 20 56  ion(10, 0));// V
22880 69 73 75 61 6c 20 53 74 75 64 69 6f 20 32 30 31  isual Studio 201
22890 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0..            }
228a0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
228b0 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
228c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
228d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
228e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
228f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
22900 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
22910 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 48 61  e static bool Ha
22920 76 65 56 73 56 65 72 73 69 6f 6e 28 0d 0a 20 20  veVsVersion(..  
22930 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
22940 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
22950 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
22960 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f  Version vsVersio
22970 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
22980 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
22990 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
229a0 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
229b0 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
229c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
229d0 20 28 76 73 56 65 72 73 69 6f 6e 20 3d 3d 20 6e   (vsVersion == n
229e0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
229f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
22a00 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
22a10 20 20 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74     string format
22a20 20 3d 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69   = "Software\\Mi
22a30 63 72 6f 73 6f 66 74 5c 5c 56 69 73 75 61 6c 53  crosoft\\VisualS
22a40 74 75 64 69 6f 5c 5c 7b 30 7d 22 3b 0d 0a 20 20  tudio\\{0}";..  
22a50 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
22a60 20 6b 65 79 4e 61 6d 65 20 3d 20 53 74 72 69 6e   keyName = Strin
22a70 67 2e 46 6f 72 6d 61 74 28 66 6f 72 6d 61 74 2c  g.Format(format,
22a80 20 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a   vsVersion);....
22a90 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
22aa0 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
22ab0 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72  ey key = Registr
22ac0 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
22ad0 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
22ae0 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
22af0 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65  , keyName, false
22b00 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
22b10 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
22b20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
22b30 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
22b40 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
22b50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
22b60 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
22b70 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
22b80 74 20 76 61 6c 75 65 20 3d 20 52 65 67 69 73 74  t value = Regist
22b90 72 79 48 65 6c 70 65 72 2e 47 65 74 56 61 6c 75  ryHelper.GetValu
22ba0 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
22bb0 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 49 6e          key, "In
22bc0 73 74 61 6c 6c 44 69 72 22 2c 20 6e 75 6c 6c 2c  stallDir", null,
22bd0 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
22be0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
22bf0 20 20 20 20 20 20 69 66 20 28 21 28 76 61 6c 75        if (!(valu
22c00 65 20 69 73 20 73 74 72 69 6e 67 29 29 0d 0a 20  e is string)).. 
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
22c30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22c40 20 20 20 20 73 74 72 69 6e 67 20 64 69 72 65 63      string direc
22c50 74 6f 72 79 20 3d 20 28 73 74 72 69 6e 67 29 76  tory = (string)v
22c60 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alue;....       
22c70 20 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72           if (Str
22c80 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
22c90 79 28 64 69 72 65 63 74 6f 72 79 29 29 0d 0a 20  y(directory)).. 
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
22cc0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
22cd0 20 20 20 20 69 66 20 28 21 44 69 72 65 63 74 6f      if (!Directo
22ce0 72 79 2e 45 78 69 73 74 73 28 64 69 72 65 63 74  ry.Exists(direct
22cf0 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ory))..         
22d00 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22d10 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  n false;....    
22d20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
22d30 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
22d40 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22d50 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f   }....        //
22d60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22da0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
22db0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
22dc0 62 6f 6f 6c 20 46 6f 72 45 61 63 68 56 73 56 65  bool ForEachVsVe
22dd0 72 73 69 6f 6e 52 65 67 69 73 74 72 79 28 0d 0a  rsionRegistry(..
22de0 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
22df0 52 65 67 69 73 74 72 79 20 72 65 67 69 73 74 72  Registry registr
22e00 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
22e10 56 73 4c 69 73 74 20 76 73 4c 69 73 74 2c 0d 0a  VsList vsList,..
22e20 20 20 20 20 20 20 20 20 20 20 20 20 56 69 73 75              Visu
22e30 61 6c 53 74 75 64 69 6f 52 65 67 69 73 74 72 79  alStudioRegistry
22e40 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63  Callback callbac
22e50 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
22e60 50 61 63 6b 61 67 65 20 70 61 63 6b 61 67 65 2c  Package package,
22e70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
22e80 6a 65 63 74 20 63 6c 69 65 6e 74 44 61 74 61 2c  ject clientData,
22e90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
22ea0 6f 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e  ol throwOnMissin
22eb0 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  g,..            
22ec0 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
22ed0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
22ee0 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
22ef0 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
22f00 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
22f10 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
22f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
22f30 28 72 65 67 69 73 74 72 79 20 3d 3d 20 6e 75 6c  (registry == nul
22f40 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
22f50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22f60 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61     error = "inva
22f70 6c 69 64 20 72 65 67 69 73 74 72 79 22 3b 0d 0a  lid registry";..
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
22fa0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
22fc0 76 73 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d  vsList == null).
22fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64  error = "invalid
23000 20 56 53 20 6c 69 73 74 22 3b 0d 0a 20 20 20 20   VS list";..    
23010 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
23020 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
23030 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23040 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
23050 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 20  stryKey rootKey 
23060 3d 20 76 73 4c 69 73 74 2e 52 6f 6f 74 4b 65 79  = vsList.RootKey
23070 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
23080 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20   if (rootKey == 
23090 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
230a0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
230b0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69        error = "i
230c0 6e 76 61 6c 69 64 20 72 6f 6f 74 20 6b 65 79 22  nvalid root key"
230d0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
230e0 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
230f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
23100 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
23110 66 20 28 21 4f 62 6a 65 63 74 2e 52 65 66 65 72  f (!Object.Refer
23120 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b  enceEquals(rootK
23130 65 79 2c 20 72 65 67 69 73 74 72 79 2e 43 75 72  ey, registry.Cur
23140 72 65 6e 74 55 73 65 72 29 20 26 26 0d 0a 20 20  rentUser) &&..  
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 4f                !O
23160 62 6a 65 63 74 2e 52 65 66 65 72 65 6e 63 65 45  bject.ReferenceE
23170 71 75 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20 72  quals(rootKey, r
23180 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63  egistry.LocalMac
23190 68 69 6e 65 29 29 0d 0a 20 20 20 20 20 20 20 20  hine))..        
231a0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
231b0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
231c0 72 6f 6f 74 20 6b 65 79 20 6d 75 73 74 20 62 65  root key must be
231d0 20 70 65 72 2d 75 73 65 72 20 6f 72 20 70 65 72   per-user or per
231e0 2d 6d 61 63 68 69 6e 65 22 3b 0d 0a 20 20 20 20  -machine";..    
231f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
23200 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
23210 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
23220 20 20 20 20 20 20 20 20 69 66 20 28 76 73 4c 69          if (vsLi
23230 73 74 2e 56 65 72 73 69 6f 6e 73 20 3d 3d 20 6e  st.Versions == n
23240 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
23250 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
23260 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f       error = "no
23270 20 56 53 20 76 65 72 73 69 6f 6e 73 20 66 6f 75   VS versions fou
23280 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nd";..          
23290 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
232a0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
232b0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
232c0 20 20 66 6f 72 65 61 63 68 20 28 56 65 72 73 69    foreach (Versi
232d0 6f 6e 20 76 73 56 65 72 73 69 6f 6e 20 69 6e 20  on vsVersion in 
232e0 76 73 4c 69 73 74 2e 56 65 72 73 69 6f 6e 73 29  vsList.Versions)
232f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
23300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23310 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41   TraceOps.DebugA
23320 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72 69  ndTrace(TracePri
23330 6f 72 69 74 79 2e 4c 6f 77 65 72 2c 0d 0a 20 20  ority.Lower,..  
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c    debugCallback,
23360 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
23370 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 22 76 73 56 65 72 73 69 6f 6e 20 3d      "vsVersion =
233a0 20 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61   {0}", ForDispla
233b0 79 28 76 73 56 65 72 73 69 6f 6e 29 29 2c 0d 0a  y(vsVersion)),..
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233d0 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
233e0 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
233f0 20 20 20 20 20 20 20 69 66 20 28 21 48 61 76 65         if (!Have
23400 56 73 56 65 72 73 69 6f 6e 28 72 6f 6f 74 4b 65  VsVersion(rootKe
23410 79 2c 20 76 73 56 65 72 73 69 6f 6e 2c 20 77 68  y, vsVersion, wh
23420 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
23430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23440 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
23450 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
23460 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28 54  .DebugAndTrace(T
23470 72 61 63 65 50 72 69 6f 72 69 74 79 2e 4c 6f 77  racePriority.Low
23480 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
23490 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67             debug
234a0 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43  Callback, traceC
234b0 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20  allback,..      
234c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234d0 20 20 22 56 69 73 75 61 6c 20 53 74 75 64 69 6f    "Visual Studio
234e0 20 76 65 72 73 69 6f 6e 20 6e 6f 74 20 66 6f 75   version not fou
234f0 6e 64 2c 20 73 6b 69 70 70 69 6e 67 2e 2e 2e 22  nd, skipping..."
23500 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
23510 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
23520 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
23560 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23570 20 20 69 66 20 28 63 61 6c 6c 62 61 63 6b 20 3d    if (callback =
23580 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
235a0 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  tinue;....      
235b0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 63            if (!c
235c0 61 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20 20  allback(..      
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72    rootKey, vsVer
235f0 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65 2c 20 63  sion, package, c
23600 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20  lientData,..    
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69      throwOnMissi
23630 6e 67 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ng, whatIf, verb
23640 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29  ose, ref error))
23650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23660 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
23670 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23680 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
23690 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
236a0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
236b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
236c0 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  rue;..        }.
236d0 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
236e0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
236f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23730 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
23740 20 20 23 72 65 67 69 6f 6e 20 43 6f 6e 66 69 67    #region Config
23750 75 72 61 74 69 6f 6e 20 46 69 6c 65 20 48 61 6e  uration File Han
23760 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70  dling..        p
23770 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f  rivate static bo
23780 6f 6c 20 41 64 64 44 62 50 72 6f 76 69 64 65 72  ol AddDbProvider
23790 46 61 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20  Factory(..      
237a0 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c        string fil
237b0 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  eName,..        
237c0 20 20 20 20 73 74 72 69 6e 67 20 69 6e 76 61 72      string invar
237d0 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  iant,..         
237e0 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d     string name,.
237f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
23800 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c  ing description,
23810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
23820 72 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d 0a  ring typeName,..
23830 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65              Asse
23840 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c  mblyName assembl
23850 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
23860 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
23870 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
23880 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
23890 20 20 20 20 20 20 20 20 20 72 65 66 20 62 6f 6f           ref boo
238a0 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20  l saved,..      
238b0 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67        ref string
238c0 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
238d0 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
238e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
238f0 6f 6c 20 64 69 72 74 79 20 3d 20 66 61 6c 73 65  ol dirty = false
23900 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 58  ;..            X
23910 6d 6c 44 6f 63 75 6d 65 6e 74 20 64 6f 63 75 6d  mlDocument docum
23920 65 6e 74 20 3d 20 6e 65 77 20 58 6d 6c 44 6f 63  ent = new XmlDoc
23930 75 6d 65 6e 74 28 29 3b 0d 0a 0d 0a 20 20 20 20  ument();....    
23940 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
23950 2e 50 72 65 73 65 72 76 65 57 68 69 74 65 73 70  .PreserveWhitesp
23960 61 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20  ace = true;..   
23970 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e           documen
23980 74 2e 4c 6f 61 64 28 66 69 6c 65 4e 61 6d 65 29  t.Load(fileName)
23990 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
239a0 20 58 6d 6c 45 6c 65 6d 65 6e 74 20 65 6c 65 6d   XmlElement elem
239b0 65 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 53  ent = document.S
239c0 65 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64 65 28  electSingleNode(
239d0 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
239e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239f0 58 50 61 74 68 46 6f 72 41 64 64 45 6c 65 6d 65  XPathForAddEleme
23a00 6e 74 2c 20 69 6e 76 61 72 69 61 6e 74 29 29 20  nt, invariant)) 
23a10 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a  as XmlElement;..
23a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
23a30 20 28 65 6c 65 6d 65 6e 74 20 3d 3d 20 6e 75 6c   (element == nul
23a40 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
23a50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23a60 20 20 20 73 74 72 69 6e 67 5b 5d 20 65 6c 65 6d     string[] elem
23a70 65 6e 74 4e 61 6d 65 73 20 3d 20 7b 0d 0a 20 20  entNames = {..  
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 20 20 20 22 73 79 73 74 65 6d 2e 64 61        "system.da
23aa0 74 61 22 2c 20 22 44 62 50 72 6f 76 69 64 65 72  ta", "DbProvider
23ab0 46 61 63 74 6f 72 69 65 73 22 0d 0a 20 20 20 20  Factories"..    
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  };....          
23ae0 20 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74        XmlElement
23af0 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74   previousElement
23b00 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   =..            
23b10 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
23b20 2e 44 6f 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74  .DocumentElement
23b30 3b 20 2f 2a 20 63 6f 6e 66 69 67 75 72 61 74 69  ; /* configurati
23b40 6f 6e 20 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  on */....       
23b50 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
23b60 20 28 73 74 72 69 6e 67 20 65 6c 65 6d 65 6e 74   (string element
23b70 4e 61 6d 65 20 69 6e 20 65 6c 65 6d 65 6e 74 4e  Name in elementN
23b80 61 6d 65 73 29 0d 0a 20 20 20 20 20 20 20 20 20  ames)..         
23b90 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
23bb0 65 6d 65 6e 74 20 3d 20 70 72 65 76 69 6f 75 73  ement = previous
23bc0 45 6c 65 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69  Element.SelectSi
23bd0 6e 67 6c 65 4e 6f 64 65 28 0d 0a 20 20 20 20 20  ngleNode(..     
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 65 6c 65 6d 65 6e 74 4e 61 6d 65 29 20     elementName) 
23c00 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a  as XmlElement;..
23c10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
23c20 20 20 20 20 20 20 69 66 20 28 65 6c 65 6d 65 6e        if (elemen
23c30 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  t == null)..    
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
23c60 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65             eleme
23c70 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 43 72  nt = document.Cr
23c80 65 61 74 65 45 6c 65 6d 65 6e 74 28 0d 0a 20 20  eateElement(..  
23c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ca0 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e            elemen
23cb0 74 4e 61 6d 65 2c 20 53 74 72 69 6e 67 2e 45 6d  tName, String.Em
23cc0 70 74 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  pty);....       
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74   previousElement
23cf0 2e 41 70 70 65 6e 64 43 68 69 6c 64 28 65 6c 65  .AppendChild(ele
23d00 6d 65 6e 74 29 3b 0d 0a 20 20 20 20 20 20 20 20  ment);..        
23d10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
23d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d30 20 20 20 20 20 70 72 65 76 69 6f 75 73 45 6c 65       previousEle
23d40 6d 65 6e 74 20 3d 20 65 6c 65 6d 65 6e 74 3b 0d  ment = element;.
23d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d60 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
23d70 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 3d 20        element = 
23d80 64 6f 63 75 6d 65 6e 74 2e 43 72 65 61 74 65 45  document.CreateE
23d90 6c 65 6d 65 6e 74 28 0d 0a 20 20 20 20 20 20 20  lement(..       
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61 64               "ad
23db0 64 22 2c 20 53 74 72 69 6e 67 2e 45 6d 70 74 79  d", String.Empty
23dc0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
23dd0 20 20 20 20 20 20 70 72 65 76 69 6f 75 73 45 6c        previousEl
23de0 65 6d 65 6e 74 2e 41 70 70 65 6e 64 43 68 69 6c  ement.AppendChil
23df0 64 28 65 6c 65 6d 65 6e 74 29 3b 0d 0a 0d 0a 20  d(element);.... 
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
23e10 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  irty = true;..  
23e20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
23e30 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
23e40 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c  String.Equals(el
23e50 65 6d 65 6e 74 2e 47 65 74 41 74 74 72 69 62 75  ement.GetAttribu
23e60 74 65 28 22 6e 61 6d 65 22 29 2c 0d 0a 20 20 20  te("name"),..   
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 6e 61 6d 65 2c 20 53 74 72 69 6e 67 43 6f 6d   name, StringCom
23e90 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72 69 61 6e  parison.Invarian
23ea0 74 43 75 6c 74 75 72 65 29 29 0d 0a 20 20 20 20  tCulture))..    
23eb0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
23ec0 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65             eleme
23ed0 6e 74 2e 53 65 74 41 74 74 72 69 62 75 74 65 28  nt.SetAttribute(
23ee0 22 6e 61 6d 65 22 2c 20 6e 61 6d 65 29 3b 0d 0a  "name", name);..
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20  dirty = true;.. 
23f10 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
23f20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
23f30 21 53 74 72 69 6e 67 2e 45 71 75 61 6c 73 28 65  !String.Equals(e
23f40 6c 65 6d 65 6e 74 2e 47 65 74 41 74 74 72 69 62  lement.GetAttrib
23f50 75 74 65 28 22 69 6e 76 61 72 69 61 6e 74 22 29  ute("invariant")
23f60 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
23f70 20 20 20 20 20 20 20 69 6e 76 61 72 69 61 6e 74         invariant
23f80 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72 69 73  , StringComparis
23f90 6f 6e 2e 49 6e 76 61 72 69 61 6e 74 43 75 6c 74  on.InvariantCult
23fa0 75 72 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ure))..         
23fb0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
23fc0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 53 65        element.Se
23fd0 74 41 74 74 72 69 62 75 74 65 28 22 69 6e 76 61  tAttribute("inva
23fe0 72 69 61 6e 74 22 2c 20 69 6e 76 61 72 69 61 6e  riant", invarian
23ff0 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
24000 20 20 20 20 20 64 69 72 74 79 20 3d 20 74 72 75       dirty = tru
24010 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
24020 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
24030 20 69 66 20 28 21 53 74 72 69 6e 67 2e 45 71 75   if (!String.Equ
24040 61 6c 73 28 65 6c 65 6d 65 6e 74 2e 47 65 74 41  als(element.GetA
24050 74 74 72 69 62 75 74 65 28 22 64 65 73 63 72 69  ttribute("descri
24060 70 74 69 6f 6e 22 29 2c 0d 0a 20 20 20 20 20 20  ption"),..      
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
24080 73 63 72 69 70 74 69 6f 6e 2c 20 53 74 72 69 6e  scription, Strin
24090 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61  gComparison.Inva
240a0 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a  riantCulture))..
240b0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
240d0 6c 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69 62  lement.SetAttrib
240e0 75 74 65 28 22 64 65 73 63 72 69 70 74 69 6f 6e  ute("description
240f0 22 2c 20 64 65 73 63 72 69 70 74 69 6f 6e 29 3b  ", description);
24100 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24110 20 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d    dirty = true;.
24120 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
24130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
24140 72 69 6e 67 20 66 75 6c 6c 54 79 70 65 4e 61 6d  ring fullTypeNam
24150 65 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  e = String.Forma
24160 74 28 22 7b 30 7d 2c 20 7b 31 7d 22 2c 0d 0a 20  t("{0}, {1}",.. 
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24180 79 70 65 4e 61 6d 65 2c 20 61 73 73 65 6d 62 6c  ypeName, assembl
24190 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  yName);....     
241a0 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72 69         if (!Stri
241b0 6e 67 2e 45 71 75 61 6c 73 28 65 6c 65 6d 65 6e  ng.Equals(elemen
241c0 74 2e 47 65 74 41 74 74 72 69 62 75 74 65 28 22  t.GetAttribute("
241d0 74 79 70 65 22 29 2c 0d 0a 20 20 20 20 20 20 20  type"),..       
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 75 6c               ful
241f0 6c 54 79 70 65 4e 61 6d 65 2c 20 53 74 72 69 6e  lTypeName, Strin
24200 67 43 6f 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61  gComparison.Inva
24210 72 69 61 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a  riantCulture))..
24220 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
24240 6c 65 6d 65 6e 74 2e 53 65 74 41 74 74 72 69 62  lement.SetAttrib
24250 75 74 65 28 22 74 79 70 65 22 2c 20 66 75 6c 6c  ute("type", full
24260 54 79 70 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20  TypeName);..    
24270 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72 74              dirt
24280 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  y = true;..     
24290 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
242a0 20 20 20 20 20 20 20 20 69 66 20 28 64 69 72 74          if (dirt
242b0 79 20 7c 7c 20 77 68 61 74 49 66 29 0d 0a 20 20  y || whatIf)..  
242c0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
242e0 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20  (verbose)..     
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
24300 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64  raceOps.DebugAnd
24310 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f 72  Trace(TracePrior
24320 69 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20  ity.Highest,..  
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 20 20 20 20 20 64 65 62 75 67 43 61 6c 6c 62        debugCallb
24350 61 63 6b 2c 20 74 72 61 63 65 43 61 6c 6c 62 61  ack, traceCallba
24360 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
24370 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
24380 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6c 65              "ele
24390 6d 65 6e 74 20 3d 20 7b 30 7d 22 2c 20 46 6f 72  ment = {0}", For
243a0 44 69 73 70 6c 61 79 28 65 6c 65 6d 65 6e 74 29  Display(element)
243b0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
243c0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
243d0 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
243f0 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20  f (!whatIf)..   
24400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24410 20 64 6f 63 75 6d 65 6e 74 2e 53 61 76 65 28 66   document.Save(f
24420 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ileName);....   
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
24440 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ed = true;..    
24450 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24460 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
24470 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d  true;..        }
24480 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
24490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
244d0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
244e0 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f  rivate static bo
244f0 6f 6c 20 52 65 6d 6f 76 65 44 62 50 72 6f 76 69  ol RemoveDbProvi
24500 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20 20 20  derFactory(..   
24510 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
24520 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  fileName,..     
24530 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 69 6e         string in
24540 76 61 72 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20  variant,..      
24550 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
24560 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
24570 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
24580 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 62             ref b
24590 6f 6f 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20  ool saved,..    
245a0 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
245b0 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  ng error..      
245c0 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
245d0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
245e0 62 6f 6f 6c 20 64 69 72 74 79 20 3d 20 66 61 6c  bool dirty = fal
245f0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
24600 20 58 6d 6c 44 6f 63 75 6d 65 6e 74 20 64 6f 63   XmlDocument doc
24610 75 6d 65 6e 74 20 3d 20 6e 65 77 20 58 6d 6c 44  ument = new XmlD
24620 6f 63 75 6d 65 6e 74 28 29 3b 0d 0a 0d 0a 20 20  ocument();....  
24630 20 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65            docume
24640 6e 74 2e 50 72 65 73 65 72 76 65 57 68 69 74 65  nt.PreserveWhite
24650 73 70 61 63 65 20 3d 20 74 72 75 65 3b 0d 0a 20  space = true;.. 
24660 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d             docum
24670 65 6e 74 2e 4c 6f 61 64 28 66 69 6c 65 4e 61 6d  ent.Load(fileNam
24680 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
24690 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74 20 65 6c     XmlElement el
246a0 65 6d 65 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74  ement = document
246b0 2e 53 65 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64  .SelectSingleNod
246c0 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
246d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
246e0 20 20 58 50 61 74 68 46 6f 72 41 64 64 45 6c 65    XPathForAddEle
246f0 6d 65 6e 74 2c 20 69 6e 76 61 72 69 61 6e 74 29  ment, invariant)
24700 29 20 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b  ) as XmlElement;
24710 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24720 69 66 20 28 65 6c 65 6d 65 6e 74 20 21 3d 20 6e  if (element != n
24730 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
24740 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
24750 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 50 61 72       element.Par
24760 65 6e 74 4e 6f 64 65 2e 52 65 6d 6f 76 65 43 68  entNode.RemoveCh
24770 69 6c 64 28 65 6c 65 6d 65 6e 74 29 3b 0d 0a 20  ild(element);.. 
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24790 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  irty = true;..  
247a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
247b0 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65             eleme
247c0 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 53 65  nt = document.Se
247d0 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64 65 28 53  lectSingleNode(S
247e0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
247f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58                 X
24800 50 61 74 68 46 6f 72 52 65 6d 6f 76 65 45 6c 65  PathForRemoveEle
24810 6d 65 6e 74 2c 20 69 6e 76 61 72 69 61 6e 74 29  ment, invariant)
24820 29 20 61 73 20 58 6d 6c 45 6c 65 6d 65 6e 74 3b  ) as XmlElement;
24830 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
24840 69 66 20 28 65 6c 65 6d 65 6e 74 20 21 3d 20 6e  if (element != n
24850 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
24860 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
24870 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e 50 61 72       element.Par
24880 65 6e 74 4e 6f 64 65 2e 52 65 6d 6f 76 65 43 68  entNode.RemoveCh
24890 69 6c 64 28 65 6c 65 6d 65 6e 74 29 3b 0d 0a 20  ild(element);.. 
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
248b0 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  irty = true;..  
248c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
248d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
248e0 69 72 74 79 20 7c 7c 20 77 68 61 74 49 66 29 0d  irty || whatIf).
248f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
24900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24910 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67    TraceOps.Debug
24940 41 6e 64 54 72 61 63 65 28 54 72 61 63 65 50 72  AndTrace(TracePr
24950 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d  iority.Highest,.
24960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24970 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43 61           debugCa
24980 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61 6c  llback, traceCal
24990 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
249a0 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
249c0 65 6c 65 6d 65 6e 74 20 3d 20 7b 30 7d 22 2c 20  element = {0}", 
249d0 46 6f 72 44 69 73 70 6c 61 79 28 65 6c 65 6d 65  ForDisplay(eleme
249e0 6e 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  nt)),..         
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
24a00 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
24a10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
24a20 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a    if (!whatIf)..
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a40 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 53 61 76      document.Sav
24a50 65 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  e(fileName);....
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 73 61 76 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20  saved = true;.. 
24a80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
24a90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
24aa0 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
24ab0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
24ac0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24ae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24af0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
24b00 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
24b10 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
24b20 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73 44 62 50   bool ProcessDbP
24b30 72 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d  roviderFactory(.
24b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
24b50 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20  ing fileName,.. 
24b60 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
24b70 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20  g invariant,..  
24b80 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
24b90 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20   name,..        
24ba0 20 20 20 20 73 74 72 69 6e 67 20 64 65 73 63 72      string descr
24bb0 69 70 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  iption,..       
24bc0 20 20 20 20 20 73 74 72 69 6e 67 20 74 79 70 65       string type
24bd0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
24be0 20 20 20 41 73 73 65 6d 62 6c 79 4e 61 6d 65 20     AssemblyName 
24bf0 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 0d 0a 20  assemblyName,.. 
24c00 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
24c10 74 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20  t clientData,.. 
24c20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
24c30 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c 0d  throwOnMissing,.
24c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
24c50 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
24c60 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
24c70 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ose,..          
24c80 20 20 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64    ref bool saved
24c90 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
24ca0 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
24cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
24cc0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
24cd0 20 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73         AnyPair<s
24ce0 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69  tring, bool> pai
24cf0 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 20 61  r = clientData a
24d00 73 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67  s AnyPair<string
24d10 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20  , bool>;....    
24d20 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72          if (pair
24d30 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
24d40 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
24d50 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
24d60 3d 20 22 69 6e 76 61 6c 69 64 20 66 72 61 6d 65  = "invalid frame
24d70 77 6f 72 6b 20 63 6f 6e 66 69 67 20 63 61 6c 6c  work config call
24d80 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20  back data";..   
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
24da0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
24db0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24dc0 20 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69           if (pai
24dd0 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20  r.Y)..          
24de0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
24df0 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f       return Remo
24e00 76 65 44 62 50 72 6f 76 69 64 65 72 46 61 63 74  veDbProviderFact
24e10 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ory(..          
24e20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
24e30 6d 65 2c 20 69 6e 76 61 72 69 61 6e 74 2c 20 77  me, invariant, w
24e40 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 20  hatIf, verbose, 
24e50 72 65 66 20 73 61 76 65 64 2c 0d 0a 20 20 20 20  ref saved,..    
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 72 65 66 20 65 72 72 6f 72 29 20 26 26 0d 0a 20  ref error) &&.. 
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
24e90 64 64 44 62 50 72 6f 76 69 64 65 72 46 61 63 74  ddDbProviderFact
24ea0 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ory(..          
24eb0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61            fileNa
24ec0 6d 65 2c 20 69 6e 76 61 72 69 61 6e 74 2c 20 6e  me, invariant, n
24ed0 61 6d 65 2c 20 64 65 73 63 72 69 70 74 69 6f 6e  ame, description
24ee0 2c 20 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20  , typeName,..   
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c 20 77   assemblyName, w
24f10 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 20  hatIf, verbose, 
24f20 72 65 66 20 73 61 76 65 64 2c 20 72 65 66 20 65  ref saved, ref e
24f30 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  rror);..        
24f40 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
24f50 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20     else..       
24f60 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
24f70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52          return R
24f80 65 6d 6f 76 65 44 62 50 72 6f 76 69 64 65 72 46  emoveDbProviderF
24f90 61 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20  actory(..       
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
24fb0 65 4e 61 6d 65 2c 20 69 6e 76 61 72 69 61 6e 74  eName, invariant
24fc0 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
24fd0 65 2c 20 72 65 66 20 73 61 76 65 64 2c 0d 0a 20  e, ref saved,.. 
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 20 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a     ref error);..
25000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
25010 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
25020 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
25030 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
25040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
25080 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
25090 6f 6e 20 41 73 73 65 6d 62 6c 79 20 46 6f 6c 64  on Assembly Fold
250a0 65 72 73 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20  ers Handling..  
250b0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
250c0 61 74 69 63 20 73 74 72 69 6e 67 20 47 65 74 41  atic string GetA
250d0 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 4b 65  ssemblyFoldersKe
250e0 79 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 20 20  yName(..        
250f0 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65      string frame
25100 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  workName,..     
25110 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 66         Version f
25120 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
25130 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
25140 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d  ring platformNam
25150 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  e..            )
25160 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
25170 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
25180 66 6f 72 6d 61 74 20 3d 20 21 53 74 72 69 6e 67  format = !String
25190 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 70  .IsNullOrEmpty(p
251a0 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 20 3f 0d 0a  latformName) ?..
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f  "Software\\Micro
251d0 73 6f 66 74 5c 5c 7b 30 7d 5c 5c 76 7b 31 7d 5c  soft\\{0}\\v{1}\
251e0 5c 7b 32 7d 5c 5c 41 73 73 65 6d 62 6c 79 46 6f  \{2}\\AssemblyFo
251f0 6c 64 65 72 73 45 78 22 20 3a 0d 0a 20 20 20 20  ldersEx" :..    
25200 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6f 66              "Sof
25210 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74  tware\\Microsoft
25220 5c 5c 7b 30 7d 5c 5c 76 7b 31 7d 5c 5c 41 73 73  \\{0}\\v{1}\\Ass
25230 65 6d 62 6c 79 46 6f 6c 64 65 72 73 45 78 22 3b  emblyFoldersEx";
25240 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25250 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f  return String.Fo
25260 72 6d 61 74 28 66 6f 72 6d 61 74 2c 20 66 72 61  rmat(format, fra
25270 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d  meworkName, fram
25280 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
252a0 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a 20  latformName);.. 
252b0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
252c0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
252d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
252e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
252f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
25310 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
25320 74 61 74 69 63 20 62 6f 6f 6c 20 41 64 64 54 6f  tatic bool AddTo
25330 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 28  AssemblyFolders(
25340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f  ..            Mo
25350 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f  ckRegistryKey ro
25360 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  otKey,..        
25370 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d 65      string frame
25380 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  workName,..     
25390 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 66         Version f
253a0 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
253b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
253c0 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d  ring platformNam
253d0 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
253e0 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d  string subKeyNam
253f0 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
25400 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79  string directory
25410 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
25420 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
25430 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
25440 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
25450 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65      ref string e
25460 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20  rror..          
25470 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
25480 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
25490 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74  ng keyName = Get
254a0 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 4b  AssemblyFoldersK
254b0 65 79 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 20  eyName(..       
254c0 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f           framewo
254d0 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72  rkName, framewor
254e0 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61 74 66 6f  kVersion, platfo
254f0 72 6d 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  rmName);....    
25500 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
25510 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b  ockRegistryKey k
25520 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
25530 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
25540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25550 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65       rootKey, ke
25560 79 4e 61 6d 65 2c 20 74 72 75 65 2c 20 77 68 61  yName, true, wha
25570 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
25580 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
25590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
255a0 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  f (key == null).
255b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
255c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
255d0 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
255e0 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
25610 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79  ot open registry
25620 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c   key: {0}\\{1}",
25630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25640 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
25650 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a  y, keyName);....
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
25680 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
25690 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
256a0 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
256b0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73  ockRegistryKey s
256c0 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79  ubKey = Registry
256d0 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62  Helper.CreateSub
256e0 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
25700 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20 77  y, subKeyName, w
25710 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
25720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
25730 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
25740 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
25750 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
25790 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
257a0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72 65 61   "could not crea
257d0 74 65 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a  te registry key:
257e0 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20   {0}\\{1}",..   
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 73 75           key, su
25810 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  bKeyName);....  
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
25840 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
25850 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
25880 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20  .SetValue(..    
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 73 75 62 4b 65 79 2c 20 6e 75 6c 6c      subKey, null
258b0 2c 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 61  , directory, wha
258c0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
258d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258e0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
258f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
25900 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
25910 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
25920 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
25930 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25940 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25950 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25960 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
25970 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
25980 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65  atic bool Remove
25990 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f 6c 64  FromAssemblyFold
259a0 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ers(..          
259b0 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65    MockRegistryKe
259c0 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20  y rootKey,..    
259d0 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66          string f
259e0 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20  rameworkName,.. 
259f0 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69             Versi
25a00 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  on frameworkVers
25a10 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
25a20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72    string platfor
25a30 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  mName,..        
25a40 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65      string subKe
25a50 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
25a60 20 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e      bool throwOn
25a70 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20  Missing,..      
25a80 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
25a90 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
25aa0 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
25ab0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
25ac0 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
25ad0 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
25ae0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
25af0 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
25b00 65 20 3d 20 47 65 74 41 73 73 65 6d 62 6c 79 46  e = GetAssemblyF
25b10 6f 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a  oldersKeyName(..
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b30 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66  frameworkName, f
25b40 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
25b50 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d   platformName);.
25b60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ...            u
25b70 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
25b80 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69  ryKey key = Regi
25b90 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53  stryHelper.OpenS
25ba0 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
25bc0 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 74 72  Key, keyName, tr
25bd0 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ue, whatIf, verb
25be0 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
25bf0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
25c00 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
25c10 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
25c20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
25c40 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
25c50 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
25c70 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
25c80 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
25c90 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
25cc0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
25cd0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25ce0 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
25cf0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
25d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
25d10 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65  egistryHelper.De
25d20 6c 65 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20  leteSubKey(..   
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d40 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65   key, subKeyName
25d50 2c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67  , throwOnMissing
25d60 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
25d70 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
25d80 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
25d90 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a    return true;..
25da0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
25db0 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
25dc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25dd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25de0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25df0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
25e00 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
25e10 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63  static bool Proc
25e20 65 73 73 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65  essAssemblyFolde
25e30 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs(..           
25e40 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
25e50 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20   rootKey,..     
25e60 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 72         string fr
25e70 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20  ameworkName,..  
25e80 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f            Versio
25e90 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  n frameworkVersi
25ea0 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
25eb0 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d   string platform
25ec0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
25ed0 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74     object client
25ee0 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20  Data,..         
25ef0 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d     bool throwOnM
25f00 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  issing,..       
25f10 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
25f20 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
25f30 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
25f40 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
25f50 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
25f60 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
25f70 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
25f80 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67    AnyPair<string
25f90 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d 20 63  , bool> pair = c
25fa0 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41 6e 79  lientData as Any
25fb0 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f  Pair<string, boo
25fc0 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l>;....         
25fd0 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d 20 6e     if (pair == n
25fe0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
25ff0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
26000 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
26010 76 61 6c 69 64 20 66 72 61 6d 65 77 6f 72 6b 20  valid framework 
26020 63 61 6c 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d  callback data";.
26030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26040 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
26050 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
26060 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
26070 28 70 61 69 72 2e 59 29 0d 0a 20 20 20 20 20 20  (pair.Y)..      
26080 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
26090 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
260a0 52 65 6d 6f 76 65 46 72 6f 6d 41 73 73 65 6d 62  RemoveFromAssemb
260b0 6c 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20  lyFolders(..    
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260d0 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f  rootKey, framewo
260e0 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72  rkName, framewor
260f0 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61 74 66 6f  kVersion, platfo
26100 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20  rmName,..       
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 65 67               Leg
26120 61 63 79 50 72 6f 6a 65 63 74 4e 61 6d 65 2c 20  acyProjectName, 
26130 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76  false, whatIf, v
26140 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f  erbose, ref erro
26150 72 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20  r) &&..         
26160 20 20 20 20 20 20 20 41 64 64 54 6f 41 73 73 65         AddToAsse
26170 6d 62 6c 79 46 6f 6c 64 65 72 73 28 0d 0a 20 20  mblyFolders(..  
26180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26190 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65    rootKey, frame
261a0 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77  workName, framew
261b0 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61 74  orkVersion, plat
261c0 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  formName,..     
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
261e0 72 6f 6a 65 63 74 4e 61 6d 65 2c 20 70 61 69 72  rojectName, pair
261f0 2e 58 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  .X, whatIf, verb
26200 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 3b  ose, ref error);
26210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
26220 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
26230 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  e..            {
26240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26250 20 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65 46    return RemoveF
26260 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65  romAssemblyFolde
26270 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs(..           
26280 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
26290 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c  , frameworkName,
262a0 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
262b0 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c  n, platformName,
262c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
262d0 20 20 20 20 20 20 50 72 6f 6a 65 63 74 4e 61 6d        ProjectNam
262e0 65 2c 20 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e  e, throwOnMissin
262f0 67 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  g, whatIf, verbo
26300 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 3b 0d  se, ref error);.
26310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
26320 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
26330 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
26340 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
26350 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26360 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26370 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26390 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
263a0 69 6f 6e 20 56 69 73 75 61 6c 20 53 74 75 64 69  ion Visual Studi
263b0 6f 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20  o Handling..    
263c0 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
263d0 69 63 20 73 74 72 69 6e 67 20 47 65 74 56 73 4b  ic string GetVsK
263e0 65 79 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 20  eyName(..       
263f0 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56       Version vsV
26400 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ersion..        
26410 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
26420 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26430 20 28 76 73 56 65 72 73 69 6f 6e 20 3d 3d 20 6e   (vsVersion == n
26440 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
26450 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
26460 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  l;....          
26470 20 20 72 65 74 75 72 6e 20 53 74 72 69 6e 67 2e    return String.
26480 46 6f 72 6d 61 74 28 22 53 6f 66 74 77 61 72 65  Format("Software
26490 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 56 69 73  \\Microsoft\\Vis
264a0 75 61 6c 53 74 75 64 69 6f 5c 5c 7b 30 7d 22 2c  ualStudio\\{0}",
264b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
264c0 20 20 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 20    vsVersion);.. 
264d0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
264e0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
264f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26500 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
26530 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56         #region V
26540 69 73 75 61 6c 20 53 74 75 64 69 6f 20 44 61 74  isual Studio Dat
26550 61 20 53 6f 75 72 63 65 20 48 61 6e 64 6c 69 6e  a Source Handlin
26560 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  g..        priva
26570 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 41  te static bool A
26580 64 64 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d  ddVsDataSource(.
26590 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63  .            Moc
265a0 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f  kRegistryKey roo
265b0 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
265c0 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72     Version vsVer
265d0 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  sion,..         
265e0 20 20 20 50 61 63 6b 61 67 65 20 70 61 63 6b 61     Package packa
265f0 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge,..           
26600 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
26610 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
26620 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20  verbose,..      
26630 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67        ref string
26640 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
26650 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
26660 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
26670 20 28 76 73 56 65 72 73 69 6f 6e 20 3d 3d 20 6e   (vsVersion == n
26680 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
26690 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
266a0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
266b0 76 61 6c 69 64 20 56 53 20 76 65 72 73 69 6f 6e  valid VS version
266c0 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
266d0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
266e0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
266f0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26700 69 66 20 28 70 61 63 6b 61 67 65 20 3d 3d 20 6e  if (package == n
26710 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
26720 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
26730 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
26740 76 61 6c 69 64 20 56 53 20 70 61 63 6b 61 67 65  valid VS package
26750 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
26760 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
26770 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
26780 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
26790 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d  string keyName =
267a0 20 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76 73   GetVsKeyName(vs
267b0 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20  Version);....   
267c0 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
267d0 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
267e0 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  key = RegistryHe
267f0 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
26800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26810 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b        rootKey, k
26820 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77  eyName, false, w
26830 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
26840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
26850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26860 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c   if (key == null
26870 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
26880 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
26890 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
268a0 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
268b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
268c0 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
268d0 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74   not open regist
268e0 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d  ry key: {0}\\{1}
268f0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
26900 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
26910 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a  Key, keyName);..
26920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26930 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
26940 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
26950 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
26960 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
26970 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
26980 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74   subKey = Regist
26990 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62  ryHelper.OpenSub
269a0 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20  Key(..          
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65                ke
269c0 79 2c 20 22 44 61 74 61 53 6f 75 72 63 65 73 22  y, "DataSources"
269d0 2c 20 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20  , true, whatIf, 
269e0 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20  verbose))..     
269f0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 20 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20    if (subKey == 
26a20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
26a30 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74        error = St
26a60 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
26a90 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74   not open regist
26aa0 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 44 61 74  ry key: {0}\\Dat
26ab0 61 53 6f 75 72 63 65 73 22 2c 0d 0a 20 20 20 20  aSources",..    
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d          key);...
26ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26af0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
26b00 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
26b10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
26b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26b30 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
26b40 52 65 67 69 73 74 72 79 4b 65 79 20 64 61 74 61  RegistryKey data
26b50 53 6f 75 72 63 65 4b 65 79 20 3d 0d 0a 20 20 20  SourceKey =..   
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
26b80 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75  yHelper.CreateSu
26b90 62 4b 65 79 28 73 75 62 4b 65 79 2c 0d 0a 20 20  bKey(subKey,..  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67            packag
26bc0 65 2e 44 61 74 61 53 6f 75 72 63 65 49 64 2e 54  e.DataSourceId.T
26bd0 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d  oString(VsIdForm
26be0 61 74 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  at),..          
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73    whatIf, verbos
26c10 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
26c20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c40 20 20 20 20 69 66 20 28 64 61 74 61 53 6f 75 72      if (dataSour
26c50 63 65 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  ceKey == null)..
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
26c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c90 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
26ca0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
26cd0 63 6f 75 6c 64 20 6e 6f 74 20 63 72 65 61 74 65  could not create
26ce0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
26cf0 30 7d 5c 5c 7b 31 7d 22 2c 20 6b 65 79 2c 0d 0a  0}\\{1}", key,..
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 70 61 63 6b 61 67 65 2e 44 61 74 61 53 6f 75 72  package.DataSour
26d30 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73  ceId.ToString(Vs
26d40 49 64 46 6f 72 6d 61 74 29 29 3b 0d 0a 0d 0a 20  IdFormat));.... 
26d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d60 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
26d70 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
26db0 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65  egistryHelper.Se
26dc0 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20  tValue(..       
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26de0 20 20 20 20 20 64 61 74 61 53 6f 75 72 63 65 4b       dataSourceK
26df0 65 79 2c 20 6e 75 6c 6c 2c 20 53 74 72 69 6e 67  ey, null, String
26e00 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 20 20 20 20 20 22 7b 30 7d 20 44 61 74 61 62        "{0} Datab
26e30 61 73 65 20 46 69 6c 65 22 2c 20 50 72 6f 6a 65  ase File", Proje
26e40 63 74 4e 61 6d 65 29 2c 20 77 68 61 74 49 66 2c  ctName), whatIf,
26e50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
26e70 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
26ea0 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64  r.CreateSubKey(d
26eb0 61 74 61 53 6f 75 72 63 65 4b 65 79 2c 0d 0a 20  ataSourceKey,.. 
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ed0 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
26ee0 67 2e 46 6f 72 6d 61 74 28 22 53 75 70 70 6f 72  g.Format("Suppor
26ef0 74 69 6e 67 50 72 6f 76 69 64 65 72 73 5c 5c 7b  tingProviders\\{
26f00 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  0}",..          
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 70 61 63 6b 61 67 65 2e 44 61 74 61 50 72    package.DataPr
26f30 6f 76 69 64 65 72 49 64 2e 54 6f 53 74 72 69 6e  oviderId.ToStrin
26f40 67 28 56 73 49 64 46 6f 72 6d 61 74 29 29 2c 0d  g(VsIdFormat)),.
26f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26f60 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 61               wha
26f70 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
26fa0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
26fb0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
26fc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
26fd0 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a  ue;..        }..
26fe0 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
26ff0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27000 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27010 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27020 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27030 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  /....        pri
27040 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c  vate static bool
27050 20 52 65 6d 6f 76 65 56 73 44 61 74 61 53 6f 75   RemoveVsDataSou
27060 72 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  rce(..          
27070 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65    MockRegistryKe
27080 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20  y rootKey,..    
27090 20 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20          Version 
270a0 76 73 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20  vsVersion,..    
270b0 20 20 20 20 20 20 20 20 50 61 63 6b 61 67 65 20          Package 
270c0 70 61 63 6b 61 67 65 2c 0d 0a 20 20 20 20 20 20  package,..      
270d0 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
270e0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
270f0 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
27100 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
27110 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
27120 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
27130 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
27140 20 20 20 69 66 20 28 76 73 56 65 72 73 69 6f 6e     if (vsVersion
27150 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
27160 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
27170 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
27180 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 76 65  = "invalid VS ve
27190 72 73 69 6f 6e 22 3b 0d 0a 20 20 20 20 20 20 20  rsion";..       
271a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
271b0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
271c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
271d0 20 20 20 20 20 69 66 20 28 70 61 63 6b 61 67 65       if (package
271e0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
271f0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
27200 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
27210 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 70 61  = "invalid VS pa
27220 63 6b 61 67 65 22 3b 0d 0a 20 20 20 20 20 20 20  ckage";..       
27230 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
27240 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
27250 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
27260 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e       string keyN
27270 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79 4e 61  ame = GetVsKeyNa
27280 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a  me(vsVersion);..
27290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ..            us
272a0 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72  ing (MockRegistr
272b0 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73  yKey key = Regis
272c0 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
272d0 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
272e0 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
272f0 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c  ey, keyName, fal
27300 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  se, whatIf, verb
27310 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
27320 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
27330 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d        if (key ==
27340 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
27350 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
27370 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
27380 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
27390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
273a0 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
273b0 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
273c0 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20  \\{1}",..       
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
273f0 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
27400 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
27410 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
27420 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
27440 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
27450 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
27460 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
27470 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 20 6b 65 79 2c 20 22 44 61 74 61 53 6f 75     key, "DataSou
274a0 72 63 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61  rces", true, wha
274b0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
274e0 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
274f0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
27500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27510 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
27520 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
27530 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
27540 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27560 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
27570 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
27580 5c 5c 44 61 74 61 53 6f 75 72 63 65 73 22 2c 0d  \\DataSources",.
27590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
275b0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
275c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
275d0 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
275e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275f0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27600 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
27610 72 79 48 65 6c 70 65 72 2e 44 65 6c 65 74 65 53  ryHelper.DeleteS
27620 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20  ubKeyTree(..    
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 73 75 62 4b 65 79 2c 20 70 61 63 6b      subKey, pack
27650 61 67 65 2e 44 61 74 61 53 6f 75 72 63 65 49 64  age.DataSourceId
27660 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f  .ToString(VsIdFo
27670 72 6d 61 74 29 2c 0d 0a 20 20 20 20 20 20 20 20  rmat),..        
27680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27690 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
276a0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
276b0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
276c0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
276d0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
276e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
276f0 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
27700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
27740 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
27750 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f   static bool Pro
27760 63 65 73 73 56 73 44 61 74 61 53 6f 75 72 63 65  cessVsDataSource
27770 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  (..            M
27780 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72  ockRegistryKey r
27790 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20  ootKey,..       
277a0 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73 56       Version vsV
277b0 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
277c0 20 20 20 20 20 50 61 63 6b 61 67 65 20 70 61 63       Package pac
277d0 6b 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  kage,..         
277e0 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74     object client
277f0 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20  Data,..         
27800 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d     bool throwOnM
27810 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20  issing,..       
27820 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
27830 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
27840 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
27850 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
27860 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
27870 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
27880 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
27890 20 20 69 66 20 28 70 61 63 6b 61 67 65 20 3d 3d    if (package ==
278a0 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
278b0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
278c0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
278d0 69 6e 76 61 6c 69 64 20 56 53 20 70 61 63 6b 61  invalid VS packa
278e0 67 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ge";..          
278f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
27900 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
27910 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
27920 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67    AnyPair<string
27930 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d 20 63  , bool> pair = c
27940 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41 6e 79  lientData as Any
27950 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f  Pair<string, boo
27960 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l>;....         
27970 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d 20 6e     if (pair == n
27980 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
27990 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
279a0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e       error = "in
279b0 76 61 6c 69 64 20 56 53 20 63 61 6c 6c 62 61 63  valid VS callbac
279c0 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20 20 20 20  k data";..      
279d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
279e0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
279f0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
27a00 20 20 20 20 20 20 69 66 20 28 70 61 69 72 2e 59        if (pair.Y
27a10 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
27a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27a30 20 20 72 65 74 75 72 6e 20 41 64 64 56 73 44 61    return AddVsDa
27a40 74 61 53 6f 75 72 63 65 28 0d 0a 20 20 20 20 20  taSource(..     
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27a60 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f  ootKey, vsVersio
27a70 6e 2c 20 70 61 63 6b 61 67 65 2c 20 77 68 61 74  n, package, what
27a80 49 66 2c 20 76 65 72 62 6f 73 65 2c 20 72 65 66  If, verbose, ref
27a90 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20   error);..      
27aa0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
27ab0 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
27ac0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
27ad0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
27ae0 20 52 65 6d 6f 76 65 56 73 44 61 74 61 53 6f 75   RemoveVsDataSou
27af0 72 63 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  rce(..          
27b00 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
27b10 79 2c 20 76 73 56 65 72 73 69 6f 6e 2c 20 70 61  y, vsVersion, pa
27b20 63 6b 61 67 65 2c 20 77 68 61 74 49 66 2c 20 76  ckage, whatIf, v
27b30 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f  erbose, ref erro
27b40 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r);..           
27b50 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20   }..        }.. 
27b60 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
27b70 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
27b80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27ba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27bb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27bc0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
27bd0 23 72 65 67 69 6f 6e 20 56 69 73 75 61 6c 20 53  #region Visual S
27be0 74 75 64 69 6f 20 44 61 74 61 20 50 72 6f 76 69  tudio Data Provi
27bf0 64 65 72 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20  der Handling..  
27c00 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
27c10 61 74 69 63 20 62 6f 6f 6c 20 41 64 64 56 73 44  atic bool AddVsD
27c20 61 74 61 50 72 6f 76 69 64 65 72 28 0d 0a 20 20  ataProvider(..  
27c30 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
27c40 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
27c50 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
27c60 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f  Version vsVersio
27c70 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n,..            
27c80 50 61 63 6b 61 67 65 20 70 61 63 6b 61 67 65 2c  Package package,
27c90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
27ca0 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a  ring fileName,..
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
27cc0 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
27cd0 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
27ce0 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se,..           
27cf0 20 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f   ref string erro
27d00 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  r..            )
27d10 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20  ..        {..   
27d20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 73 56           if (vsV
27d30 65 72 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d  ersion == null).
27d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64  error = "invalid
27d70 20 56 53 20 76 65 72 73 69 6f 6e 22 3b 0d 0a 20   VS version";.. 
27d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27d90 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
27da0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27db0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
27dc0 61 63 6b 61 67 65 20 3d 3d 20 6e 75 6c 6c 29 0d  ackage == null).
27dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64  error = "invalid
27e00 20 56 53 20 70 61 63 6b 61 67 65 22 3b 0d 0a 20   VS package";.. 
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
27e20 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
27e30 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
27e40 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
27e50 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56  g keyName = GetV
27e60 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69  sKeyName(vsVersi
27e70 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on);....        
27e80 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
27e90 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d  egistryKey key =
27ea0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
27eb0 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
27ee0 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66  e, false, whatIf
27ef0 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
27f00 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
27f10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
27f20 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  key == null)..  
27f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f50 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72       error = Str
27f60 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f80 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
27f90 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65  open registry ke
27fa0 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20  y: {0}\\{1}",.. 
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
27fd0 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  keyName);....   
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ff0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28010 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
28020 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
28030 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b  RegistryKey subK
28040 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
28050 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
28060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28070 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 44           key, "D
28080 61 74 61 50 72 6f 76 69 64 65 72 73 22 2c 20 74  ataProviders", t
28090 72 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  rue, whatIf, ver
280a0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
280b0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
280d0 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c  f (subKey == nul
280e0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
280f0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e     error = Strin
28120 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
28150 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20  t open registry 
28160 6b 65 79 3a 20 7b 30 7d 5c 5c 44 61 74 61 50 72  key: {0}\\DataPr
28170 6f 76 69 64 65 72 73 22 2c 0d 0a 20 20 20 20 20  oviders",..     
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a         key);....
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
281c0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
281d0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
281e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281f0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
28200 65 67 69 73 74 72 79 4b 65 79 20 64 61 74 61 50  egistryKey dataP
28210 72 6f 76 69 64 65 72 4b 65 79 20 3d 0d 0a 20 20  roviderKey =..  
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
28240 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53  ryHelper.CreateS
28250 75 62 4b 65 79 28 73 75 62 4b 65 79 2c 0d 0a 20  ubKey(subKey,.. 
28260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28270 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
28280 67 65 2e 44 61 74 61 50 72 6f 76 69 64 65 72 49  ge.DataProviderI
28290 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46  d.ToString(VsIdF
282a0 6f 72 6d 61 74 29 2c 0d 0a 20 20 20 20 20 20 20  ormat),..       
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65 72       whatIf, ver
282d0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
282e0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 20 20 20 69 66 20 28 64 61 74 61 50         if (dataP
28310 72 6f 76 69 64 65 72 4b 65 79 20 3d 3d 20 6e 75  roviderKey == nu
28320 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
28360 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  r = String.Forma
28370 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63      "could not c
283a0 72 65 61 74 65 20 72 65 67 69 73 74 72 79 20 6b  reate registry k
283b0 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 20 6b  ey: {0}\\{1}", k
283c0 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 70 61 63 6b 61 67 65 2e 44 61 74       package.Dat
283f0 61 50 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74  aProviderId.ToSt
28400 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29  ring(VsIdFormat)
28410 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
28440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28450 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28470 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
28480 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a  lper.SetValue(..
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
284b0 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 6e 75 6c  ProviderKey, nul
284c0 6c 2c 20 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  l, Description, 
284d0 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a       verbose);..
28500 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28510 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
28520 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
28530 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
28560 20 22 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 22   "InvariantName"
28570 2c 20 49 6e 76 61 72 69 61 6e 74 4e 61 6d 65 2c  , InvariantName,
28580 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
285a0 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d  atIf, verbose);.
285b0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
285c0 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
285d0 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c  tryHelper.SetVal
285e0 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue(..           
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79   dataProviderKey
28610 2c 20 22 54 65 63 68 6e 6f 6c 6f 67 79 22 2c 0d  , "Technology",.
28620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63               pac
28640 6b 61 67 65 2e 41 64 6f 4e 65 74 54 65 63 68 6e  kage.AdoNetTechn
28650 6f 6c 6f 67 79 49 64 2e 54 6f 53 74 72 69 6e 67  ologyId.ToString
28660 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 0d 0a 20  (VsIdFormat),.. 
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
28690 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
286c0 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
286d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
286f0 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22  taProviderKey, "
28700 43 6f 64 65 42 61 73 65 22 2c 20 66 69 6c 65 4e  CodeBase", fileN
28710 61 6d 65 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  ame, whatIf,..  
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28730 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73            verbos
28740 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
28760 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65  egistryHelper.Se
28770 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20  tValue(..       
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 64 61 74 61 50 72 6f 76 69 64 65       dataProvide
287a0 72 4b 65 79 2c 20 22 46 61 63 74 6f 72 79 53 65  rKey, "FactorySe
287b0 72 76 69 63 65 22 2c 0d 0a 20 20 20 20 20 20 20  rvice",..       
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 20 20 70 61 63 6b 61 67 65 2e 53 65 72       package.Ser
287e0 76 69 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28  viceId.ToString(
287f0 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61  VsIdFormat), wha
28800 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20    verbose);.... 
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
28850 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b  elper.CreateSubK
28860 65 79 28 64 61 74 61 50 72 6f 76 69 64 65 72 4b  ey(dataProviderK
28870 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 22 53 75 70 70 6f 72 74 65 64 4f 62 6a 65 63   "SupportedObjec
288a0 74 73 5c 5c 44 61 74 61 43 6f 6e 6e 65 63 74 69  ts\\DataConnecti
288b0 6f 6e 55 49 43 6f 6e 74 72 6f 6c 22 2c 0d 0a 20  onUIControl",.. 
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
288e0 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
28910 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62  Helper.CreateSub
28920 4b 65 79 28 64 61 74 61 50 72 6f 76 69 64 65 72  Key(dataProvider
28930 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 22 53 75 70 70 6f 72 74 65 64 4f 62 6a 65    "SupportedObje
28960 63 74 73 5c 5c 44 61 74 61 43 6f 6e 6e 65 63 74  cts\\DataConnect
28970 69 6f 6e 50 72 6f 70 65 72 74 69 65 73 22 2c 0d  ionProperties",.
28980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 61               wha
289a0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
289b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
289c0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
289d0 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53  ryHelper.CreateS
289e0 75 62 4b 65 79 28 64 61 74 61 50 72 6f 76 69 64  ubKey(dataProvid
289f0 65 72 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20  erKey,..        
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 22 53 75 70 70 6f 72 74 65 64 4f 62      "SupportedOb
28a20 6a 65 63 74 73 5c 5c 44 61 74 61 43 6f 6e 6e 65  jects\\DataConne
28a30 63 74 69 6f 6e 53 75 70 70 6f 72 74 22 2c 20 77  ctionSupport", w
28a40 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
28a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d      verbose);...
28a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28a80 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
28a90 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75  yHelper.CreateSu
28aa0 62 4b 65 79 28 64 61 74 61 50 72 6f 76 69 64 65  bKey(dataProvide
28ab0 72 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  rKey,..         
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 22 53 75 70 70 6f 72 74 65 64 4f 62 6a     "SupportedObj
28ae0 65 63 74 73 5c 5c 44 61 74 61 4f 62 6a 65 63 74  ects\\DataObject
28af0 53 75 70 70 6f 72 74 22 2c 20 77 68 61 74 49 66  Support", whatIf
28b00 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
28b20 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
28b50 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28  er.CreateSubKey(
28b60 64 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c  dataProviderKey,
28b70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
28b90 75 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c  upportedObjects\
28ba0 5c 44 61 74 61 56 69 65 77 53 75 70 70 6f 72 74  \DataViewSupport
28bb0 22 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ", whatIf,..    
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
28be0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
28bf0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
28c00 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
28c10 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28c20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28c30 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
28c40 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  }....        ///
28c50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c90 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
28ca0 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
28cb0 6f 6f 6c 20 52 65 6d 6f 76 65 56 73 44 61 74 61  ool RemoveVsData
28cc0 50 72 6f 76 69 64 65 72 28 0d 0a 20 20 20 20 20  Provider(..     
28cd0 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73         MockRegis
28ce0 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d  tryKey rootKey,.
28cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72  .            Ver
28d00 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
28d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 61 63  .            Pac
28d20 6b 61 67 65 20 70 61 63 6b 61 67 65 2c 0d 0a 20  kage package,.. 
28d30 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
28d40 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
28d50 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
28d60 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
28d70 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72  ref string error
28d80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
28d90 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
28da0 20 20 20 20 20 20 20 20 69 66 20 28 76 73 56 65          if (vsVe
28db0 72 73 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  rsion == null)..
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
28de0 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20  rror = "invalid 
28df0 56 53 20 76 65 72 73 69 6f 6e 22 3b 0d 0a 20 20  VS version";..  
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
28e10 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
28e20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
28e30 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
28e40 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56 73   keyName = GetVs
28e50 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69 6f  KeyName(vsVersio
28e60 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  n);....         
28e70 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65     using (MockRe
28e80 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20  gistryKey key = 
28e90 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f  RegistryHelper.O
28ea0 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65  rootKey, keyName
28ed0 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c  , false, whatIf,
28ee0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
28ef0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
28f00 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b             if (k
28f10 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
28f50 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f      "could not o
28f80 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79  pen registry key
28f90 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20  : {0}\\{1}",..  
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b        rootKey, k
28fc0 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20  eyName);....    
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
29000 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
29010 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
29020 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
29030 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70  y = RegistryHelp
29040 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  er.OpenSubKey(..
29050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29060 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 44 61          key, "Da
29070 74 61 50 72 6f 76 69 64 65 72 73 22 2c 20 74 72  taProviders", tr
29080 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  ue, whatIf, verb
29090 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ose))..         
290a0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
290c0 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c   (subKey == null
290d0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
290e0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
29110 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
29140 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b   open registry k
29150 65 79 3a 20 7b 30 7d 5c 5c 44 61 74 61 50 72 6f  ey: {0}\\DataPro
29160 76 69 64 65 72 73 22 2c 0d 0a 20 20 20 20 20 20  viders",..      
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20        key);.... 
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
291b0 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
291c0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291e0 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
291f0 72 2e 44 65 6c 65 74 65 53 75 62 4b 65 79 54 72  r.DeleteSubKeyTr
29200 65 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ee(..           
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62               sub
29220 4b 65 79 2c 20 70 61 63 6b 61 67 65 2e 44 61 74  Key, package.Dat
29230 61 50 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74  aProviderId.ToSt
29240 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29  ring(VsIdFormat)
29250 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
29260 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
29270 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20  f, verbose);..  
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
29290 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
292a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
292b0 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20  turn true;..    
292c0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
292d0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
292e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
292f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29310 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
29320 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
29330 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73 56  ic bool ProcessV
29340 73 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d 0a  sDataProvider(..
29350 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
29360 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
29370 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
29380 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
29390 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
293a0 20 20 50 61 63 6b 61 67 65 20 70 61 63 6b 61 67    Package packag
293b0 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
293c0 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74 44 61 74  object clientDat
293d0 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  a,..            
293e0 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73  bool throwOnMiss
293f0 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ing,..          
29400 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
29410 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
29420 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
29430 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
29440 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
29450 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
29460 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  {..            A
29470 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62  nyPair<string, b
29480 6f 6f 6c 3e 20 70 61 69 72 20 3d 20 63 6c 69 65  ool> pair = clie
29490 6e 74 44 61 74 61 20 61 73 20 41 6e 79 50 61 69  ntData as AnyPai
294a0 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 3b  r<string, bool>;
294b0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
294c0 69 66 20 28 70 61 69 72 20 3d 3d 20 6e 75 6c 6c  if (pair == null
294d0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
294e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
294f0 20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c    error = "inval
29500 69 64 20 56 53 20 63 61 6c 6c 62 61 63 6b 20 64  id VS callback d
29510 61 74 61 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  ata";..         
29520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
29530 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
29540 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
29550 20 20 20 69 66 20 28 70 61 69 72 2e 59 29 0d 0a     if (pair.Y)..
29560 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
29580 65 74 75 72 6e 20 41 64 64 56 73 44 61 74 61 50  eturn AddVsDataP
29590 72 6f 76 69 64 65 72 28 0d 0a 20 20 20 20 20 20  rovider(..      
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
295b0 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f 6e  otKey, vsVersion
295c0 2c 20 70 61 63 6b 61 67 65 2c 20 70 61 69 72 2e  , package, pair.
295d0 58 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  X,..            
295e0 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20          whatIf, 
295f0 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72  verbose, ref err
29600 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
29610 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
29620 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
29630 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
29640 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d        return Rem
29650 6f 76 65 56 73 44 61 74 61 50 72 6f 76 69 64 65  oveVsDataProvide
29660 72 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r(..            
29670 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
29680 20 76 73 56 65 72 73 69 6f 6e 2c 20 70 61 63 6b   vsVersion, pack
29690 61 67 65 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20  age, whatIf,..  
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296b0 20 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65    verbose, ref e
296c0 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20  rror);..        
296d0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
296e0 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
296f0 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
29700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29740 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
29750 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73 75 61     #region Visua
29760 6c 20 53 74 75 64 69 6f 20 50 61 63 6b 61 67 65  l Studio Package
29770 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20   Handling..     
29780 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
29790 63 20 76 6f 69 64 20 49 6e 69 74 69 61 6c 69 7a  c void Initializ
297a0 65 56 73 50 61 63 6b 61 67 65 28 0d 0a 20 20 20  eVsPackage(..   
297b0 20 20 20 20 20 20 20 20 20 72 65 66 20 50 61 63           ref Pac
297c0 6b 61 67 65 20 70 61 63 6b 61 67 65 0d 0a 20 20  kage package..  
297d0 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
297e0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
297f0 20 20 20 20 69 66 20 28 70 61 63 6b 61 67 65 20      if (package 
29800 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
29810 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
29820 20 20 20 20 20 20 20 20 20 70 61 63 6b 61 67 65           package
29830 20 3d 20 6e 65 77 20 50 61 63 6b 61 67 65 28 29   = new Package()
29840 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
29850 20 20 20 20 20 70 61 63 6b 61 67 65 2e 41 64 6f       package.Ado
29860 4e 65 74 54 65 63 68 6e 6f 6c 6f 67 79 49 64 20  NetTechnologyId 
29870 3d 20 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20  = new Guid(..   
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 22 37 37 41 42 39 41 39 44 2d 37 38 42 39 2d   "77AB9A9D-78B9-
298a0 34 42 41 37 2d 39 31 41 43 2d 38 37 33 46 35 33  4BA7-91AC-873F53
298b0 33 38 46 31 44 32 22 29 3b 0d 0a 0d 0a 20 20 20  38F1D2");....   
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63               pac
298d0 6b 61 67 65 2e 50 61 63 6b 61 67 65 49 64 20 3d  kage.PackageId =
298e0 20 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20 20   new Guid(..    
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 22 44 43 42 45 36 43 38 44 2d 30 45 35 37 2d 34  "DCBE6C8D-0E57-4
29910 30 39 39 2d 41 31 38 33 2d 39 38 46 46 37 34 43  099-A183-98FF74C
29920 36 34 44 39 43 22 29 3b 0d 0a 0d 0a 20 20 20 20  64D9C");....    
29930 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
29940 61 67 65 2e 53 65 72 76 69 63 65 49 64 20 3d 20  age.ServiceId = 
29950 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20 20 20  new Guid(..     
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29970 44 43 42 45 36 43 38 44 2d 30 45 35 37 2d 34 30  DCBE6C8D-0E57-40
29980 39 39 2d 41 31 38 33 2d 39 38 46 46 37 34 43 36  99-A183-98FF74C6
29990 34 44 39 44 22 29 3b 0d 0a 0d 0a 20 20 20 20 20  4D9D");....     
299a0 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
299b0 67 65 2e 44 61 74 61 53 6f 75 72 63 65 49 64 20  ge.DataSourceId 
299c0 3d 20 6e 65 77 20 47 75 69 64 28 0d 0a 20 20 20  = new Guid(..   
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 22 30 45 42 41 41 42 36 45 2d 43 41 38 30 2d   "0EBAAB6E-CA80-
299f0 34 42 34 41 2d 38 44 44 46 2d 43 42 45 36 42 46  4B4A-8DDF-CBE6BF
29a00 30 35 38 43 37 31 22 29 3b 0d 0a 0d 0a 20 20 20  058C71");....   
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63               pac
29a20 6b 61 67 65 2e 44 61 74 61 50 72 6f 76 69 64 65  kage.DataProvide
29a30 72 49 64 20 3d 20 6e 65 77 20 47 75 69 64 28 0d  rId = new Guid(.
29a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29a50 20 20 20 20 20 22 30 45 42 41 41 42 36 45 2d 43       "0EBAAB6E-C
29a60 41 38 30 2d 34 42 34 41 2d 38 44 44 46 2d 43 42  A80-4B4A-8DDF-CB
29a70 45 36 42 46 30 35 38 43 37 30 22 29 3b 0d 0a 20  E6BF058C70");.. 
29a80 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
29a90 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
29aa0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
29ab0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29ac0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29ae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
29af0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
29b00 61 74 69 63 20 62 6f 6f 6c 20 41 64 64 56 73 50  atic bool AddVsP
29b10 61 63 6b 61 67 65 28 0d 0a 20 20 20 20 20 20 20  ackage(..       
29b20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72       MockRegistr
29b30 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20  yKey rootKey,.. 
29b40 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69             Versi
29b50 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d 0a 20  on vsVersion,.. 
29b60 20 20 20 20 20 20 20 20 20 20 20 50 61 63 6b 61             Packa
29b70 67 65 20 70 61 63 6b 61 67 65 2c 0d 0a 20 20 20  ge package,..   
29b80 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
29b90 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  fileName,..     
29ba0 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
29bb0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
29bc0 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
29be0 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
29bf0 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
29c00 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
29c10 20 20 20 20 69 66 20 28 76 73 56 65 72 73 69 6f      if (vsVersio
29c20 6e 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  n == null)..    
29c30 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
29c40 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
29c50 20 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 76   = "invalid VS v
29c60 65 72 73 69 6f 6e 22 3b 0d 0a 20 20 20 20 20 20  ersion";..      
29c70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
29c80 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
29c90 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29ca0 20 20 20 20 20 20 69 66 20 28 70 61 63 6b 61 67        if (packag
29cb0 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
29cc0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
29cd0 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
29ce0 20 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 70   = "invalid VS p
29cf0 61 63 6b 61 67 65 22 3b 0d 0a 20 20 20 20 20 20  ackage";..      
29d00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
29d10 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
29d20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
29d30 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79        string key
29d40 4e 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79 4e  Name = GetVsKeyN
29d50 61 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d  ame(vsVersion);.
29d60 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ...            u
29d70 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
29d80 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67 69  ryKey key = Regi
29d90 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53  stryHelper.OpenS
29da0 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
29db0 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
29dc0 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61  Key, keyName, fa
29dd0 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  lse, whatIf, ver
29de0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
29df0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
29e00 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
29e10 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
29e20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e40 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
29e50 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
29e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e70 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20  "could not open 
29e80 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30  registry key: {0
29e90 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20  }\\{1}",..      
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61    rootKey, keyNa
29ec0 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me);....        
29ed0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
29ee0 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
29ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
29f20 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20  tryKey subKey = 
29f30 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f  RegistryHelper.O
29f40 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 20 6b 65 79 2c 20 22 50 61 63 6b 61 67      key, "Packag
29f70 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74 49  es", true, whatI
29f80 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
29fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29fb0 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79 20       if (subKey 
29fc0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
29fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ff0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
2a000 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
2a010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
2a030 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
2a040 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
2a050 50 61 63 6b 61 67 65 73 22 2c 0d 0a 20 20 20 20  Packages",..    
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d          key);...
2a080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a090 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2a0a0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
2a0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a0d0 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
2a0e0 52 65 67 69 73 74 72 79 4b 65 79 20 70 61 63 6b  RegistryKey pack
2a0f0 61 67 65 4b 65 79 20 3d 0d 0a 20 20 20 20 20 20  ageKey =..      
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a110 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
2a120 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65  lper.CreateSubKe
2a130 79 28 73 75 62 4b 65 79 2c 0d 0a 20 20 20 20 20  y(subKey,..     
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 20 20 20 20 70 61 63 6b 61 67 65 2e 50         package.P
2a160 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
2a170 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77  g(VsIdFormat), w
2a180 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 20 20 76 65 72 62 6f 73 65 29 29 0d 0a 20      verbose)).. 
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a1e0 20 28 70 61 63 6b 61 67 65 4b 65 79 20 3d 3d 20   (packageKey == 
2a1f0 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2a210 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
2a230 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
2a240 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
2a270 20 63 72 65 61 74 65 20 72 65 67 69 73 74 72 79   create registry
2a280 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c   key: {0}\\{1}",
2a290 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 20 6b 65 79 2c 20 70 61 63 6b 61 67 65 2e 50    key, package.P
2a2c0 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
2a2d0 67 28 56 73 49 64 46 6f 72 6d 61 74 29 29 3b 0d  g(VsIdFormat));.
2a2e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2a300 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
2a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a320 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
2a350 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61  r.SetValue(packa
2a360 67 65 4b 65 79 2c 20 6e 75 6c 6c 2c 0d 0a 20 20  geKey, null,..  
2a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a380 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
2a390 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 20 44 65 73  .Format("{0} Des
2a3a0 69 67 6e 65 72 20 50 61 63 6b 61 67 65 22 2c 20  igner Package", 
2a3b0 50 72 6f 6a 65 63 74 4e 61 6d 65 29 2c 0d 0a 20  ProjectName),.. 
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49             whatI
2a3e0 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a400 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
2a410 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
2a420 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 43 6c 61  packageKey, "Cla
2a430 73 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ss",..          
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 22 53 51 4c 69 74 65 2e 44 65 73 69 67 6e    "SQLite.Design
2a460 65 72 2e 53 51 4c 69 74 65 50 61 63 6b 61 67 65  er.SQLitePackage
2a470 22 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  ", whatIf, verbo
2a480 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
2a4b0 65 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b  etValue(packageK
2a4c0 65 79 2c 20 22 43 6f 64 65 42 61 73 65 22 2c 0d  ey, "CodeBase",.
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
2a4f0 65 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76  eName, whatIf, v
2a500 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
2a530 65 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b  er.SetValue(pack
2a540 61 67 65 4b 65 79 2c 20 22 49 44 22 2c 20 34 30  ageKey, "ID", 40
2a550 30 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  0, whatIf,..    
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
2a580 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
2a5a0 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56  istryHelper.SetV
2a5b0 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79 2c  alue(packageKey,
2a5c0 20 22 49 6e 70 72 6f 63 53 65 72 76 65 72 33 32   "InprocServer32
2a5d0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 45 6e 76  Path.Combine(Env
2a600 69 72 6f 6e 6d 65 6e 74 2e 53 79 73 74 65 6d 44  ironment.SystemD
2a610 69 72 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20  irectory,..     
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 20 20 20 20 20 20 20 20 20 20 20 22 6d 73 63 6f             "msco
2a640 72 65 65 2e 64 6c 6c 22 29 2c 20 77 68 61 74 49  ree.dll"), whatI
2a650 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a670 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
2a680 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
2a690 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 43 6f 6d  packageKey, "Com
2a6a0 70 61 6e 79 4e 61 6d 65 22 2c 0d 0a 20 20 20 20  panyName",..    
2a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6c0 20 20 20 20 20 20 20 20 22 68 74 74 70 3a 2f 2f          "http://
2a6d0 73 79 73 74 65 6d 2e 64 61 74 61 2e 73 71 6c 69  system.data.sqli
2a6e0 74 65 2e 6f 72 67 2f 22 2c 20 77 68 61 74 49 66  te.org/", whatIf
2a6f0 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
2a720 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70  elper.SetValue(p
2a730 61 63 6b 61 67 65 4b 65 79 2c 20 22 4d 69 6e 45  ackageKey, "MinE
2a740 64 69 74 69 6f 6e 22 2c 0d 0a 20 20 20 20 20 20  dition",..      
2a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a760 20 20 20 20 20 20 22 73 74 61 6e 64 61 72 64 22        "standard"
2a770 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
2a780 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
2a7a0 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65  egistryHelper.Se
2a7b0 74 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65  tValue(packageKe
2a7c0 79 2c 20 22 50 72 6f 64 75 63 74 4e 61 6d 65 22  y, "ProductName"
2a7d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2a7f0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b 30  tring.Format("{0
2a800 7d 20 44 65 73 69 67 6e 65 72 20 50 61 63 6b 61  } Designer Packa
2a810 67 65 22 2c 20 50 72 6f 6a 65 63 74 4e 61 6d 65  ge", ProjectName
2a820 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
2a850 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
2a870 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56  istryHelper.SetV
2a880 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79 2c  alue(packageKey,
2a890 20 22 50 72 6f 64 75 63 74 56 65 72 73 69 6f 6e   "ProductVersion
2a8a0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8c0 22 31 2e 30 22 2c 20 77 68 61 74 49 66 2c 20 76  "1.0", whatIf, v
2a8d0 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8f0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
2a900 65 67 69 73 74 72 79 4b 65 79 20 74 6f 6f 6c 62  egistryKey toolb
2a910 6f 78 4b 65 79 20 3d 0d 0a 20 20 20 20 20 20 20  oxKey =..       
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
2a940 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75  yHelper.CreateSu
2a950 62 4b 65 79 28 70 61 63 6b 61 67 65 4b 65 79 2c  bKey(packageKey,
2a960 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a980 20 20 22 54 6f 6f 6c 62 6f 78 22 2c 20 77 68 61    "Toolbox", wha
2a990 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9b0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9d0 20 20 20 20 20 20 20 69 66 20 28 74 6f 6f 6c 62         if (toolb
2a9e0 6f 78 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  oxKey == null)..
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa00 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2aa30 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f  rror = String.Fo
2aa40 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
2aa70 64 20 6e 6f 74 20 63 72 65 61 74 65 20 72 65 67  d not create reg
2aa80 69 73 74 72 79 20 6b 65 79 3a 20 22 20 2b 0d 0a  istry key: " +..
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aab0 20 20 20 20 22 7b 30 7d 5c 5c 54 6f 6f 6c 62 6f      "{0}\\Toolbo
2aac0 78 22 2c 20 70 61 63 6b 61 67 65 4b 65 79 29 3b  x", packageKey);
2aad0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaf0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
2ab00 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2ab20 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
2ab50 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20  etValue(..      
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 20 20 20 20 20 20 20 74 6f 6f 6c 62 6f            toolbo
2ab80 78 4b 65 79 2c 20 22 44 65 66 61 75 6c 74 20 49  xKey, "Default I
2ab90 74 65 6d 73 22 2c 20 33 2c 20 77 68 61 74 49 66  tems", 3, whatIf
2aba0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abc0 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20     verbose);..  
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2ac20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
2ac30 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b  RegistryKey subK
2ac40 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
2ac50 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
2ac60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac70 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 4d           key, "M
2ac80 65 6e 75 73 22 2c 20 74 72 75 65 2c 20 77 68 61  enus", true, wha
2ac90 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2acc0 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
2acd0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
2ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acf0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2ad00 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
2ad10 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
2ad20 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
2ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ad40 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
2ad50 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
2ad60 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20 20 20 20  \\Menus",..     
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad80 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a         key);....
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
2adb0 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
2adc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
2add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ade0 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
2adf0 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20  er.SetValue(..  
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae10 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 70 61        subKey, pa
2ae20 63 6b 61 67 65 2e 50 61 63 6b 61 67 65 49 64 2e  ckage.PackageId.
2ae30 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72  ToString(VsIdFor
2ae40 6d 61 74 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  mat),..         
2ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ae60 2c 20 31 30 30 30 2c 20 33 22 2c 20 77 68 61 74  , 1000, 3", what
2ae70 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20  If, verbose);.. 
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2ae90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2aea0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
2aeb0 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
2aec0 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70  y = RegistryHelp
2aed0 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  er.OpenSubKey(..
2aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aef0 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 53 65          key, "Se
2af00 72 76 69 63 65 73 22 2c 20 74 72 75 65 2c 20 77  rvices", true, w
2af10 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
2af20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2af30 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2af40 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62           if (sub
2af50 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
2af90 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
2afa0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afc0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
2afd0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
2afe0 30 7d 5c 5c 53 65 72 76 69 63 65 73 22 2c 0d 0a  0}\\Services",..
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 29              key)
2b010 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2b030 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2b060 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28           using (
2b070 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
2b080 73 65 72 76 69 63 65 4b 65 79 20 3d 0d 0a 20 20  serviceKey =..  
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
2b0b0 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53  ryHelper.CreateS
2b0c0 75 62 4b 65 79 28 73 75 62 4b 65 79 2c 0d 0a 20  ubKey(subKey,.. 
2b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0e0 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
2b0f0 67 65 2e 53 65 72 76 69 63 65 49 64 2e 54 6f 53  ge.ServiceId.ToS
2b100 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
2b110 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ), whatIf,..    
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
2b140 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2b150 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b170 20 20 69 66 20 28 73 65 72 76 69 63 65 4b 65 79    if (serviceKey
2b180 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2b1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1c0 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
2b1d0 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
2b200 20 6e 6f 74 20 63 72 65 61 74 65 20 72 65 67 69   not create regi
2b210 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b  stry key: {0}\\{
2b220 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b240 20 20 20 20 20 20 6b 65 79 2c 20 70 61 63 6b 61        key, packa
2b250 67 65 2e 53 65 72 76 69 63 65 49 64 2e 54 6f 53  ge.ServiceId.ToS
2b260 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
2b270 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ));....         
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
2b2a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b2b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
2b2e0 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 73  elper.SetValue(s
2b2f0 65 72 76 69 63 65 4b 65 79 2c 20 6e 75 6c 6c 2c  erviceKey, null,
2b300 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
2b320 63 6b 61 67 65 2e 50 61 63 6b 61 67 65 49 64 2e  ckage.PackageId.
2b330 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72  ToString(VsIdFor
2b340 6d 61 74 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20  mat), whatIf,.. 
2b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b360 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f             verbo
2b370 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
2b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b390 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53  RegistryHelper.S
2b3a0 65 74 56 61 6c 75 65 28 73 65 72 76 69 63 65 4b  etValue(serviceK
2b3b0 65 79 2c 20 22 4e 61 6d 65 22 2c 0d 0a 20 20 20  ey, "Name",..   
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e           String.
2b3e0 46 6f 72 6d 61 74 28 22 7b 30 7d 20 44 65 73 69  Format("{0} Desi
2b3f0 67 6e 65 72 20 53 65 72 76 69 63 65 22 2c 20 50  gner Service", P
2b400 72 6f 6a 65 63 74 4e 61 6d 65 29 2c 0d 0a 20 20  rojectName),..  
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b420 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66            whatIf
2b430 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20  , verbose);..   
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2b460 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2b470 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2b480 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b      return true;
2b490 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
2b4a0 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
2b4b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b4c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b4d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b4e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
2b4f0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
2b500 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 52 65  e static bool Re
2b510 6d 6f 76 65 56 73 50 61 63 6b 61 67 65 28 0d 0a  moveVsPackage(..
2b520 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b              Mock
2b530 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
2b540 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
2b550 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
2b560 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
2b570 20 20 50 61 63 6b 61 67 65 20 70 61 63 6b 61 67    Package packag
2b580 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
2b590 62 6f 6f 6c 20 74 68 72 6f 77 4f 6e 4d 69 73 73  bool throwOnMiss
2b5a0 69 6e 67 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ing,..          
2b5b0 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
2b5c0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
2b5d0 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
2b5e0 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
2b5f0 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
2b600 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
2b610 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  {..            i
2b620 66 20 28 76 73 56 65 72 73 69 6f 6e 20 3d 3d 20  f (vsVersion == 
2b630 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2b640 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2b650 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69        error = "i
2b660 6e 76 61 6c 69 64 20 56 53 20 76 65 72 73 69 6f  nvalid VS versio
2b670 6e 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n";..           
2b680 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
2b690 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
2b6a0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2b6b0 20 69 66 20 28 70 61 63 6b 61 67 65 20 3d 3d 20   if (package == 
2b6c0 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2b6d0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2b6e0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69        error = "i
2b6f0 6e 76 61 6c 69 64 20 56 53 20 70 61 63 6b 61 67  nvalid VS packag
2b700 65 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e";..           
2b710 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
2b720 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
2b730 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2b740 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20   string keyName 
2b750 3d 20 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76  = GetVsKeyName(v
2b760 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20  sVersion);....  
2b770 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
2b780 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
2b790 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48   key = RegistryH
2b7a0 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
2b7b0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
2b7c0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
2b7d0 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20  keyName, false, 
2b7e0 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
2b7f0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
2b800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2b810 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
2b820 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
2b830 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2b840 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
2b850 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
2b860 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
2b870 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
2b880 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73  d not open regis
2b890 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31  try key: {0}\\{1
2b8a0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
2b8c0 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d  tKey, keyName);.
2b8d0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2b8e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
2b8f0 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
2b900 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
2b910 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
2b920 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
2b930 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73  y subKey = Regis
2b940 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
2b950 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
2b970 65 79 2c 20 22 50 61 63 6b 61 67 65 73 22 2c 20  ey, "Packages", 
2b980 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20 76 65  true, whatIf, ve
2b990 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
2b9a0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9c0 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75  if (subKey == nu
2b9d0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
2b9e0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba00 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69      error = Stri
2ba10 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba30 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
2ba40 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79  ot open registry
2ba50 20 6b 65 79 3a 20 7b 30 7d 5c 5c 50 61 63 6b 61   key: {0}\\Packa
2ba60 67 65 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ges",..         
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20     key);....    
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2baa0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
2bab0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2bac0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bae0 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 44  RegistryHelper.D
2baf0 65 6c 65 74 65 53 75 62 4b 65 79 54 72 65 65 28  eleteSubKeyTree(
2bb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bb10 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 70            key, p
2bb20 61 63 6b 61 67 65 2e 50 61 63 6b 61 67 65 49 64  ackage.PackageId
2bb30 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f  .ToString(VsIdFo
2bb40 72 6d 61 74 29 2c 0d 0a 20 20 20 20 20 20 20 20  rmat),..        
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb60 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
2bb70 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2bb80 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
2bb90 20 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d          using (M
2bba0 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73  ockRegistryKey s
2bbb0 75 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79  ubKey = Registry
2bbc0 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
2bbd0 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c              key,
2bbf0 20 22 4d 65 6e 75 73 22 2c 20 74 72 75 65 2c 20   "Menus", true, 
2bc00 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
2bc10 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2bc20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2bc30 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75            if (su
2bc40 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  bKey == null).. 
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc60 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
2bc80 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
2bc90 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcb0 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65    "could not ope
2bcc0 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20  n registry key: 
2bcd0 7b 30 7d 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20  {0}\\Menus",..  
2bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcf0 20 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d            key);.
2bd00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2bd10 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2bd20 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2bd40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2bd50 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
2bd60 65 6c 70 65 72 2e 44 65 6c 65 74 65 56 61 6c 75  elper.DeleteValu
2bd70 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
2bd80 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b              subK
2bd90 65 79 2c 20 70 61 63 6b 61 67 65 2e 50 61 63 6b  ey, package.Pack
2bda0 61 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  ageId.ToString(V
2bdb0 73 49 64 46 6f 72 6d 61 74 29 2c 0d 0a 20 20 20  sIdFormat),..   
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 20 74 68 72 6f 77 4f 6e 4d 69 73 73       throwOnMiss
2bde0 69 6e 67 2c 20 77 68 61 74 49 66 2c 20 76 65 72  ing, whatIf, ver
2bdf0 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  bose);..        
2be00 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
2be20 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
2be30 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67  Key subKey = Reg
2be40 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
2be50 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
2be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be70 20 6b 65 79 2c 20 22 53 65 72 76 69 63 65 73 22   key, "Services"
2be80 2c 20 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20  , true, whatIf, 
2be90 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20  verbose))..     
2bea0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bec0 20 20 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20    if (subKey == 
2bed0 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
2bee0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74        error = St
2bf10 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf30 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
2bf40 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74   not open regist
2bf50 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 53 65 72  ry key: {0}\\Ser
2bf60 76 69 63 65 73 22 2c 0d 0a 20 20 20 20 20 20 20  vices",..       
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20       key);....  
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
2bfb0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
2bfc0 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
2bff0 2e 44 65 6c 65 74 65 53 75 62 4b 65 79 54 72 65  .DeleteSubKeyTre
2c000 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
2c010 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b              subK
2c020 65 79 2c 20 70 61 63 6b 61 67 65 2e 53 65 72 76  ey, package.Serv
2c030 69 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  iceId.ToString(V
2c040 73 49 64 46 6f 72 6d 61 74 29 2c 0d 0a 20 20 20  sIdFormat),..   
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c060 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65 72       whatIf, ver
2c070 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  bose);..        
2c080 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2c090 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c0a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
2c0b0 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  rue;..        }.
2c0c0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
2c0d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c0e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c0f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c100 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c110 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
2c120 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
2c130 6c 20 50 72 6f 63 65 73 73 56 73 50 61 63 6b 61  l ProcessVsPacka
2c140 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge(..           
2c150 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
2c160 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20   rootKey,..     
2c170 20 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76         Version v
2c180 73 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20  sVersion,..     
2c190 20 20 20 20 20 20 20 50 61 63 6b 61 67 65 20 70         Package p
2c1a0 61 63 6b 61 67 65 2c 0d 0a 20 20 20 20 20 20 20  ackage,..       
2c1b0 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
2c1c0 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
2c1d0 20 20 20 20 20 62 6f 6f 6c 20 74 68 72 6f 77 4f       bool throwO
2c1e0 6e 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20  nMissing,..     
2c1f0 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
2c200 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
2c210 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
2c220 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
2c230 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
2c240 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
2c250 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
2c260 20 20 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69      AnyPair<stri
2c270 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d  ng, bool> pair =
2c280 20 63 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41   clientData as A
2c290 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62  nyPair<string, b
2c2a0 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ool>;....       
2c2b0 20 20 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d       if (pair ==
2c2c0 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
2c2d0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2c2e0 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
2c2f0 69 6e 76 61 6c 69 64 20 56 53 20 63 61 6c 6c 62  invalid VS callb
2c300 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20 20  ack data";..    
2c310 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2c320 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
2c330 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2c340 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72          if (pair
2c350 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .Y)..           
2c360 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c370 20 20 20 20 72 65 74 75 72 6e 20 41 64 64 56 73      return AddVs
2c380 50 61 63 6b 61 67 65 28 0d 0a 20 20 20 20 20 20  Package(..      
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
2c3a0 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f 6e  otKey, vsVersion
2c3b0 2c 20 70 61 63 6b 61 67 65 2c 20 70 61 69 72 2e  , package, pair.
2c3c0 58 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  X, whatIf, verbo
2c3d0 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se,..           
2c3e0 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72 72           ref err
2c3f0 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
2c400 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2c410 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
2c420 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2c430 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d        return Rem
2c440 6f 76 65 56 73 50 61 63 6b 61 67 65 28 0d 0a 20  oveVsPackage(.. 
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c460 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65     rootKey, vsVe
2c470 72 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65 2c 20  rsion, package, 
2c480 74 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c 20  throwOnMissing, 
2c490 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
2c4b0 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29  bose, ref error)
2c4c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
2c4d0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
2c4e0 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
2c4f0 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
2c500 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
2c510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c520 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c530 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c540 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c550 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
2c560 20 20 23 72 65 67 69 6f 6e 20 41 70 70 6c 69 63    #region Applic
2c570 61 74 69 6f 6e 20 45 6e 74 72 79 20 50 6f 69 6e  ation Entry Poin
2c580 74 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  t..        priva
2c590 74 65 20 73 74 61 74 69 63 20 69 6e 74 20 4d 61  te static int Ma
2c5a0 69 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  in(..           
2c5b0 20 73 74 72 69 6e 67 5b 5d 20 61 72 67 73 0d 0a   string[] args..
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
2c5d0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2c5e0 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20 20        try..     
2c5f0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
2c600 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67            Config
2c610 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72  uration configur
2c620 61 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20  ation = null;.. 
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c640 74 72 69 6e 67 20 65 72 72 6f 72 20 3d 20 6e 75  tring error = nu
2c650 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ll;....         
2c660 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
2c670 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c680 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c690 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c6a0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
2c6b0 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
2c6c0 6e 20 43 6f 6d 6d 61 6e 64 20 4c 69 6e 65 20 50  n Command Line P
2c6d0 72 6f 63 65 73 73 69 6e 67 0d 0a 20 20 20 20 20  rocessing..     
2c6e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
2c6f0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 46 72  Configuration.Fr
2c700 6f 6d 41 72 67 73 28 0d 0a 20 20 20 20 20 20 20  omArgs(..       
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 20 61 72 67 73 2c 20 74 72 75 65 2c 20 72 65 66   args, true, ref
2c730 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20   configuration, 
2c740 72 65 66 20 65 72 72 6f 72 29 20 7c 7c 0d 0a 20  ref error) ||.. 
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c760 20 20 20 21 43 6f 6e 66 69 67 75 72 61 74 69 6f     !Configuratio
2c770 6e 2e 50 72 6f 63 65 73 73 28 0d 0a 20 20 20 20  n.Process(..    
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c790 20 20 20 20 61 72 67 73 2c 20 63 6f 6e 66 69 67      args, config
2c7a0 75 72 61 74 69 6f 6e 2c 20 74 72 75 65 2c 20 72  uration, true, r
2c7b0 65 66 20 65 72 72 6f 72 29 20 7c 7c 0d 0a 20 20  ef error) ||..  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 20 20 21 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e    !Configuration
2c7e0 2e 43 68 65 63 6b 52 75 6e 74 69 6d 65 56 65 72  .CheckRuntimeVer
2c7f0 73 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20  sion(..         
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c810 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20 74 72  onfiguration, tr
2c820 75 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d  ue, ref error)).
2c830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c840 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2c850 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
2c860 2e 53 68 6f 77 4d 65 73 73 61 67 65 28 54 72 61  .ShowMessage(Tra
2c870 63 65 50 72 69 6f 72 69 74 79 2e 48 69 67 68 65  cePriority.Highe
2c880 73 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  st,..           
2c890 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62               deb
2c8a0 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63  ugCallback, trac
2c8b0 65 43 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 41  eCallback, thisA
2c8c0 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20  ssembly,..      
2c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8e0 20 20 65 72 72 6f 72 2c 20 74 72 61 63 65 43 61    error, traceCa
2c8f0 74 65 67 6f 72 79 2c 20 4d 65 73 73 61 67 65 42  tegory, MessageB
2c900 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 0d 0a 20  oxButtons.OK,.. 
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c920 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
2c930 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d  xIcon.Error);...
2c940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c950 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 2f       return 1; /
2c960 2a 20 46 41 49 4c 55 52 45 20 2a 2f 0d 0a 20 20  * FAILURE */..  
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2c980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c990 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c9b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c9c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c9d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c9e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
2c9f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ca00 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
2ca10 69 73 74 72 79 20 72 65 67 69 73 74 72 79 20 3d  istry registry =
2ca20 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73 74 72   new MockRegistr
2ca30 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
2ca50 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66  iguration.WhatIf
2ca60 2c 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 29 29  , false, false))
2ca70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ca80 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
2ca90 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e           #region
2caa0 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20   .NET Framework 
2cab0 2f 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20  / Visual Studio 
2cac0 44 61 74 61 0d 0a 20 20 20 20 20 20 20 20 20 20  Data..          
2cad0 20 20 20 20 20 20 20 20 20 20 50 61 63 6b 61 67            Packag
2cae0 65 20 70 61 63 6b 61 67 65 20 3d 20 6e 75 6c 6c  e package = null
2caf0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
2cb00 20 20 20 20 20 20 20 46 72 61 6d 65 77 6f 72 6b         Framework
2cb10 4c 69 73 74 20 66 72 61 6d 65 77 6f 72 6b 4c 69  List frameworkLi
2cb20 73 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  st = null;..    
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb40 56 73 4c 69 73 74 20 76 73 4c 69 73 74 20 3d 20  VsList vsList = 
2cb50 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  null;....       
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f               ///
2cb70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cb80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cb90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cba0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbc0 49 6e 69 74 69 61 6c 69 7a 65 56 73 50 61 63 6b  InitializeVsPack
2cbd0 61 67 65 28 72 65 66 20 70 61 63 6b 61 67 65 29  age(ref package)
2cbe0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
2cbf0 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
2cc00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cc10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cc20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cc30 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 69 74              Init
2cc50 69 61 6c 69 7a 65 46 72 61 6d 65 77 6f 72 6b 4c  ializeFrameworkL
2cc60 69 73 74 28 72 65 67 69 73 74 72 79 2e 4c 6f 63  ist(registry.Loc
2cc70 61 6c 4d 61 63 68 69 6e 65 2c 0d 0a 20 20 20 20  alMachine,..    
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc90 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
2cca0 6e 2c 20 72 65 66 20 66 72 61 6d 65 77 6f 72 6b  n, ref framework
2ccb0 4c 69 73 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  List);....      
2ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49 6e                In
2ccd0 69 74 69 61 6c 69 7a 65 56 73 4c 69 73 74 28 72  itializeVsList(r
2cce0 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63  egistry.LocalMac
2ccf0 68 69 6e 65 2c 20 63 6f 6e 66 69 67 75 72 61 74  hine, configurat
2cd00 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
2cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2cd20 66 20 76 73 4c 69 73 74 29 3b 0d 0a 20 20 20 20  f vsList);..    
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
2cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd60 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
2cd70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cd80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cd90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
2cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2cdb0 20 20 20 20 20 23 72 65 67 69 6f 6e 20 43 6f 72       #region Cor
2cdc0 65 20 41 73 73 65 6d 62 6c 79 20 4e 61 6d 65 20  e Assembly Name 
2cdd0 43 68 65 63 6b 0d 0a 20 20 20 20 20 20 20 20 20  Check..         
2cde0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 44 6f 20 74     // NOTE: Do t
2ce10 68 69 73 20 66 69 72 73 74 2c 20 62 65 66 6f 72  his first, befor
2ce20 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 68 61  e making any cha
2ce30 6e 67 65 73 20 74 6f 20 74 68 65 0d 0a 20 20 20  nges to the..   
2ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce50 20 2f 2f 20 20 20 20 20 20 20 73 79 73 74 65 6d   //       system
2ce60 2c 20 62 65 63 61 75 73 65 20 69 74 20 77 69 6c  , because it wil
2ce70 6c 20 74 68 72 6f 77 20 61 6e 20 65 78 63 65 70  l throw an excep
2ce80 74 69 6f 6e 20 69 66 20 74 68 65 0d 0a 20 20 20  tion if the..   
2ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cea0 20 2f 2f 20 20 20 20 20 20 20 66 69 6c 65 20 6e   //       file n
2ceb0 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 72 65 70  ame does not rep
2cec0 72 65 73 65 6e 74 20 61 20 76 61 6c 69 64 20 6d  resent a valid m
2ced0 61 6e 61 67 65 64 0d 0a 20 20 20 20 20 20 20 20  anaged..        
2cee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
2cef0 20 20 20 20 20 61 73 73 65 6d 62 6c 79 2e 0d 0a       assembly...
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf10 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65              Asse
2cf30 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c  mblyName assembl
2cf40 79 4e 61 6d 65 20 3d 20 41 73 73 65 6d 62 6c 79  yName = Assembly
2cf50 4e 61 6d 65 2e 47 65 74 41 73 73 65 6d 62 6c 79  Name.GetAssembly
2cf60 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 20 20 20  Name(..         
2cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2cf80 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 6f 72  onfiguration.Cor
2cf90 65 46 69 6c 65 4e 61 6d 65 29 3b 20 2f 2a 20 74  eFileName); /* t
2cfa0 68 72 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20  hrow */..       
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e               #en
2cfc0 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cfe0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cff0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d000 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d010 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d030 20 20 23 72 65 67 69 6f 6e 20 53 68 61 72 65 64    #region Shared
2d040 20 43 6c 69 65 6e 74 20 44 61 74 61 20 43 72 65   Client Data Cre
2d050 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 20  ation..         
2d060 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
2d070 74 20 64 69 72 65 63 74 6f 72 79 44 61 74 61 20  t directoryData 
2d080 3d 20 6e 65 77 20 41 6e 79 50 61 69 72 3c 73 74  = new AnyPair<st
2d090 72 69 6e 67 2c 20 62 6f 6f 6c 3e 28 0d 0a 20 20  ring, bool>(..  
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
2d0c0 69 6f 6e 2e 44 69 72 65 63 74 6f 72 79 2c 20 63  ion.Directory, c
2d0d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 49 6e 73  onfiguration.Ins
2d0e0 74 61 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  tall);....      
2d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62                ob
2d100 6a 65 63 74 20 66 69 6c 65 4e 61 6d 65 44 61 74  ject fileNameDat
2d110 61 20 3d 20 6e 65 77 20 41 6e 79 50 61 69 72 3c  a = new AnyPair<
2d120 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 28 0d 0a  string, bool>(..
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
2d150 61 74 69 6f 6e 2e 44 65 73 69 67 6e 65 72 46 69  ation.DesignerFi
2d160 6c 65 4e 61 6d 65 2c 20 63 6f 6e 66 69 67 75 72  leName, configur
2d170 61 74 69 6f 6e 2e 49 6e 73 74 61 6c 6c 29 3b 0d  ation.Install);.
2d180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d190 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
2d1a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2d1b0 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
2d1c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d1d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d1e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d1f0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
2d200 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
2d210 6e 20 2e 4e 45 54 20 47 41 43 20 49 6e 73 74 61  n .NET GAC Insta
2d220 6c 6c 2f 52 65 6d 6f 76 65 0d 0a 20 20 20 20 20  ll/Remove..     
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2d240 66 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  f (configuration
2d250 2e 48 61 73 46 6c 61 67 73 28 49 6e 73 74 61 6c  .HasFlags(Instal
2d260 6c 46 6c 61 67 73 2e 47 41 43 2c 20 74 72 75 65  lFlags.GAC, true
2d270 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
2d280 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 20 20 50 75 62 6c 69 73 68 20 70 75 62 6c 69     Publish publi
2d2b0 73 68 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  sh = null;....  
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2d0 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69        if (!confi
2d2e0 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 29  guration.WhatIf)
2d2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75                pu
2d310 62 6c 69 73 68 20 3d 20 6e 65 77 20 50 75 62 6c  blish = new Publ
2d320 69 73 68 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ish();....      
2d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d340 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61 74    if (configurat
2d350 69 6f 6e 2e 49 6e 73 74 61 6c 6c 29 0d 0a 20 20  ion.Install)..  
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d390 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67       if (!config
2d3a0 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 29 0d  uration.WhatIf).
2d3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3d0 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20   /* throw */..  
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 75                pu
2d400 62 6c 69 73 68 2e 47 61 63 49 6e 73 74 61 6c 6c  blish.GacInstall
2d410 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43  (configuration.C
2d420 6f 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d  oreFileName);...
2d430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
2d450 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72  ceOps.DebugAndTr
2d460 61 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74  ace(TracePriorit
2d470 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20  y.Highest,..    
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d490 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75              debu
2d4a0 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65  gCallback, trace
2d4b0 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
2d4c0 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
2d4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4e0 20 20 20 20 20 20 20 20 20 20 22 47 61 63 49 6e            "GacIn
2d4f0 73 74 61 6c 6c 3a 20 61 73 73 65 6d 62 6c 79 50  stall: assemblyP
2d500 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20  ath = {0}",..   
2d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d520 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
2d530 44 69 73 70 6c 61 79 28 63 6f 6e 66 69 67 75 72  Display(configur
2d540 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e 61  ation.CoreFileNa
2d550 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  me)),..         
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
2d580 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5a0 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69        if (!confi
2d5b0 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 29  guration.WhatIf)
2d5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5e0 20 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20    /* throw */.. 
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d610 75 62 6c 69 73 68 2e 47 61 63 49 6e 73 74 61 6c  ublish.GacInstal
2d620 6c 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  l(configuration.
2d630 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a  LinqFileName);..
2d640 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
2d660 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54  aceOps.DebugAndT
2d670 72 61 63 65 28 54 72 61 63 65 50 72 69 6f 72 69  race(TracePriori
2d680 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20  ty.Highest,..   
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62               deb
2d6b0 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63  ugCallback, trac
2d6c0 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
2d6d0 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
2d6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6f0 20 20 20 20 20 20 20 20 20 20 20 22 47 61 63 49             "GacI
2d700 6e 73 74 61 6c 6c 3a 20 61 73 73 65 6d 62 6c 79  nstall: assembly
2d710 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20  Path = {0}",..  
2d720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
2d740 72 44 69 73 70 6c 61 79 28 63 6f 6e 66 69 67 75  rDisplay(configu
2d750 72 61 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e  ration.LinqFileN
2d760 61 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ame)),..        
2d770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d780 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
2d790 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20  egory);..       
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2d7c0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
2d7d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d7e0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d800 20 20 20 20 20 20 20 20 20 69 66 20 28 21 63 6f           if (!co
2d810 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74  nfiguration.What
2d820 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If)..           
2d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d840 20 20 20 20 20 2f 2a 20 74 68 72 6f 77 20 2a 2f       /* throw */
2d850 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d870 20 20 70 75 62 6c 69 73 68 2e 47 61 63 52 65 6d    publish.GacRem
2d880 6f 76 65 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  ove(configuratio
2d890 6e 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29 3b  n.LinqFileName);
2d8a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 54 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e  TraceOps.DebugAn
2d8d0 64 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f  dTrace(TracePrio
2d8e0 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20  rity.Highest,.. 
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2d910 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72  ebugCallback, tr
2d920 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
2d930 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
2d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d950 20 20 20 20 20 20 20 20 20 20 20 20 20 22 47 61               "Ga
2d960 63 52 65 6d 6f 76 65 3a 20 61 73 73 65 6d 62 6c  cRemove: assembl
2d970 79 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20  yPath = {0}",.. 
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
2d9a0 6f 72 44 69 73 70 6c 61 79 28 63 6f 6e 66 69 67  orDisplay(config
2d9b0 75 72 61 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65  uration.LinqFile
2d9c0 4e 61 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20  Name)),..       
2d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9e0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
2d9f0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
2da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da10 20 20 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e          if (!con
2da20 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49  figuration.WhatI
2da30 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f)..            
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da50 20 20 20 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d      /* throw */.
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da80 20 70 75 62 6c 69 73 68 2e 47 61 63 52 65 6d 6f   publish.GacRemo
2da90 76 65 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ve(configuration
2daa0 2e 43 6f 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d  .CoreFileName);.
2dab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
2dad0 72 61 63 65 4f 70 73 2e 44 65 62 75 67 41 6e 64  raceOps.DebugAnd
2dae0 54 72 61 63 65 28 54 72 61 63 65 50 72 69 6f 72  Trace(TracePrior
2daf0 69 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20  ity.Highest,..  
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
2db20 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61  bugCallback, tra
2db30 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
2db40 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
2db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db60 20 20 20 20 20 20 20 20 20 20 20 20 22 47 61 63              "Gac
2db70 52 65 6d 6f 76 65 3a 20 61 73 73 65 6d 62 6c 79  Remove: assembly
2db80 50 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20  Path = {0}",..  
2db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
2dbb0 72 44 69 73 70 6c 61 79 28 63 6f 6e 66 69 67 75  rDisplay(configu
2dbc0 72 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e  ration.CoreFileN
2dbd0 61 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ame)),..        
2dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbf0 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
2dc00 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20  egory);..       
2dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2dc30 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2dc50 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc70 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2dc80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2dc90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2dca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dcc0 20 20 20 20 23 72 65 67 69 6f 6e 20 2e 4e 45 54      #region .NET
2dcd0 20 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73   AssemblyFolders
2dce0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2dcf0 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67        if (config
2dd00 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73  uration.HasFlags
2dd10 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
2dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
2dd30 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 41 73 73 65  nstallFlags.Asse
2dd40 6d 62 6c 79 46 6f 6c 64 65 72 73 2c 20 74 72 75  mblyFolders, tru
2dd50 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
2dd60 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd80 20 20 20 20 69 66 20 28 21 46 6f 72 45 61 63 68      if (!ForEach
2dd90 46 72 61 6d 65 77 6f 72 6b 52 65 67 69 73 74 72  FrameworkRegistr
2dda0 79 28 72 65 67 69 73 74 72 79 2c 0d 0a 20 20 20  y(registry,..   
2ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61               fra
2ddd0 6d 65 77 6f 72 6b 4c 69 73 74 2c 20 50 72 6f 63  meworkList, Proc
2dde0 65 73 73 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65  essAssemblyFolde
2ddf0 72 73 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rs,..           
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 44 61       directoryDa
2de20 74 61 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ta, configuratio
2de30 6e 2e 54 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67  n.ThrowOnMissing
2de40 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
2de70 2e 57 68 61 74 49 66 2c 20 63 6f 6e 66 69 67 75  .WhatIf, configu
2de80 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 0d  ration.Verbose,.
2de90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20   ref error))..  
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ded0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2def0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68       TraceOps.Sh
2df00 6f 77 4d 65 73 73 61 67 65 28 54 72 61 63 65 50  owMessage(TraceP
2df10 72 69 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c  riority.Highest,
2df20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df40 20 20 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c    debugCallback,
2df50 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20   traceCallback, 
2df60 74 68 69 73 41 73 73 65 6d 62 6c 79 2c 0d 0a 20  thisAssembly,.. 
2df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2df90 72 72 6f 72 2c 20 74 72 61 63 65 43 61 74 65 67  rror, traceCateg
2dfa0 6f 72 79 2c 20 4d 65 73 73 61 67 65 42 6f 78 42  ory, MessageBoxB
2dfb0 75 74 74 6f 6e 73 2e 4f 4b 2c 0d 0a 20 20 20 20  uttons.OK,..    
2dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73              Mess
2dfe0 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72 72 6f 72  ageBoxIcon.Error
2dff0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
2e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e010 20 20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 46    return 1; /* F
2e020 41 49 4c 55 52 45 20 2a 2f 0d 0a 20 20 20 20 20  AILURE */..     
2e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e040 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
2e050 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e070 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e090 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
2e0a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e0b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e0c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
2e0d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e0e0 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 2e 4e        #region .N
2e0f0 45 54 20 44 62 50 72 6f 76 69 64 65 72 46 61 63  ET DbProviderFac
2e100 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20  tory..          
2e110 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f            if (co
2e120 6e 66 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46  nfiguration.HasF
2e130 6c 61 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20  lags(..         
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 20 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e     InstallFlags.
2e160 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
2e170 79 2c 20 74 72 75 65 29 29 0d 0a 20 20 20 20 20  y, true))..     
2e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2e190 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e1a0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 73            bool s
2e1b0 61 76 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d  aved = false;...
2e1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e1d0 20 20 20 20 20 20 20 20 20 69 66 20 28 21 46 6f           if (!Fo
2e1e0 72 45 61 63 68 46 72 61 6d 65 77 6f 72 6b 43 6f  rEachFrameworkCo
2e1f0 6e 66 69 67 28 72 65 67 69 73 74 72 79 2c 0d 0a  nfig(registry,..
2e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e220 66 72 61 6d 65 77 6f 72 6b 4c 69 73 74 2c 20 50  frameworkList, P
2e230 72 6f 63 65 73 73 44 62 50 72 6f 76 69 64 65 72  rocessDbProvider
2e240 46 61 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20  Factory,..      
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e260 20 20 20 20 20 20 20 20 20 20 49 6e 76 61 72 69            Invari
2e270 61 6e 74 4e 61 6d 65 2c 20 50 72 6f 76 69 64 65  antName, Provide
2e280 72 4e 61 6d 65 2c 20 44 65 73 63 72 69 70 74 69  rName, Descripti
2e290 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2b0 20 20 20 20 20 46 61 63 74 6f 72 79 54 79 70 65       FactoryType
2e2c0 4e 61 6d 65 2c 20 61 73 73 65 6d 62 6c 79 4e 61  Name, assemblyNa
2e2d0 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2f0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 44 61       directoryDa
2e300 74 61 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ta, configuratio
2e310 6e 2e 54 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67  n.ThrowOnMissing
2e320 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e340 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
2e350 2e 57 68 61 74 49 66 2c 20 63 6f 6e 66 69 67 75  .WhatIf, configu
2e360 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 0d  ration.Verbose,.
2e370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 20 72 65 66 20 73 61 76 65 64 2c 20 72 65 66 20   ref saved, ref 
2e3a0 65 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20  error))..       
2e3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 54 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73  TraceOps.ShowMes
2e3f0 73 61 67 65 28 54 72 61 63 65 50 72 69 6f 72 69  sage(TracePriori
2e400 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20  ty.Highest,..   
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e420 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62               deb
2e430 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63  ugCallback, trac
2e440 65 43 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 41  eCallback, thisA
2e450 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20  ssembly,..      
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c            error,
2e480 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 2c 20   traceCategory, 
2e490 4d 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e  MessageBoxButton
2e4a0 73 2e 4f 4b 2c 0d 0a 20 20 20 20 20 20 20 20 20  s.OK,..         
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4c0 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
2e4d0 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d  xIcon.Error);...
2e4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2e500 75 72 6e 20 31 3b 20 2f 2a 20 46 41 49 4c 55 52  urn 1; /* FAILUR
2e510 45 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20  E */..          
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
2e530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e540 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
2e550 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
2e560 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
2e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2e580 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e590 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e5a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e5b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
2e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5d0 20 23 72 65 67 69 6f 6e 20 56 53 20 50 61 63 6b   #region VS Pack
2e5e0 61 67 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  age..           
2e5f0 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2e600 66 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c  figuration.HasFl
2e610 61 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ags(..          
2e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e630 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 56    InstallFlags.V
2e640 73 50 61 63 6b 61 67 65 2c 20 74 72 75 65 29 29  sPackage, true))
2e650 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2e660 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 20 69 66 20 28 21 46 6f 72 45 61 63 68 56 73 56   if (!ForEachVsV
2e690 65 72 73 69 6f 6e 52 65 67 69 73 74 72 79 28 72  ersionRegistry(r
2e6a0 65 67 69 73 74 72 79 2c 0d 0a 20 20 20 20 20 20  egistry,..      
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 20 20 20 20 20 20 20 20 20 20 76 73 4c 69 73 74            vsList
2e6d0 2c 20 50 72 6f 63 65 73 73 56 73 50 61 63 6b 61  , ProcessVsPacka
2e6e0 67 65 2c 20 70 61 63 6b 61 67 65 2c 0d 0a 20 20  ge, package,..  
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
2e710 6c 65 4e 61 6d 65 44 61 74 61 2c 20 63 6f 6e 66  leNameData, conf
2e720 69 67 75 72 61 74 69 6f 6e 2e 54 68 72 6f 77 4f  iguration.ThrowO
2e730 6e 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20 20 20  nMissing,..     
2e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e750 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
2e760 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 2c  guration.WhatIf,
2e770 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 56   configuration.V
2e780 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72 72           ref err
2e7b0 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  or))..          
2e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
2e7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
2e7f0 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73 61 67  ceOps.ShowMessag
2e800 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e  e(TracePriority.
2e810 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20 20 20  Highest,..      
2e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e830 20 20 20 20 20 20 20 20 20 20 64 65 62 75 67 43            debugC
2e840 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65 43 61  allback, traceCa
2e850 6c 6c 62 61 63 6b 2c 20 74 68 69 73 41 73 73 65  llback, thisAsse
2e860 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  mbly,..         
2e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e880 20 20 20 20 20 20 20 65 72 72 6f 72 2c 20 74 72         error, tr
2e890 61 63 65 43 61 74 65 67 6f 72 79 2c 20 4d 65 73  aceCategory, Mes
2e8a0 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e 4f  sageBoxButtons.O
2e8b0 4b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  K,..            
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8d0 20 20 20 20 4d 65 73 73 61 67 65 42 6f 78 49 63      MessageBoxIc
2e8e0 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20  on.Error);....  
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e900 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2e910 20 31 3b 20 2f 2a 20 46 41 49 4c 55 52 45 20 2a   1; /* FAILURE *
2e920 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
2e930 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e950 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
2e960 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
2e970 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
2e980 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
2e990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e9a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e9b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e9c0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 72                #r
2e9e0 65 67 69 6f 6e 20 56 53 20 44 61 74 61 53 6f 75  egion VS DataSou
2e9f0 72 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  rce..           
2ea00 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2ea10 66 69 67 75 72 61 74 69 6f 6e 2e 48 61 73 46 6c  figuration.HasFl
2ea20 61 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ags(..          
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 56    InstallFlags.V
2ea50 73 44 61 74 61 53 6f 75 72 63 65 2c 20 74 72 75  sDataSource, tru
2ea60 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
2ea70 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea90 20 20 20 20 69 66 20 28 21 46 6f 72 45 61 63 68      if (!ForEach
2eaa0 56 73 56 65 72 73 69 6f 6e 52 65 67 69 73 74 72  VsVersionRegistr
2eab0 79 28 72 65 67 69 73 74 72 79 2c 0d 0a 20 20 20  y(registry,..   
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 73 4c               vsL
2eae0 69 73 74 2c 20 50 72 6f 63 65 73 73 56 73 44 61  ist, ProcessVsDa
2eaf0 74 61 53 6f 75 72 63 65 2c 20 70 61 63 6b 61 67  taSource, packag
2eb00 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 20 20 20 66 69 6c 65 4e 61 6d 65 44 61 74 61      fileNameData
2eb30 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  , configuration.
2eb40 54 68 72 6f 77 4f 6e 4d 69 73 73 69 6e 67 2c 0d  ThrowOnMissing,.
2eb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb70 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57   configuration.W
2eb80 68 61 74 49 66 2c 20 63 6f 6e 66 69 67 75 72 61  hatIf, configura
2eb90 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 0d 0a 20  tion.Verbose,.. 
2eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2ebc0 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20 20 20  ef error))..    
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebe0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
2ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec00 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68 6f 77     TraceOps.Show
2ec10 4d 65 73 73 61 67 65 28 54 72 61 63 65 50 72 69  Message(TracePri
2ec20 6f 72 69 74 79 2e 48 69 67 68 65 73 74 2c 0d 0a  ority.Highest,..
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec50 64 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74  debugCallback, t
2ec60 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 74 68  raceCallback, th
2ec70 69 73 41 73 73 65 6d 62 6c 79 2c 0d 0a 20 20 20  isAssembly,..   
2ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
2eca0 6f 72 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  or, traceCategor
2ecb0 79 2c 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74  y, MessageBoxBut
2ecc0 74 6f 6e 73 2e 4f 4b 2c 0d 0a 20 20 20 20 20 20  tons.OK,..      
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 4d 65 73 73 61 67            Messag
2ecf0 65 42 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b  eBoxIcon.Error);
2ed00 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed20 72 65 74 75 72 6e 20 31 3b 20 2f 2a 20 46 41 49  return 1; /* FAI
2ed30 4c 55 52 45 20 2a 2f 0d 0a 20 20 20 20 20 20 20  LURE */..       
2ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2ed60 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
2ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
2ed80 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2edb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2edc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2edd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edf0 20 20 20 20 23 72 65 67 69 6f 6e 20 56 53 20 44      #region VS D
2ee00 61 74 61 50 72 6f 76 69 64 65 72 0d 0a 20 20 20  ataProvider..   
2ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61 74 69   if (configurati
2ee30 6f 6e 2e 48 61 73 46 6c 61 67 73 28 0d 0a 20 20  on.HasFlags(..  
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee50 20 20 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c            Instal
2ee60 6c 46 6c 61 67 73 2e 56 73 44 61 74 61 50 72 6f  lFlags.VsDataPro
2ee70 76 69 64 65 72 2c 20 74 72 75 65 29 29 0d 0a 20  vider, true)).. 
2ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee90 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2eeb0 20 28 21 46 6f 72 45 61 63 68 56 73 56 65 72 73   (!ForEachVsVers
2eec0 69 6f 6e 52 65 67 69 73 74 72 79 28 72 65 67 69  ionRegistry(regi
2eed0 73 74 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  stry,..         
2eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eef0 20 20 20 20 20 20 20 76 73 4c 69 73 74 2c 20 50         vsList, P
2ef00 72 6f 63 65 73 73 56 73 44 61 74 61 50 72 6f 76  rocessVsDataProv
2ef10 69 64 65 72 2c 20 70 61 63 6b 61 67 65 2c 0d 0a  ider, package,..
2ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef40 66 69 6c 65 4e 61 6d 65 44 61 74 61 2c 20 63 6f  fileNameData, co
2ef50 6e 66 69 67 75 72 61 74 69 6f 6e 2e 54 68 72 6f  nfiguration.Thro
2ef60 77 4f 6e 4d 69 73 73 69 6e 67 2c 0d 0a 20 20 20  wOnMissing,..   
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2ef90 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49  figuration.WhatI
2efa0 66 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  f, configuration
2efb0 2e 56 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20  .Verbose,..     
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65             ref e
2efe0 72 72 6f 72 29 29 0d 0a 20 20 20 20 20 20 20 20  rror))..        
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
2f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
2f020 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73  raceOps.ShowMess
2f030 61 67 65 28 54 72 61 63 65 50 72 69 6f 72 69 74  age(TracePriorit
2f040 79 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20  y.Highest,..    
2f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f060 20 20 20 20 20 20 20 20 20 20 20 20 64 65 62 75              debu
2f070 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72 61 63 65  gCallback, trace
2f080 43 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 41 73  Callback, thisAs
2f090 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20  sembly,..       
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0b0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 20           error, 
2f0c0 74 72 61 63 65 43 61 74 65 67 6f 72 79 2c 20 4d  traceCategory, M
2f0d0 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73  essageBoxButtons
2f0e0 2e 4f 4b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  .OK,..          
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f100 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f 78        MessageBox
2f110 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a  Icon.Error);....
2f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f130 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2f140 72 6e 20 31 3b 20 2f 2a 20 46 41 49 4c 55 52 45  rn 1; /* FAILURE
2f150 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f180 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
2f190 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
2f1a0 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f               ///
2f1c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f1d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f1e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f1f0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
2f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f210 23 72 65 67 69 6f 6e 20 4c 6f 67 20 53 75 6d 6d  #region Log Summ
2f220 61 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ary..           
2f230 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
2f240 73 2e 44 65 62 75 67 41 6e 64 54 72 61 63 65 28  s.DebugAndTrace(
2f250 54 72 61 63 65 50 72 69 6f 72 69 74 79 2e 48 69  TracePriority.Hi
2f260 67 68 65 72 2c 0d 0a 20 20 20 20 20 20 20 20 20  gher,..         
2f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2f280 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72  ebugCallback, tr
2f290 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
2f2a0 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2c0 20 20 20 20 20 22 73 75 62 4b 65 79 73 43 72 65       "subKeysCre
2f2d0 61 74 65 64 20 3d 20 7b 30 7d 2c 20 73 75 62 4b  ated = {0}, subK
2f2e0 65 79 73 44 65 6c 65 74 65 64 20 3d 20 7b 31 7d  eysDeleted = {1}
2f2f0 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  , " +..         
2f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2f310 6b 65 79 56 61 6c 75 65 73 53 65 74 20 3d 20 7b  keyValuesSet = {
2f320 32 7d 2c 20 6b 65 79 56 61 6c 75 65 73 44 65 6c  2}, keyValuesDel
2f330 65 74 65 64 20 3d 20 7b 33 7d 22 2c 0d 0a 20 20  eted = {3}",..  
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
2f360 28 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e  (RegistryHelper.
2f370 53 75 62 4b 65 79 73 43 72 65 61 74 65 64 29 2c  SubKeysCreated),
2f380 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f390 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73            ForDis
2f3a0 70 6c 61 79 28 52 65 67 69 73 74 72 79 48 65 6c  play(RegistryHel
2f3b0 70 65 72 2e 53 75 62 4b 65 79 73 44 65 6c 65 74  per.SubKeysDelet
2f3c0 65 64 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ed),..          
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
2f3e0 72 44 69 73 70 6c 61 79 28 52 65 67 69 73 74 72  rDisplay(Registr
2f3f0 79 48 65 6c 70 65 72 2e 4b 65 79 56 61 6c 75 65  yHelper.KeyValue
2f400 73 53 65 74 29 2c 0d 0a 20 20 20 20 20 20 20 20  sSet),..        
2f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f420 46 6f 72 44 69 73 70 6c 61 79 28 52 65 67 69 73  ForDisplay(Regis
2f430 74 72 79 48 65 6c 70 65 72 2e 4b 65 79 56 61 6c  tryHelper.KeyVal
2f440 75 65 73 44 65 6c 65 74 65 64 29 29 2c 0d 0a 20  uesDeleted)),.. 
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
2f470 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20  gory);..        
2f480 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
2f490 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
2f4b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f4c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f4d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f4e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f500 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 53 55   return 0; /* SU
2f510 43 43 45 53 53 20 2a 2f 0d 0a 20 20 20 20 20 20  CCESS */..      
2f520 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2f530 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
2f540 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
2f550 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
2f560 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
2f570 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
2f580 65 4f 70 73 2e 44 65 62 75 67 41 6e 64 54 72 61  eOps.DebugAndTra
2f590 63 65 28 54 72 61 63 65 50 72 69 6f 72 69 74 79  ce(TracePriority
2f5a0 2e 48 69 67 68 65 73 74 2c 0d 0a 20 20 20 20 20  .Highest,..     
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2f5c0 65 62 75 67 43 61 6c 6c 62 61 63 6b 2c 20 74 72  ebugCallback, tr
2f5d0 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 65 2c 20  aceCallback, e, 
2f5e0 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
2f5f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
2f600 20 20 20 74 68 72 6f 77 3b 0d 0a 20 20 20 20 20     throw;..     
2f610 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2f620 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e    }..        #en
2f630 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20 7d 0d 0a  dregion..    }..
2f640 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
2f650 7d 0d 0a                                         }..