System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact dd4a5f9703d983b2109d4245f90be662688a1991:


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 77 68 61 74 49 66 2c 0d     bool whatIf,.
03a0: 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65  .        bool ve
03b0: 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20  rbose,..        
03c0: 72 65 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d  ref bool saved,.
03d0: 0a 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72  .        ref str
03e0: 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 29  ing error..    )
03f0: 3b 0d 0a 0d 0a 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  ;....    ///////
0400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0410: 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 69 6e 74 65  ////....    inte
0450: 72 6e 61 6c 20 64 65 6c 65 67 61 74 65 20 62 6f  rnal delegate bo
0460: 6f 6c 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69  ol FrameworkRegi
0470: 73 74 72 79 43 61 6c 6c 62 61 63 6b 28 0d 0a 20  stryCallback(.. 
0480: 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b         RegistryK
0490: 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20  ey rootKey,..   
04a0: 20 20 20 20 20 73 74 72 69 6e 67 20 66 72 61 6d       string fram
04b0: 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20  eworkName,..    
04c0: 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d      Version fram
04d0: 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
04e0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c         string pl
04f0: 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20  atformName,..   
0500: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
0510: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
0520: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
0530: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
0540: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
0550: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0560: 20 20 20 20 29 3b 0d 0a 0d 0a 20 20 20 20 2f 2f      );....    //
0570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
05b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
05c0: 20 69 6e 74 65 72 6e 61 6c 20 64 65 6c 65 67 61   internal delega
05d0: 74 65 20 62 6f 6f 6c 20 56 69 73 75 61 6c 53 74  te bool VisualSt
05e0: 75 64 69 6f 52 65 67 69 73 74 72 79 43 61 6c 6c  udioRegistryCall
05f0: 62 61 63 6b 28 0d 0a 20 20 20 20 20 20 20 20 52  back(..        R
0600: 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
0610: 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 65 72  ey,..        Ver
0620: 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
0630: 0a 20 20 20 20 20 20 20 20 47 75 69 64 20 70 61  .        Guid pa
0640: 63 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20 20  ckageId,..      
0650: 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49 64    Guid serviceId
0660: 2c 0d 0a 20 20 20 20 20 20 20 20 47 75 69 64 20  ,..        Guid 
0670: 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20  dataSourceId,.. 
0680: 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61         Guid data
0690: 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20  ProviderId,..   
06a0: 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
06b0: 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
06c0: 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
06d0: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
06e0: 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 72 65  ose,..        re
06f0: 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a  f string error..
0700: 20 20 20 20 29 3b 0d 0a 20 20 20 20 23 65 6e 64      );..    #end
0710: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 2f 2f  region....    //
0720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
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 0d 0a 0d 0a 20 20 20  /////////....   
0770: 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20   #region Public 
0780: 45 6e 75 6d 65 72 61 74 69 6f 6e 73 0d 0a 20 20  Enumerations..  
0790: 20 20 5b 46 6c 61 67 73 28 29 5d 0d 0a 20 20 20    [Flags()]..   
07a0: 20 70 75 62 6c 69 63 20 65 6e 75 6d 20 49 6e 73   public enum Ins
07b0: 74 61 6c 6c 46 6c 61 67 73 0d 0a 20 20 20 20 7b  tallFlags..    {
07c0: 0d 0a 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d  ..        None =
07d0: 20 30 78 30 2c 0d 0a 20 20 20 20 20 20 20 20 47   0x0,..        G
07e0: 41 43 20 3d 20 30 78 31 2c 0d 0a 20 20 20 20 20  AC = 0x1,..     
07f0: 20 20 20 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65     AssemblyFolde
0800: 72 73 20 3d 20 30 78 32 2c 0d 0a 20 20 20 20 20  rs = 0x2,..     
0810: 20 20 20 44 62 50 72 6f 76 69 64 65 72 46 61 63     DbProviderFac
0820: 74 6f 72 79 20 3d 20 30 78 34 2c 0d 0a 20 20 20  tory = 0x4,..   
0830: 20 20 20 20 20 56 73 50 61 63 6b 61 67 65 20 3d       VsPackage =
0840: 20 30 78 38 2c 0d 0a 20 20 20 20 20 20 20 20 56   0x8,..        V
0850: 73 44 61 74 61 53 6f 75 72 63 65 20 3d 20 30 78  sDataSource = 0x
0860: 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 44  10,..        VsD
0870: 61 74 61 50 72 6f 76 69 64 65 72 20 3d 20 30 78  ataProvider = 0x
0880: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 46 72 61  20,..        Fra
0890: 6d 65 77 6f 72 6b 20 3d 20 47 41 43 20 7c 20 41  mework = GAC | A
08a0: 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73 20 7c  ssemblyFolders |
08b0: 20 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f   DbProviderFacto
08c0: 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 56 73 20  ry,..        Vs 
08d0: 3d 20 56 73 50 61 63 6b 61 67 65 20 7c 20 56 73  = VsPackage | Vs
08e0: 44 61 74 61 53 6f 75 72 63 65 20 7c 20 56 73 44  DataSource | VsD
08f0: 61 74 61 50 72 6f 76 69 64 65 72 2c 0d 0a 20 20  ataProvider,..  
0900: 20 20 20 20 20 20 41 6c 6c 20 3d 20 46 72 61 6d        All = Fram
0910: 65 77 6f 72 6b 20 7c 20 56 73 2c 0d 0a 20 20 20  ework | Vs,..   
0920: 20 20 20 20 20 44 65 66 61 75 6c 74 20 3d 20 41       Default = A
0930: 6c 6c 0d 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23  ll..    }..    #
0940: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
0950: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
09a0: 20 20 20 20 23 72 65 67 69 6f 6e 20 49 6e 73 74      #region Inst
09b0: 61 6c 6c 65 72 20 43 6c 61 73 73 0d 0a 20 20 20  aller Class..   
09c0: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 69 63   internal static
09d0: 20 63 6c 61 73 73 20 49 6e 73 74 61 6c 6c 65 72   class Installer
09e0: 0d 0a 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20  ..    {..       
09f0: 20 23 72 65 67 69 6f 6e 20 41 6e 79 50 61 69 72   #region AnyPair
0a00: 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20 20   Class..        
0a10: 70 72 69 76 61 74 65 20 73 65 61 6c 65 64 20 63  private sealed c
0a20: 6c 61 73 73 20 41 6e 79 50 61 69 72 3c 54 31 2c  lass AnyPair<T1,
0a30: 20 54 32 3e 0d 0a 20 20 20 20 20 20 20 20 7b 0d   T2>..        {.
0a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
0a50: 67 69 6f 6e 20 50 75 62 6c 69 63 20 43 6f 6e 73  gion Public Cons
0a60: 74 72 75 63 74 6f 72 73 0d 0a 20 20 20 20 20 20  tructors..      
0a70: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
0a80: 20 20 20 20 20 20 2f 2f 20 57 41 52 4e 49 4e 47        // WARNING
0a90: 3a 20 54 68 69 73 20 63 6f 6e 73 74 72 75 63 74  : This construct
0aa0: 6f 72 20 70 72 6f 64 75 63 65 73 20 61 6e 20 69  or produces an i
0ab0: 6d 6d 75 74 61 62 6c 65 20 22 65 6d 70 74 79 22  mmutable "empty"
0ac0: 20 70 61 69 72 0d 0a 20 20 20 20 20 20 20 20 20   pair..         
0ad0: 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20 20 6f     //          o
0ae0: 62 6a 65 63 74 2e 0d 0a 20 20 20 20 20 20 20 20  bject...        
0af0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
0b00: 20 20 20 20 70 75 62 6c 69 63 20 41 6e 79 50 61      public AnyPa
0b10: 69 72 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ir()..          
0b20: 20 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d 0a        : base()..
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0b50: 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20  / do nothing... 
0b60: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
0b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
0bc0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ...            p
0bd0: 75 62 6c 69 63 20 41 6e 79 50 61 69 72 28 54 31  ublic AnyPair(T1
0be0: 20 78 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20   x)..           
0bf0: 20 20 20 20 20 3a 20 74 68 69 73 28 29 0d 0a 20       : this().. 
0c00: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
0c20: 69 73 2e 78 20 3d 20 78 3b 0d 0a 20 20 20 20 20  is.x = x;..     
0c30: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
0c40: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
0c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
0c90: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
0ca0: 63 20 41 6e 79 50 61 69 72 28 54 31 20 78 2c 20  c AnyPair(T1 x, 
0cb0: 54 32 20 79 29 0d 0a 20 20 20 20 20 20 20 20 20  T2 y)..         
0cc0: 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 78 29         : this(x)
0cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0cf0: 20 74 68 69 73 2e 79 20 3d 20 79 3b 0d 0a 20 20   this.y = y;..  
0d00: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
0d10: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
0d20: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
0d30: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
0d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d50: 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
0d80: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75        #region Pu
0d90: 62 6c 69 63 20 50 72 6f 70 65 72 74 69 65 73 0d  blic Properties.
0da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
0db0: 76 61 74 65 20 54 31 20 78 3b 0d 0a 20 20 20 20  vate T1 x;..    
0dc0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 54          public T
0dd0: 31 20 58 0d 0a 20 20 20 20 20 20 20 20 20 20 20  1 X..           
0de0: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
0df0: 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e      get { return
0e00: 20 78 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20   x; }..         
0e10: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
0e20: 20 20 20 20 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 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
0e70: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 54         private T
0e80: 32 20 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  2 y;..          
0e90: 20 20 70 75 62 6c 69 63 20 54 32 20 59 0d 0a 20    public T2 Y.. 
0ea0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65                ge
0ec0: 74 20 7b 20 72 65 74 75 72 6e 20 79 3b 20 7d 0d  t { return y; }.
0ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
0ef0: 72 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  region..        
0f00: 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72  }..        #endr
0f10: 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
0f20: 20 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 2f  ////////////////
0f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f60: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
0f70: 20 20 20 20 23 72 65 67 69 6f 6e 20 54 72 61 63      #region Trac
0f80: 65 4f 70 73 20 43 6c 61 73 73 0d 0a 20 20 20 20  eOps Class..    
0f90: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
0fa0: 69 63 20 63 6c 61 73 73 20 54 72 61 63 65 4f 70  ic class TraceOp
0fb0: 73 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  s..        {..  
0fc0: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
0fd0: 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73 74 61  n Private Consta
0fe0: 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  nts..           
0ff0: 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73   private const s
1000: 74 72 69 6e 67 20 49 73 6f 38 36 30 31 44 61 74  tring Iso8601Dat
1010: 65 54 69 6d 65 4f 75 74 70 75 74 46 6f 72 6d 61  eTimeOutputForma
1020: 74 20 3d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t =..           
1030: 20 20 20 20 20 22 79 79 79 79 2e 4d 4d 2e 64 64       "yyyy.MM.dd
1040: 54 48 48 3a 6d 6d 3a 73 73 2e 66 66 66 66 66 66  THH:mm:ss.ffffff
1050: 66 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  f";..           
1060: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
1070: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
1080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
10c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
10d0: 65 67 69 6f 6e 20 50 72 69 76 61 74 65 20 44 61  egion Private Da
10e0: 74 61 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta..            
10f0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 6f  private static o
1100: 62 6a 65 63 74 20 73 79 6e 63 52 6f 6f 74 20 3d  bject syncRoot =
1110: 20 6e 65 77 20 6f 62 6a 65 63 74 28 29 3b 0d 0a   new object();..
1120: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
1130: 61 74 65 20 73 74 61 74 69 63 20 6c 6f 6e 67 20  ate static long 
1140: 6e 65 78 74 49 64 3b 0d 0a 20 20 20 20 20 20 20  nextId;..       
1150: 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
1160: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
1170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11b0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
11c0: 20 20 23 72 65 67 69 6f 6e 20 49 6e 74 65 72 61    #region Intera
11d0: 63 74 69 76 65 20 53 75 70 70 6f 72 74 20 4d 65  ctive Support Me
11e0: 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20 20 20  thods..         
11f0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1200: 20 73 74 72 69 6e 67 20 47 65 74 41 73 73 65 6d   string GetAssem
1210: 62 6c 79 54 69 74 6c 65 28 0d 0a 20 20 20 20 20  blyTitle(..     
1220: 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d             Assem
1230: 62 6c 79 20 61 73 73 65 6d 62 6c 79 0d 0a 20 20  bly assembly..  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
1250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 69 66 20 28 61 73 73 65 6d 62 6c 79 20 21 3d 20  if (assembly != 
1280: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
1290: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
12b0: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
12c0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 69 66 20 28 61 73 73 65 6d 62 6c 79 2e 49    if (assembly.I
12f0: 73 44 65 66 69 6e 65 64 28 0d 0a 20 20 20 20 20  sDefined(..     
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 6f             typeo
1320: 66 28 41 73 73 65 6d 62 6c 79 54 69 74 6c 65 41  f(AssemblyTitleA
1330: 74 74 72 69 62 75 74 65 29 2c 20 66 61 6c 73 65  ttribute), false
1340: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
1350: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65 6d             Assem
1380: 62 6c 79 54 69 74 6c 65 41 74 74 72 69 62 75 74  blyTitleAttribut
1390: 65 20 74 69 74 6c 65 20 3d 0d 0a 20 20 20 20 20  e title =..     
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 20 20 28 41 73 73 65             (Asse
13c0: 6d 62 6c 79 54 69 74 6c 65 41 74 74 72 69 62 75  mblyTitleAttribu
13d0: 74 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  te)..           
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 61 73 73 65 6d 62 6c 79 2e 47 65       assembly.Ge
1400: 74 43 75 73 74 6f 6d 41 74 74 72 69 62 75 74 65  tCustomAttribute
1410: 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s(..            
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 74 79 70 65 6f 66 28 41          typeof(A
1440: 73 73 65 6d 62 6c 79 54 69 74 6c 65 41 74 74 72  ssemblyTitleAttr
1450: 69 62 75 74 65 29 2c 20 66 61 6c 73 65 29 5b 30  ibute), false)[0
1460: 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  ];....          
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 72 65 74 75 72 6e 20 74 69 74 6c 65 2e 54    return title.T
1490: 69 74 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  itle;..         
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
14b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14c0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
14e0: 63 68 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ch..            
14f0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67     // do nothing
1520: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1530: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
1540: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1560: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20  eturn null;..   
1570: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
1580: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
1590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
15d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
15e0: 6c 69 63 20 73 74 61 74 69 63 20 44 69 61 6c 6f  lic static Dialo
15f0: 67 52 65 73 75 6c 74 20 53 68 6f 77 4d 65 73 73  gResult ShowMess
1600: 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  age(..          
1610: 20 20 20 20 20 20 54 72 61 63 65 43 61 6c 6c 62        TraceCallb
1620: 61 63 6b 20 74 72 61 63 65 43 61 6c 6c 62 61 63  ack traceCallbac
1630: 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k,..            
1640: 20 20 20 20 41 73 73 65 6d 62 6c 79 20 61 73 73      Assembly ass
1650: 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20 20  embly,..        
1660: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6d          string m
1670: 65 73 73 61 67 65 2c 0d 0a 20 20 20 20 20 20 20  essage,..       
1680: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
1690: 63 61 74 65 67 6f 72 79 2c 0d 0a 20 20 20 20 20  category,..     
16a0: 20 20 20 20 20 20 20 20 20 20 20 4d 65 73 73 61             Messa
16b0: 67 65 42 6f 78 42 75 74 74 6f 6e 73 20 62 75 74  geBoxButtons but
16c0: 74 6f 6e 73 2c 0d 0a 20 20 20 20 20 20 20 20 20  tons,..         
16d0: 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
16e0: 78 49 63 6f 6e 20 69 63 6f 6e 0d 0a 20 20 20 20  xIcon icon..    
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
1700: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69                Di
1720: 61 6c 6f 67 52 65 73 75 6c 74 20 72 65 73 75 6c  alogResult resul
1730: 74 20 3d 20 44 69 61 6c 6f 67 52 65 73 75 6c 74  t = DialogResult
1740: 2e 4f 4b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  .OK;....        
1750: 20 20 20 20 20 20 20 20 54 72 61 63 65 28 74 72          Trace(tr
1760: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 6d 65 73  aceCallback, mes
1770: 73 61 67 65 2c 20 63 61 74 65 67 6f 72 79 29 3b  sage, category);
1780: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1790: 20 20 20 20 69 66 20 28 53 79 73 74 65 6d 49 6e      if (SystemIn
17a0: 66 6f 72 6d 61 74 69 6f 6e 2e 55 73 65 72 49 6e  formation.UserIn
17b0: 74 65 72 61 63 74 69 76 65 29 0d 0a 20 20 20 20  teractive)..    
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 20 20 73 74 72 69 6e 67 20 74 69 74 6c 65 20     string title 
17f0: 3d 20 47 65 74 41 73 73 65 6d 62 6c 79 54 69 74  = GetAssemblyTit
1800: 6c 65 28 61 73 73 65 6d 62 6c 79 29 3b 0d 0a 0d  le(assembly);...
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1820: 20 20 20 20 20 69 66 20 28 74 69 74 6c 65 20 3d       if (title =
1830: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 74 69 74 6c 65 20 3d 20 41 70 70 6c 69 63 61   title = Applica
1860: 74 69 6f 6e 2e 50 72 6f 64 75 63 74 4e 61 6d 65  tion.ProductName
1870: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1880: 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20           result 
1890: 3d 20 4d 65 73 73 61 67 65 42 6f 78 2e 53 68 6f  = MessageBox.Sho
18a0: 77 28 6d 65 73 73 61 67 65 2c 20 74 69 74 6c 65  w(message, title
18b0: 2c 20 62 75 74 74 6f 6e 73 2c 20 69 63 6f 6e 29  , buttons, icon)
18c0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
18d0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 28 74           Trace(t
18e0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
18f0: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 20 22 55 73 65 72 20 63 68 6f 69        "User choi
1920: 63 65 20 6f 66 20 5c 22 7b 30 7d 5c 22 2e 22 2c  ce of \"{0}\".",
1930: 20 72 65 73 75 6c 74 29 2c 20 63 61 74 65 67 6f   result), catego
1940: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
1950: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1960: 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20  rn result;..    
1970: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1990: 20 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c   Trace(traceCall
19a0: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
19b0: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
19c0: 20 20 20 20 20 20 20 20 20 20 22 44 65 66 61 75            "Defau
19d0: 6c 74 20 63 68 6f 69 63 65 20 6f 66 20 5c 22 7b  lt choice of \"{
19e0: 30 7d 5c 22 2e 22 2c 20 72 65 73 75 6c 74 29 2c  0}\".", result),
19f0: 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20   category);.... 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a10: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20  eturn result;.. 
1a20: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1a30: 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
1a40: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
1a50: 20 20 20 20 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 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a90: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1aa0: 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 54         #region T
1ab0: 72 61 63 69 6e 67 20 53 75 70 70 6f 72 74 20 4d  racing Support M
1ac0: 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20 20  ethods..        
1ad0: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
1ae0: 63 20 6c 6f 6e 67 20 4e 65 78 74 49 64 28 29 0d  c long NextId().
1af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 72 65 74 75 72 6e 20 49 6e 74 65 72 6c 6f 63 6b  return Interlock
1b20: 65 64 2e 49 6e 63 72 65 6d 65 6e 74 28 72 65 66  ed.Increment(ref
1b30: 20 6e 65 78 74 49 64 29 3b 0d 0a 20 20 20 20 20   nextId);..     
1b40: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1b50: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
1ba0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
1bb0: 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  c static string 
1bc0: 54 69 6d 65 53 74 61 6d 70 28 44 61 74 65 54 69  TimeStamp(DateTi
1bd0: 6d 65 20 64 61 74 65 54 69 6d 65 29 0d 0a 20 20  me dateTime)..  
1be0: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1c00: 75 72 6e 20 64 61 74 65 54 69 6d 65 2e 54 6f 53  urn dateTime.ToS
1c10: 74 72 69 6e 67 28 49 73 6f 38 36 30 31 44 61 74  tring(Iso8601Dat
1c20: 65 54 69 6d 65 4f 75 74 70 75 74 46 6f 72 6d 61  eTimeOutputForma
1c30: 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
1c40: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1c50: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c90: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1ca0: 20 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c       [MethodImpl
1cb0: 28 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f  (MethodImplOptio
1cc0: 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d  ns.NoInlining)].
1cd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
1ce0: 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69  vate static stri
1cf0: 6e 67 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d 65  ng GetMethodName
1d00: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1d10: 20 20 20 53 74 61 63 6b 54 72 61 63 65 20 73 74     StackTrace st
1d20: 61 63 6b 54 72 61 63 65 2c 0d 0a 20 20 20 20 20  ackTrace,..     
1d30: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6c             int l
1d40: 65 76 65 6c 0d 0a 20 20 20 20 20 20 20 20 20 20  evel..          
1d50: 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1d60: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1d70: 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20          try..   
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
1dc0: 4f 54 45 3a 20 49 66 20 61 20 76 61 6c 69 64 20  OTE: If a valid 
1dd0: 73 74 61 63 6b 20 74 72 61 63 65 20 77 61 73 20  stack trace was 
1de0: 6e 6f 74 20 73 75 70 70 6c 69 65 64 20 62 79 20  not supplied by 
1df0: 74 68 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  the..           
1e00: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
1e10: 20 20 63 61 6c 6c 65 72 2c 20 63 72 65 61 74 65    caller, create
1e20: 20 6f 6e 65 20 6e 6f 77 20 62 61 73 65 64 20 6f   one now based o
1e30: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0d 0a 20  n the current.. 
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 2f 2f 20 20 20 20 20 20 20 65 78 65 63     //       exec
1e60: 75 74 69 6f 6e 20 73 74 61 63 6b 2e 0d 0a 20 20  ution stack...  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1e90: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
1ea0: 61 63 6b 54 72 61 63 65 20 3d 3d 20 6e 75 6c 6c  ackTrace == null
1eb0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1ec0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
1f00: 20 4e 4f 54 45 3a 20 47 72 61 62 20 74 68 65 20   NOTE: Grab the 
1f10: 63 75 72 72 65 6e 74 20 65 78 65 63 75 74 69 6f  current executio
1f20: 6e 20 73 74 61 63 6b 2e 0d 0a 20 20 20 20 20 20  n stack...      
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1f60: 61 63 6b 54 72 61 63 65 20 3d 20 6e 65 77 20 53  ackTrace = new S
1f70: 74 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a 0d 0a  tackTrace();....
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c 77      // NOTE: Alw
1fc0: 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 63 61  ays skip this ca
1fd0: 6c 6c 20 66 72 61 6d 65 20 77 68 65 6e 20 77 65  ll frame when we
1fe0: 20 63 61 70 74 75 72 65 0d 0a 20 20 20 20 20 20   capture..      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 2f 2f 20 20 20 20 20 20 20 74 68 65 20 73    //       the s
2010: 74 61 63 6b 20 74 72 61 63 65 2e 0d 0a 20 20 20  tack trace...   
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 6c 65 76 65 6c 2b 2b 3b 0d 0a 20 20 20 20 20   level++;..     
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2070: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2080: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 2f 2f 20 4e 4f 54 45 3a 20 47 65 74 20 74 68 65  // NOTE: Get the
20b0: 20 73 70 65 63 69 66 69 65 64 20 73 74 61 63 6b   specified stack
20c0: 20 66 72 61 6d 65 20 28 61 6c 77 61 79 73 20 61   frame (always a
20d0: 64 64 20 6f 6e 65 20 74 6f 0d 0a 20 20 20 20 20  dd one to..     
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f0: 2f 20 20 20 20 20 20 20 73 6b 69 70 20 74 68 69  /       skip thi
2100: 73 20 6d 65 74 68 6f 64 29 2e 0d 0a 20 20 20 20  s method)...    
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
2130: 20 20 20 20 20 20 20 20 53 74 61 63 6b 46 72 61          StackFra
2140: 6d 65 20 73 74 61 63 6b 46 72 61 6d 65 20 3d 20  me stackFrame = 
2150: 73 74 61 63 6b 54 72 61 63 65 2e 47 65 74 46 72  stackTrace.GetFr
2160: 61 6d 65 28 6c 65 76 65 6c 29 3b 0d 0a 0d 0a 20  ame(level);.... 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
2190: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
21a0: 54 45 3a 20 47 65 74 20 74 68 65 20 6d 65 74 68  TE: Get the meth
21b0: 6f 64 20 66 6f 72 20 74 68 65 20 73 74 61 63 6b  od for the stack
21c0: 20 66 72 61 6d 65 2e 0d 0a 20 20 20 20 20 20 20   frame...       
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
21e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f0: 20 20 20 20 20 4d 65 74 68 6f 64 42 61 73 65 20       MethodBase 
2200: 6d 65 74 68 6f 64 42 61 73 65 20 3d 20 73 74 61  methodBase = sta
2210: 63 6b 46 72 61 6d 65 2e 47 65 74 4d 65 74 68 6f  ckFrame.GetMetho
2220: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d();....        
2230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 65 74      // NOTE: Get
2260: 20 74 68 65 20 74 79 70 65 20 66 6f 72 20 74 68   the type for th
2270: 65 20 6d 65 74 68 6f 64 2e 0d 0a 20 20 20 20 20  e method...     
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
22a0: 20 20 20 20 20 20 20 54 79 70 65 20 74 79 70 65         Type type
22b0: 20 3d 20 6d 65 74 68 6f 64 42 61 73 65 2e 44 65   = methodBase.De
22c0: 63 6c 61 72 69 6e 67 54 79 70 65 3b 0d 0a 0d 0a  claringType;....
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
2300: 4f 54 45 3a 20 47 65 74 20 74 68 65 20 6e 61 6d  OTE: Get the nam
2310: 65 20 6f 66 20 74 68 65 20 6d 65 74 68 6f 64 2e  e of the method.
2320: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2330: 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2350: 72 69 6e 67 20 6e 61 6d 65 20 3d 20 6d 65 74 68  ring name = meth
2360: 6f 64 42 61 73 65 2e 4e 61 6d 65 3b 0d 0a 0d 0a  odBase.Name;....
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
2390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e              // N
23a0: 4f 54 45 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OTE: Return the 
23b0: 70 72 6f 70 65 72 6c 79 20 66 6f 72 6d 61 74 74  properly formatt
23c0: 65 64 20 72 65 73 75 6c 74 2e 0d 0a 20 20 20 20  ed result...    
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
23f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2400: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 22 7b 30 7d 7b 31 7d 7b 32         "{0}{1}{2
2430: 7d 22 2c 20 74 79 70 65 2e 4e 61 6d 65 2c 20 54  }", type.Name, T
2440: 79 70 65 2e 44 65 6c 69 6d 69 74 65 72 2c 20 6e  ype.Delimiter, n
2450: 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ame);..         
2460: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
2470: 20 20 20 20 20 20 20 20 20 20 63 61 74 63 68 0d            catch.
2480: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2490: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
24a0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
24b0: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
24c0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
24e0: 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  urn null;..     
24f0: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
2500: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
2510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
2550: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
2560: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 54 72  c static void Tr
2570: 61 63 65 43 6f 72 65 28 0d 0a 20 20 20 20 20 20  aceCore(..      
2580: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
2590: 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20 20 20 20   message,..     
25a0: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
25b0: 67 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20  g category..    
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
25d0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
25f0: 63 6b 20 28 73 79 6e 63 52 6f 6f 74 29 0d 0a 20  ck (syncRoot).. 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2610: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2620: 20 20 20 20 20 20 53 79 73 74 65 6d 2e 44 69 61        System.Dia
2630: 67 6e 6f 73 74 69 63 73 2e 54 72 61 63 65 2e 57  gnostics.Trace.W
2640: 72 69 74 65 4c 69 6e 65 28 6d 65 73 73 61 67 65  riteLine(message
2650: 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20  , category);..  
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73    System.Diagnos
2680: 74 69 63 73 2e 54 72 61 63 65 2e 46 6c 75 73 68  tics.Trace.Flush
2690: 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ();..           
26a0: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
26b0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
26c0: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
26d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2700: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
2710: 20 20 20 20 20 20 20 20 5b 4d 65 74 68 6f 64 49          [MethodI
2720: 6d 70 6c 28 4d 65 74 68 6f 64 49 6d 70 6c 4f 70  mpl(MethodImplOp
2730: 74 69 6f 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67  tions.NoInlining
2740: 29 5d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )]..            
2750: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 73 74  public static st
2760: 72 69 6e 67 20 54 72 61 63 65 28 0d 0a 20 20 20  ring Trace(..   
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
2780: 63 65 43 61 6c 6c 62 61 63 6b 20 74 72 61 63 65  ceCallback trace
2790: 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20  Callback,..     
27a0: 20 20 20 20 20 20 20 20 20 20 20 45 78 63 65 70             Excep
27b0: 74 69 6f 6e 20 65 78 63 65 70 74 69 6f 6e 2c 0d  tion exception,.
27c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27d0: 20 73 74 72 69 6e 67 20 63 61 74 65 67 6f 72 79   string category
27e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
27f0: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
2800: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
2810: 20 20 20 20 69 66 20 28 65 78 63 65 70 74 69 6f      if (exceptio
2820: 6e 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  n != null)..    
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2840: 72 65 74 75 72 6e 20 54 72 61 63 65 28 74 72 61  return Trace(tra
2850: 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  ceCallback,..   
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 6e 65 77 20 53 74 61 63 6b 54 72       new StackTr
2880: 61 63 65 28 65 78 63 65 70 74 69 6f 6e 2c 20 74  ace(exception, t
2890: 72 75 65 29 2c 20 30 2c 0d 0a 20 20 20 20 20 20  rue), 0,..      
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 65 78 63 65 70 74 69 6f 6e 2e 54 6f 53 74    exception.ToSt
28c0: 72 69 6e 67 28 29 2c 20 63 61 74 65 67 6f 72 79  ring(), category
28d0: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
28e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
28f0: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
2900: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
2910: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2950: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
2960: 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c 28      [MethodImpl(
2970: 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f 6e  MethodImplOption
2980: 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d 0a  s.NoInlining)]..
2990: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
29a0: 69 63 20 73 74 61 74 69 63 20 73 74 72 69 6e 67  ic static string
29b0: 20 54 72 61 63 65 28 0d 0a 20 20 20 20 20 20 20   Trace(..       
29c0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 43 61           TraceCa
29d0: 6c 6c 62 61 63 6b 20 74 72 61 63 65 43 61 6c 6c  llback traceCall
29e0: 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20  back,..         
29f0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6d 65         string me
2a00: 73 73 61 67 65 2c 0d 0a 20 20 20 20 20 20 20 20  ssage,..        
2a10: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 63          string c
2a20: 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20 20 20  ategory..       
2a30: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
2a40: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
2a50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2a60: 6e 20 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  n Trace(traceCal
2a70: 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 31 2c 20  lback, null, 1, 
2a80: 6d 65 73 73 61 67 65 2c 20 63 61 74 65 67 6f 72  message, categor
2a90: 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y);..           
2aa0: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
2ab0: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
2ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2af0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
2b00: 20 20 20 20 20 5b 4d 65 74 68 6f 64 49 6d 70 6c       [MethodImpl
2b10: 28 4d 65 74 68 6f 64 49 6d 70 6c 4f 70 74 69 6f  (MethodImplOptio
2b20: 6e 73 2e 4e 6f 49 6e 6c 69 6e 69 6e 67 29 5d 0d  ns.NoInlining)].
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
2b40: 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69  vate static stri
2b50: 6e 67 20 54 72 61 63 65 28 0d 0a 20 20 20 20 20  ng Trace(..     
2b60: 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
2b70: 43 61 6c 6c 62 61 63 6b 20 74 72 61 63 65 43 61  Callback traceCa
2b80: 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20  llback,..       
2b90: 20 20 20 20 20 20 20 20 20 53 74 61 63 6b 54 72           StackTr
2ba0: 61 63 65 20 73 74 61 63 6b 54 72 61 63 65 2c 0d  ace stackTrace,.
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc0: 20 69 6e 74 20 6c 65 76 65 6c 2c 0d 0a 20 20 20   int level,..   
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2be0: 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20  ing message,..  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2c00: 72 69 6e 67 20 63 61 74 65 67 6f 72 79 0d 0a 20  ring category.. 
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
2c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
2c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c40: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
2c50: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c       // NOTE: Al
2c60: 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 63  ways skip this c
2c70: 61 6c 6c 20 66 72 61 6d 65 20 69 66 20 74 68 65  all frame if the
2c80: 20 73 74 61 63 6b 20 74 72 61 63 65 20 69 73 0d   stack trace is.
2c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca0: 20 2f 2f 20 20 20 20 20 20 20 67 6f 69 6e 67 20   //       going 
2cb0: 74 6f 20 62 65 20 63 61 70 74 75 72 65 64 20 62  to be captured b
2cc0: 79 20 47 65 74 4d 65 74 68 6f 64 4e 61 6d 65 2e  y GetMethodName.
2cd0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ce0: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
2cf0: 20 20 20 20 20 20 69 66 20 28 73 74 61 63 6b 54        if (stackT
2d00: 72 61 63 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  race == null).. 
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 20 6c 65 76 65 6c 2b 2b 3b 0d 0a 0d 0a 20     level++;.... 
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2d40: 66 20 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  f (traceCallback
2d50: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2d70: 72 61 63 65 43 61 6c 6c 62 61 63 6b 20 3d 20 54  raceCallback = T
2d80: 72 61 63 65 43 6f 72 65 3b 0d 0a 0d 0a 20 20 20  raceCore;....   
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
2da0: 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e  ceCallback(Strin
2db0: 67 2e 46 6f 72 6d 61 74 28 22 7b 30 7d 3a 20 7b  g.Format("{0}: {
2dc0: 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
2dd0: 20 20 20 20 20 20 20 20 20 20 47 65 74 4d 65 74            GetMet
2de0: 68 6f 64 4e 61 6d 65 28 73 74 61 63 6b 54 72 61  hodName(stackTra
2df0: 63 65 2c 20 6c 65 76 65 6c 29 2c 20 6d 65 73 73  ce, level), mess
2e00: 61 67 65 29 2c 20 63 61 74 65 67 6f 72 79 29 3b  age), category);
2e10: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2e20: 20 20 20 20 72 65 74 75 72 6e 20 6d 65 73 73 61      return messa
2e30: 67 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ge;..           
2e40: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
2e50: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20 20 20  #endregion..    
2e60: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 23      }..        #
2e70: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
2e80: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
2e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
2ed0: 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
2ee0: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
2ef0: 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20 20 70  Class..        p
2f00: 72 69 76 61 74 65 20 73 65 61 6c 65 64 20 63 6c  rivate sealed cl
2f10: 61 73 73 20 4d 6f 63 6b 52 65 67 69 73 74 72 79  ass MockRegistry
2f20: 4b 65 79 20 3a 20 49 44 69 73 70 6f 73 61 62 6c  Key : IDisposabl
2f30: 65 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  e..        {..  
2f40: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
2f50: 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73 74 72  n Private Constr
2f60: 75 63 74 6f 72 73 0d 0a 20 20 20 20 20 20 20 20  uctors..        
2f70: 20 20 20 20 70 72 69 76 61 74 65 20 4d 6f 63 6b      private Mock
2f80: 52 65 67 69 73 74 72 79 4b 65 79 28 29 0d 0a 20  RegistryKey().. 
2f90: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
2fb0: 61 74 49 66 20 3d 20 74 72 75 65 3b 0d 0a 20 20  atIf = true;..  
2fc0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
2fd0: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
2fe0: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
2ff0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
3000: 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
3040: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 50 75        #region Pu
3050: 62 6c 69 63 20 43 6f 6e 73 74 72 75 63 74 6f 72  blic Constructor
3060: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
3070: 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73 74  ublic MockRegist
3080: 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ryKey(..        
3090: 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
30a0: 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20 20 20  Key key..       
30b0: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 74 68              : th
30d0: 69 73 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  is()..          
30e0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
30f0: 20 20 20 20 20 74 68 69 73 2e 6b 65 79 20 3d 20       this.key = 
3100: 6b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  key;..          
3110: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
3120: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
3130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3160: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
3170: 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d 6f 63        public Moc
3180: 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20  kRegistryKey(.. 
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
31a0: 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d  egistryKey key,.
31b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31c0: 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61   string subKeyNa
31d0: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
31e0: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
31f0: 20 20 20 20 20 20 20 3a 20 74 68 69 73 28 6b 65         : this(ke
3200: 79 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y)..            
3210: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
3220: 20 20 20 74 68 69 73 2e 73 75 62 4b 65 79 4e 61     this.subKeyNa
3230: 6d 65 20 3d 20 73 75 62 4b 65 79 4e 61 6d 65 3b  me = subKeyName;
3240: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
3250: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
3260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32a0: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
32b0: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67    public MockReg
32c0: 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20  istryKey(..     
32d0: 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
32e0: 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20  tryKey key,..   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
3300: 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c 0d  ing subKeyName,.
3310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3320: 20 62 6f 6f 6c 20 77 68 61 74 49 66 0d 0a 20 20   bool whatIf..  
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
3340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3350: 20 3a 20 74 68 69 73 28 6b 65 79 2c 20 73 75 62   : this(key, sub
3360: 4b 65 79 4e 61 6d 65 29 0d 0a 20 20 20 20 20 20  KeyName)..      
3370: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
3380: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 77 68           this.wh
3390: 61 74 49 66 20 3d 20 77 68 61 74 49 66 3b 0d 0a  atIf = whatIf;..
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
33b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
33c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3400: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
3410: 70 75 62 6c 69 63 20 4d 6f 63 6b 52 65 67 69 73  public MockRegis
3420: 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  tryKey(..       
3430: 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
3440: 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20 20  yKey key,..     
3450: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
3460: 77 68 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20  whatIf..        
3470: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
3480: 20 20 20 20 20 20 20 20 20 20 20 3a 20 74 68 69             : thi
3490: 73 28 6b 65 79 2c 20 6e 75 6c 6c 2c 20 77 68 61  s(key, null, wha
34a0: 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf)..          
34b0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
34c0: 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68 69       // do nothi
34d0: 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng...           
34e0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
34f0: 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20  #endregion....  
3500: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
3510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
3550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65  .            #re
3560: 67 69 6f 6e 20 50 75 62 6c 69 63 20 4d 65 74 68  gion Public Meth
3570: 6f 64 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ods..           
3580: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 43 6c 6f   public void Clo
3590: 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se()..          
35a0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
35b0: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
35c0: 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
35d0: 3a 20 4e 6f 20 64 69 73 70 6f 73 65 64 20 63 68  : No disposed ch
35e0: 65 63 6b 20 68 65 72 65 20 62 65 63 61 75 73 65  eck here because
35f0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 6d 65   calling this me
3600: 74 68 6f 64 0d 0a 20 20 20 20 20 20 20 20 20 20  thod..          
3610: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 73        //       s
3620: 68 6f 75 6c 64 20 62 65 20 6a 75 73 74 20 6c 69  hould be just li
3630: 6b 65 20 63 61 6c 6c 69 6e 67 20 44 69 73 70 6f  ke calling Dispo
3640: 73 65 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se...           
3650: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
3660: 20 20 20 20 20 20 20 20 20 44 69 73 70 6f 73 65           Dispose
3670: 28 74 72 75 65 29 3b 0d 0a 20 20 20 20 20 20 20  (true);..       
3680: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
3690: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
36a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
36b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
36c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
36d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
36e0: 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
36f0: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
3700: 43 72 65 61 74 65 53 75 62 4b 65 79 28 0d 0a 20  CreateSubKey(.. 
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3720: 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65  tring subKeyName
3730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3740: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
3750: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
3760: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
3770: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d();....        
3780: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
3790: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
37b0: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
37d0: 20 28 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20   (whatIf)..     
37e0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20    //..          
3810: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 48 41 43            // HAC
3820: 4b 3a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70  K: Attempt to op
3830: 65 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  en the specified
3840: 20 73 75 62 2d 6b 65 79 2e 20 20 49 66 20 74 68   sub-key.  If th
3850: 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  is..            
3860: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
3870: 20 66 61 69 6c 73 2c 20 77 65 20 77 69 6c 6c 20   fails, we will 
3880: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
3890: 65 20 77 72 61 70 70 65 64 20 72 6f 6f 74 20 6b  e wrapped root k
38a0: 65 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey..            
38b0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
38c0: 20 69 74 73 65 6c 66 20 73 69 6e 63 65 20 6e 6f   itself since no
38d0: 20 77 72 69 74 65 73 20 61 72 65 20 61 6c 6c 6f   writes are allo
38e0: 77 65 64 20 69 6e 20 27 77 68 61 74 2d 69 66 27  wed in 'what-if'
38f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3900: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6d        //       m
3910: 6f 64 65 20 61 6e 79 68 6f 77 2e 0d 0a 20 20 20  ode anyhow...   
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
3940: 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
3950: 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 6b 65  yKey subKey = ke
3960: 79 2e 4f 70 65 6e 53 75 62 4b 65 79 28 73 75 62  y.OpenSubKey(sub
3970: 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  KeyName);....   
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 72 65 74 75 72 6e 20 28 73 75 62 4b 65 79 20   return (subKey 
39a0: 21 3d 20 6e 75 6c 6c 29 20 3f 0d 0a 20 20 20 20  != null) ?..    
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69      new MockRegi
39d0: 73 74 72 79 4b 65 79 28 73 75 62 4b 65 79 29 20  stryKey(subKey) 
39e0: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
39f0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 4d             new M
3a00: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 28 6b  ockRegistryKey(k
3a10: 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29 3b  ey, subKeyName);
3a20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3a30: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
3a40: 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
3a50: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 4d 6f 63    return new Moc
3a80: 6b 52 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20  kRegistryKey(.. 
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 20 20 6b 65 79 2e 43 72 65 61 74         key.Creat
3ab0: 65 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61  eSubKey(subKeyNa
3ac0: 6d 65 29 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20  me), false);..  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
3ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
3af0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
3b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b40: 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
3b50: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 44 65 6c   public void Del
3b60: 65 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  eteSubKey(..    
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
3b80: 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20  ng subKeyName.. 
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
3ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
3bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3bc0: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
3bd0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
3be0: 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20       if (key == 
3bf0: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
3c00: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3c10: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n;....          
3c20: 20 20 20 20 20 20 69 66 20 28 21 77 68 61 74 49        if (!whatI
3c30: 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f)..            
3c40: 20 20 20 20 20 20 20 20 6b 65 79 2e 44 65 6c 65          key.Dele
3c50: 74 65 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e  teSubKey(subKeyN
3c60: 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ame);..         
3c70: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
3c80: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
3c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3cc0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
3cd0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
3ce0: 69 64 20 44 65 6c 65 74 65 53 75 62 4b 65 79 54  id DeleteSubKeyT
3cf0: 72 65 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ree(..          
3d00: 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75 62        string sub
3d10: 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20  KeyName..       
3d20: 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
3d30: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
3d40: 20 20 20 20 20 20 20 20 20 20 20 43 68 65 63 6b             Check
3d50: 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a 0d 0a 20  Disposed();.... 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
3d70: 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  f (key == null).
3d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d90: 20 20 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a       return;....
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20  if (!whatIf)..  
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 6b 65 79 2e 44 65 6c 65 74 65 53 75 62 4b    key.DeleteSubK
3de0: 65 79 54 72 65 65 28 73 75 62 4b 65 79 4e 61 6d  eyTree(subKeyNam
3df0: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
3e00: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
3e10: 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
3e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e50: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
3e60: 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64       public void
3e70: 20 44 65 6c 65 74 65 56 61 6c 75 65 28 0d 0a 20   DeleteValue(.. 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3e90: 74 72 69 6e 67 20 6e 61 6d 65 0d 0a 20 20 20 20  tring name..    
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
3eb0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
3ed0: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
3ee0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3ef0: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
3f00: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
3f10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0d          return;.
3f20: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
3f30: 20 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d     if (!whatIf).
3f40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3f50: 20 20 20 20 20 6b 65 79 2e 44 65 6c 65 74 65 56       key.DeleteV
3f60: 61 6c 75 65 28 6e 61 6d 65 29 3b 0d 0a 20 20 20  alue(name);..   
3f70: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
3f80: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
3f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
3fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
3fe0: 6c 69 63 20 73 74 72 69 6e 67 5b 5d 20 47 65 74  lic string[] Get
3ff0: 53 75 62 4b 65 79 4e 61 6d 65 73 28 29 0d 0a 20  SubKeyNames().. 
4000: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 68                Ch
4020: 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d 0a  eckDisposed();..
4030: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4040: 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
4050: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
4060: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
4070: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
4080: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6b          return k
4090: 65 79 2e 47 65 74 53 75 62 4b 65 79 4e 61 6d 65  ey.GetSubKeyName
40a0: 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  s();..          
40b0: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
40c0: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
40d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
40e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
40f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4100: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
4110: 20 20 20 20 20 20 70 75 62 6c 69 63 20 6f 62 6a        public obj
4120: 65 63 74 20 47 65 74 56 61 6c 75 65 28 0d 0a 20  ect GetValue(.. 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4140: 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20  tring name,..   
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a               obj
4160: 65 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75 65  ect defaultValue
4170: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4180: 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20    )..           
4190: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
41a0: 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73 65      CheckDispose
41b0: 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d();....        
41c0: 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
41d0: 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
41f0: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
4210: 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c 75  turn key.GetValu
4220: 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74 56  e(name, defaultV
4230: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
4240: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
4250: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
4260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4290: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
42a0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 4d          public M
42b0: 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 4f  ockRegistryKey O
42c0: 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
42e0: 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 0d 0a 20  ng subKeyName.. 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
4300: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
4310: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4320: 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29   CheckDisposed()
4330: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
4340: 20 20 20 20 20 72 65 74 75 72 6e 20 4f 70 65 6e       return Open
4350: 53 75 62 4b 65 79 28 73 75 62 4b 65 79 4e 61 6d  SubKey(subKeyNam
4360: 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20 20 20  e, false);..    
4370: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4380: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
4390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
43a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
43b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
43c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
43d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
43e0: 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  ic MockRegistryK
43f0: 65 79 20 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a  ey OpenSubKey(..
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 73 74 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d  string subKeyNam
4420: 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
4430: 20 20 20 20 62 6f 6f 6c 20 77 72 69 74 61 62 6c      bool writabl
4440: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4450: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
4460: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
4470: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
4480: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
4490: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
44a0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
44c0: 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20  eturn null;.... 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52                 R
44e0: 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65  egistryKey subKe
44f0: 79 20 3d 20 6b 65 79 2e 4f 70 65 6e 53 75 62 4b  y = key.OpenSubK
4500: 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
4510: 20 20 20 20 20 20 20 20 20 73 75 62 4b 65 79 4e           subKeyN
4520: 61 6d 65 2c 20 77 68 61 74 49 66 20 3f 20 66 61  ame, whatIf ? fa
4530: 6c 73 65 20 3a 20 77 72 69 74 61 62 6c 65 29 3b  lse : writable);
4540: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4550: 20 20 20 20 72 65 74 75 72 6e 20 28 73 75 62 4b      return (subK
4560: 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f 0d 0a 20  ey != null) ?.. 
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73     new MockRegis
4590: 74 72 79 4b 65 79 28 73 75 62 4b 65 79 2c 20 77  tryKey(subKey, w
45a0: 68 61 74 49 66 29 20 3a 20 6e 75 6c 6c 3b 0d 0a  hatIf) : null;..
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
45c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
45d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
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: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4620: 70 75 62 6c 69 63 20 76 6f 69 64 20 53 65 74 56  public void SetV
4630: 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20  alue(..         
4640: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6e 61         string na
4650: 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
4660: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
4670: 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e..             
4680: 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20     )..          
4690: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
46a0: 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f 73       CheckDispos
46b0: 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ed();....       
46c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
46d0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
46f0: 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20  eturn;....      
4700: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
4710: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
4720: 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e              key.
4730: 53 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 76  SetValue(name, v
4740: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
4750: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4760: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
4770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 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 2f 2f 2f 2f  ////////////////
47b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47c0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
47d0: 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50  #region Public P
47e0: 72 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20  roperties..     
47f0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
4800: 72 69 6e 67 20 4e 61 6d 65 0d 0a 20 20 20 20 20  ring Name..     
4810: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
4820: 20 20 20 20 20 20 20 20 20 20 67 65 74 0d 0a 20            get.. 
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4840: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4850: 20 20 20 20 20 20 43 68 65 63 6b 44 69 73 70 6f        CheckDispo
4860: 73 65 64 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sed();....      
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4880: 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
48b0: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
48d0: 72 6e 20 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c  rn !String.IsNul
48e0: 6c 4f 72 45 6d 70 74 79 28 73 75 62 4b 65 79 4e  lOrEmpty(subKeyN
48f0: 61 6d 65 29 20 3f 0d 0a 20 20 20 20 20 20 20 20  ame) ?..        
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 7b  String.Format("{
4920: 30 7d 5c 5c 7b 31 7d 22 2c 20 6b 65 79 2e 4e 61  0}\\{1}", key.Na
4930: 6d 65 2c 20 73 75 62 4b 65 79 4e 61 6d 65 29 20  me, subKeyName) 
4940: 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
4950: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 4e             key.N
4960: 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
4970: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
4980: 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
4990: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20  /////////....   
49e0: 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65           private
49f0: 20 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79   RegistryKey key
4a00: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
4a10: 75 62 6c 69 63 20 52 65 67 69 73 74 72 79 4b 65  ublic RegistryKe
4a20: 79 20 4b 65 79 0d 0a 20 20 20 20 20 20 20 20 20  y Key..         
4a30: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
4a40: 20 20 20 20 20 20 67 65 74 20 7b 20 43 68 65 63        get { Chec
4a50: 6b 44 69 73 70 6f 73 65 64 28 29 3b 20 72 65 74  kDisposed(); ret
4a60: 75 72 6e 20 6b 65 79 3b 20 7d 0d 0a 20 20 20 20  urn key; }..    
4a70: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
4a80: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
4a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
4ae0: 61 74 65 20 73 74 72 69 6e 67 20 73 75 62 4b 65  ate string subKe
4af0: 79 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20  yName;..        
4b00: 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e      public strin
4b10: 67 20 53 75 62 4b 65 79 4e 61 6d 65 0d 0a 20 20  g SubKeyName..  
4b20: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
4b40: 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73 65 64   { CheckDisposed
4b50: 28 29 3b 20 72 65 74 75 72 6e 20 73 75 62 4b 65  (); return subKe
4b60: 79 4e 61 6d 65 3b 20 7d 0d 0a 20 20 20 20 20 20  yName; }..      
4b70: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
4b80: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
4b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
4bd0: 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
4be0: 65 20 62 6f 6f 6c 20 77 68 61 74 49 66 3b 0d 0a  e bool whatIf;..
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
4c00: 69 63 20 62 6f 6f 6c 20 57 68 61 74 49 66 0d 0a  ic bool WhatIf..
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
4c30: 65 74 20 7b 20 43 68 65 63 6b 44 69 73 70 6f 73  et { CheckDispos
4c40: 65 64 28 29 3b 20 72 65 74 75 72 6e 20 77 68 61  ed(); return wha
4c50: 74 49 66 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  tIf; }..        
4c60: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
4c70: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
4c80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
4c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4cd0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
4ce0: 23 72 65 67 69 6f 6e 20 53 79 73 74 65 6d 2e 4f  #region System.O
4cf0: 62 6a 65 63 74 20 4f 76 65 72 72 69 64 65 73 0d  bject Overrides.
4d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
4d10: 6c 69 63 20 6f 76 65 72 72 69 64 65 20 73 74 72  lic override str
4d20: 69 6e 67 20 54 6f 53 74 72 69 6e 67 28 29 0d 0a  ing ToString()..
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
4d50: 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 3b 0d  heckDisposed();.
4d60: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
4d70: 20 20 20 72 65 74 75 72 6e 20 74 68 69 73 2e 4e     return this.N
4d80: 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
4d90: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
4da0: 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
4db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
4dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
4e00: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 72  ..            #r
4e10: 65 67 69 6f 6e 20 49 6d 70 6c 69 63 69 74 20 43  egion Implicit C
4e20: 6f 6e 76 65 72 73 69 6f 6e 20 4f 70 65 72 61 74  onversion Operat
4e30: 6f 72 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ors..           
4e40: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
4e50: 20 2f 2f 20 42 55 47 42 55 47 3a 20 54 68 65 20   // BUGBUG: The 
4e60: 27 77 68 61 74 2d 69 66 27 20 6d 6f 64 65 20 73  'what-if' mode s
4e70: 65 74 74 69 6e 67 20 68 65 72 65 20 73 68 6f 75  etting here shou
4e80: 6c 64 20 70 72 6f 62 61 62 6c 79 20 62 65 20 62  ld probably be b
4e90: 61 73 65 64 0d 0a 20 20 20 20 20 20 20 20 20 20  ased..          
4ea0: 20 20 2f 2f 20 20 20 20 20 20 20 20 20 6f 6e 20    //         on 
4eb0: 73 6f 6d 65 20 73 74 61 74 69 63 20 70 72 6f 70  some static prop
4ec0: 65 72 74 79 2c 20 6e 6f 74 20 68 61 72 64 2d 63  erty, not hard-c
4ed0: 6f 64 65 64 20 74 6f 20 74 72 75 65 3f 0d 0a 20  oded to true?.. 
4ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
4ef0: 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69             publi
4f00: 63 20 73 74 61 74 69 63 20 69 6d 70 6c 69 63 69  c static implici
4f10: 74 20 6f 70 65 72 61 74 6f 72 20 4d 6f 63 6b 52  t operator MockR
4f20: 65 67 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20  egistryKey(..   
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
4f40: 69 73 74 72 79 4b 65 79 20 6b 65 79 0d 0a 20 20  istryKey key..  
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
4f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f80: 72 65 74 75 72 6e 20 6e 65 77 20 4d 6f 63 6b 52  return new MockR
4f90: 65 67 69 73 74 72 79 4b 65 79 28 6b 65 79 2c 20  egistryKey(key, 
4fa0: 6e 75 6c 6c 2c 20 74 72 75 65 29 3b 0d 0a 20 20  null, true);..  
4fb0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
4fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
4fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
5010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
5020: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
5030: 20 42 55 47 42 55 47 3a 20 52 65 6d 6f 76 65 20   BUGBUG: Remove 
5040: 6d 65 3f 20 20 54 68 69 73 20 73 68 6f 75 6c 64  me?  This should
5050: 20 62 65 20 73 61 66 65 20 62 65 63 61 75 73 65   be safe because
5060: 20 69 6e 20 27 77 68 61 74 2d 69 66 27 0d 0a 20   in 'what-if'.. 
5070: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
5080: 20 20 20 20 20 20 6d 6f 64 65 20 61 6c 6c 20 6b        mode all k
5090: 65 79 73 20 61 72 65 20 6f 70 65 6e 65 64 20 72  eys are opened r
50a0: 65 61 64 2d 6f 6e 6c 79 2e 0d 0a 20 20 20 20 20  ead-only...     
50b0: 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
50c0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
50d0: 61 74 69 63 20 69 6d 70 6c 69 63 69 74 20 6f 70  atic implicit op
50e0: 65 72 61 74 6f 72 20 52 65 67 69 73 74 72 79 4b  erator RegistryK
50f0: 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
5100: 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72       MockRegistr
5110: 79 4b 65 79 20 6b 65 79 0d 0a 20 20 20 20 20 20  yKey key..      
5120: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
5130: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5140: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
5150: 72 6e 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29  rn (key != null)
5160: 20 3f 20 6b 65 79 2e 4b 65 79 20 3a 20 6e 75 6c   ? key.Key : nul
5170: 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l;..            
5180: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
5190: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
51a0: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
51b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
5200: 69 6f 6e 20 49 44 69 73 70 6f 73 61 62 6c 65 20  ion IDisposable 
5210: 22 50 61 74 74 65 72 6e 22 20 4d 65 6d 62 65 72  "Pattern" Member
5220: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
5230: 72 69 76 61 74 65 20 62 6f 6f 6c 20 64 69 73 70  rivate bool disp
5240: 6f 73 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20  osed;..         
5250: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
5260: 43 68 65 63 6b 44 69 73 70 6f 73 65 64 28 29 20  CheckDisposed() 
5270: 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
5280: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5290: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
52a0: 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20 20 20  !disposed)..    
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
52d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
52e0: 20 6e 65 77 20 4f 62 6a 65 63 74 44 69 73 70 6f   new ObjectDispo
52f0: 73 65 64 45 78 63 65 70 74 69 6f 6e 28 74 79 70  sedException(typ
5300: 65 6f 66 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  eof(MockRegistry
5310: 4b 65 79 29 2e 4e 61 6d 65 29 3b 0d 0a 20 20 20  Key).Name);..   
5320: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
5330: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
5340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
5380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
5390: 76 61 74 65 20 2f 2a 20 70 72 6f 74 65 63 74 65  vate /* protecte
53a0: 64 20 76 69 72 74 75 61 6c 20 2a 2f 20 76 6f 69  d virtual */ voi
53b0: 64 20 44 69 73 70 6f 73 65 28 0d 0a 20 20 20 20  d Dispose(..    
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
53d0: 20 64 69 73 70 6f 73 69 6e 67 0d 0a 20 20 20 20   disposing..    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
53f0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
5410: 20 28 21 64 69 73 70 6f 73 65 64 29 0d 0a 20 20   (!disposed)..  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
5430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5440: 20 20 20 20 20 69 66 20 28 64 69 73 70 6f 73 69       if (disposi
5450: 6e 67 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ng)..           
5460: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
5490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54a0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 20 20 20 20 20 20  ////////..      
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 20 2f 2f 20 64 69 73 70 6f 73 65 20 6d 61 6e    // dispose man
54d0: 61 67 65 64 20 72 65 73 6f 75 72 63 65 73 20 68  aged resources h
54e0: 65 72 65 2e 2e 2e 0d 0a 20 20 20 20 20 20 20 20  ere.....        
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 69 66 20 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29  if (key != null)
5550: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5560: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 20 20 20 20 6b 65 79 2e 43 6c 6f           key.Clo
5590: 73 65 28 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  se();..         
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 6b 65 79 20 3d 20 6e 75 6c 6c 3b 0d 0a     key = null;..
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
55f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
5600: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
5610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 2f 2f 20 72 65 6c 65 61 73 65 20 75      // release u
5650: 6e 6d 61 6e 61 67 65 64 20 72 65 73 6f 75 72 63  nmanaged resourc
5660: 65 73 20 68 65 72 65 2e 2e 2e 0d 0a 20 20 20 20  es here.....    
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
56a0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
56c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
56d0: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 54        // NOTE: T
56e0: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6e 6f  his object is no
56f0: 77 20 64 69 73 70 6f 73 65 64 2e 0d 0a 20 20 20  w disposed...   
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
5720: 20 20 20 20 20 20 20 20 20 64 69 73 70 6f 73 65           dispose
5730: 64 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  d = true;..     
5740: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
5750: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
5760: 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67           #endreg
5770: 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ion....         
5780: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
5790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
57a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
57b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
57c0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
57d0: 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20 49 44        #region ID
57e0: 69 73 70 6f 73 61 62 6c 65 20 4d 65 6d 62 65 72  isposable Member
57f0: 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s..            p
5800: 75 62 6c 69 63 20 76 6f 69 64 20 44 69 73 70 6f  ublic void Dispo
5810: 73 65 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se()..          
5820: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
5830: 20 20 20 20 20 44 69 73 70 6f 73 65 28 74 72 75       Dispose(tru
5840: 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
5850: 20 20 20 20 20 47 43 2e 53 75 70 70 72 65 73 73       GC.Suppress
5860: 46 69 6e 61 6c 69 7a 65 28 74 68 69 73 29 3b 0d  Finalize(this);.
5870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
5880: 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
5890: 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
58a0: 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
58b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
58c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
58d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
58e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
58f0: 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e           #region
5900: 20 44 65 73 74 72 75 63 74 6f 72 0d 0a 20 20 20   Destructor..   
5910: 20 20 20 20 20 20 20 20 20 7e 4d 6f 63 6b 52 65           ~MockRe
5920: 67 69 73 74 72 79 4b 65 79 28 29 0d 0a 20 20 20  gistryKey()..   
5930: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 44 69 73 70              Disp
5950: 6f 73 65 28 66 61 6c 73 65 29 3b 0d 0a 20 20 20  ose(false);..   
5960: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
5970: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
5980: 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  on..        }.. 
5990: 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
59a0: 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
59b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59f0: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
5a00: 23 72 65 67 69 6f 6e 20 52 65 67 69 73 74 72 79  #region Registry
5a10: 48 65 6c 70 65 72 20 43 6c 61 73 73 0d 0a 20 20  Helper Class..  
5a20: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
5a30: 61 74 69 63 20 63 6c 61 73 73 20 52 65 67 69 73  atic class Regis
5a40: 74 72 79 48 65 6c 70 65 72 0d 0a 20 20 20 20 20  tryHelper..     
5a50: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5a60: 20 20 23 72 65 67 69 6f 6e 20 50 75 62 6c 69 63    #region Public
5a70: 20 53 74 61 74 69 63 20 50 72 6f 70 65 72 74 69   Static Properti
5a80: 65 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  es..            
5a90: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 69  private static i
5aa0: 6e 74 20 73 75 62 4b 65 79 73 43 72 65 61 74 65  nt subKeysCreate
5ab0: 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d;..            
5ac0: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e  public static in
5ad0: 74 20 53 75 62 4b 65 79 73 43 72 65 61 74 65 64  t SubKeysCreated
5ae0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
5af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5b00: 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 73 75   get { return su
5b10: 62 4b 65 79 73 43 72 65 61 74 65 64 3b 20 7d 0d  bKeysCreated; }.
5b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
5b30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
5b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
5b90: 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
5ba0: 69 6e 74 20 73 75 62 4b 65 79 73 44 65 6c 65 74  int subKeysDelet
5bb0: 65 64 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed;..           
5bc0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69   public static i
5bd0: 6e 74 20 53 75 62 4b 65 79 73 44 65 6c 65 74 65  nt SubKeysDelete
5be0: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  d..            {
5bf0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5c00: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 73    get { return s
5c10: 75 62 4b 65 79 73 44 65 6c 65 74 65 64 3b 20 7d  ubKeysDeleted; }
5c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
5c30: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
5c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c80: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
5c90: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
5ca0: 20 69 6e 74 20 6b 65 79 56 61 6c 75 65 73 53 65   int keyValuesSe
5cb0: 74 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t;..            
5cc0: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e  public static in
5cd0: 74 20 4b 65 79 56 61 6c 75 65 73 53 65 74 0d 0a  t KeyValuesSet..
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
5d00: 65 74 20 7b 20 72 65 74 75 72 6e 20 6b 65 79 56  et { return keyV
5d10: 61 6c 75 65 73 53 65 74 3b 20 7d 0d 0a 20 20 20  aluesSet; }..   
5d20: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
5d30: 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f            //////
5d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d  /////////////...
5d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
5d90: 76 61 74 65 20 73 74 61 74 69 63 20 69 6e 74 20  vate static int 
5da0: 6b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64  keyValuesDeleted
5db0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
5dc0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e 74  ublic static int
5dd0: 20 4b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65   KeyValuesDelete
5de0: 64 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  d..            {
5df0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5e00: 20 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6b    get { return k
5e10: 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65 64 3b  eyValuesDeleted;
5e20: 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
5e30: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
5e40: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
5e50: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
5e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5e70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
5eb0: 69 6f 6e 20 50 75 62 6c 69 63 20 53 74 61 74 69  ion Public Stati
5ec0: 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20  c Methods..     
5ed0: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
5ee0: 61 74 69 63 20 52 65 67 69 73 74 72 79 4b 65 79  atic RegistryKey
5ef0: 20 47 65 74 52 6f 6f 74 4b 65 79 42 79 4e 61 6d   GetRootKeyByNam
5f00: 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
5f10: 20 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61      string keyNa
5f20: 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  me..            
5f30: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
5f40: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5f50: 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e 67        if (String
5f60: 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 6b  .IsNullOrEmpty(k
5f70: 65 79 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20  eyName))..      
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
5f90: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 77                sw
5fb0: 69 74 63 68 20 28 6b 65 79 4e 61 6d 65 2e 54 6f  itch (keyName.To
5fc0: 55 70 70 65 72 49 6e 76 61 72 69 61 6e 74 28 29  UpperInvariant()
5fd0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
5fe0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
5ff0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
6000: 48 4b 43 52 22 3a 0d 0a 20 20 20 20 20 20 20 20  HKCR":..        
6010: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
6020: 20 22 48 4b 45 59 5f 43 4c 41 53 53 45 53 5f 52   "HKEY_CLASSES_R
6030: 4f 4f 54 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  OOT":..         
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
6050: 65 74 75 72 6e 20 52 65 67 69 73 74 72 79 2e 43  eturn Registry.C
6060: 6c 61 73 73 65 73 52 6f 6f 74 3b 0d 0a 20 20 20  lassesRoot;..   
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 63 61 73 65 20 22 48 4b 43 43 22 3a 0d 0a 20   case "HKCC":.. 
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 63 61 73 65 20 22 48 4b 45 59 5f 43 55     case "HKEY_CU
60b0: 52 52 45 4e 54 5f 43 4f 4e 46 49 47 22 3a 0d 0a  RRENT_CONFIG":..
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52          return R
60e0: 65 67 69 73 74 72 79 2e 43 75 72 72 65 6e 74 43  egistry.CurrentC
60f0: 6f 6e 66 69 67 3b 0d 0a 20 20 20 20 20 20 20 20  onfig;..        
6100: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
6110: 20 22 48 4b 43 55 22 3a 0d 0a 20 20 20 20 20 20   "HKCU":..      
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
6130: 73 65 20 22 48 4b 45 59 5f 43 55 52 52 45 4e 54  se "HKEY_CURRENT
6140: 5f 55 53 45 52 22 3a 0d 0a 20 20 20 20 20 20 20  _USER":..       
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 72 65 74 75 72 6e 20 52 65 67 69 73 74 72 79   return Registry
6170: 2e 43 75 72 72 65 6e 74 55 73 65 72 3b 0d 0a 20  .CurrentUser;.. 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 63 61 73 65 20 22 48 4b 44 44 22 3a 0d     case "HKDD":.
61a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
61b0: 20 20 20 20 20 63 61 73 65 20 22 48 4b 45 59 5f       case "HKEY_
61c0: 44 59 4e 5f 44 41 54 41 22 3a 0d 0a 20 20 20 20  DYN_DATA":..    
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 20 72 65 74 75 72 6e 20 52 65 67 69 73      return Regis
61f0: 74 72 79 2e 44 79 6e 44 61 74 61 3b 0d 0a 20 20  try.DynData;..  
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 63 61 73 65 20 22 48 4b 4c 4d 22 3a 0d 0a    case "HKLM":..
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 20 63 61 73 65 20 22 48 4b 45 59 5f 4c      case "HKEY_L
6240: 4f 43 41 4c 5f 4d 41 43 48 49 4e 45 22 3a 0d 0a  OCAL_MACHINE":..
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52          return R
6270: 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63  egistry.LocalMac
6280: 68 69 6e 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  hine;..         
6290: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
62a0: 22 48 4b 50 44 22 3a 0d 0a 20 20 20 20 20 20 20  "HKPD":..       
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
62c0: 65 20 22 48 4b 45 59 5f 50 45 52 46 4f 52 4d 41  e "HKEY_PERFORMA
62d0: 4e 43 45 5f 44 41 54 41 22 3a 0d 0a 20 20 20 20  NCE_DATA":..    
62e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62f0: 20 20 20 20 72 65 74 75 72 6e 20 52 65 67 69 73      return Regis
6300: 74 72 79 2e 50 65 72 66 6f 72 6d 61 6e 63 65 44  try.PerformanceD
6310: 61 74 61 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ata;..          
6320: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 22            case "
6330: 48 4b 55 22 3a 0d 0a 20 20 20 20 20 20 20 20 20  HKU":..         
6340: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
6350: 22 48 4b 45 59 5f 55 53 45 52 53 22 3a 0d 0a 20  "HKEY_USERS":.. 
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65         return Re
6380: 67 69 73 74 72 79 2e 55 73 65 72 73 3b 0d 0a 20  gistry.Users;.. 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
63a0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
63b0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
63c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
63d0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
63e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
63f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6420: 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
6430: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
6440: 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20  MockRegistryKey 
6450: 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63               Moc
6470: 6b 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f  kRegistryKey roo
6480: 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  tKey,..         
6490: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 73 75         string su
64a0: 62 4b 65 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  bKeyName,..     
64b0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
64c0: 77 72 69 74 61 62 6c 65 2c 0d 0a 20 20 20 20 20  writable,..     
64d0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
64e0: 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
64f0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65           bool ve
6500: 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20  rbose..         
6510: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
6520: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6530: 20 20 20 20 20 20 20 20 20 69 66 20 28 72 6f 6f           if (roo
6540: 74 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  tKey == null).. 
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d     return null;.
6570: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6580: 20 20 20 69 66 20 28 76 65 72 62 6f 73 65 29 0d     if (verbose).
6590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
65a0: 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
65b0: 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
65c0: 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
65d0: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
65e0: 20 20 20 20 20 20 20 20 20 20 20 22 72 6f 6f 74             "root
65f0: 4b 65 79 20 3d 20 7b 30 7d 2c 20 73 75 62 4b 65  Key = {0}, subKe
6600: 79 4e 61 6d 65 20 3d 20 7b 31 7d 2c 20 77 72 69  yName = {1}, wri
6610: 74 61 62 6c 65 20 3d 20 7b 32 7d 22 2c 0d 0a 20  table = {2}",.. 
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
6640: 79 28 72 6f 6f 74 4b 65 79 29 2c 20 46 6f 72 44  y(rootKey), ForD
6650: 69 73 70 6c 61 79 28 73 75 62 4b 65 79 4e 61 6d  isplay(subKeyNam
6660: 65 29 2c 20 77 72 69 74 61 62 6c 65 29 2c 0d 0a  e), writable),..
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
6690: 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
66a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66c0: 2f 20 48 41 43 4b 3a 20 41 6c 77 61 79 73 20 66  / HACK: Always f
66d0: 6f 72 62 69 64 20 77 72 69 74 61 62 6c 65 20 61  orbid writable a
66e0: 63 63 65 73 73 20 77 68 65 6e 20 6f 70 65 72 61  ccess when opera
66f0: 74 69 6e 67 20 69 6e 0d 0a 20 20 20 20 20 20 20  ting in..       
6700: 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
6710: 20 20 27 77 68 61 74 2d 69 66 27 20 6d 6f 64 65    'what-if' mode
6720: 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
6730: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
6740: 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73         MockRegis
6750: 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72 6f 6f  tryKey key = roo
6760: 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65 79 28  tKey.OpenSubKey(
6770: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6780: 20 20 20 20 20 20 73 75 62 4b 65 79 4e 61 6d 65        subKeyName
6790: 2c 20 77 68 61 74 49 66 20 3f 20 66 61 6c 73 65  , whatIf ? false
67a0: 20 3a 20 77 72 69 74 61 62 6c 65 29 3b 0d 0a 0d   : writable);...
67b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
67c0: 20 72 65 74 75 72 6e 20 28 6b 65 79 20 21 3d 20   return (key != 
67d0: 6e 75 6c 6c 29 20 3f 0d 0a 20 20 20 20 20 20 20  null) ?..       
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
67f0: 20 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79   MockRegistryKey
6800: 28 6b 65 79 2c 20 77 68 61 74 49 66 29 20 3a 20  (key, whatIf) : 
6810: 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20  null;..         
6820: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
6830: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
6840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6870: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
6880: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73 74         public st
6890: 61 74 69 63 20 4d 6f 63 6b 52 65 67 69 73 74 72  atic MockRegistr
68a0: 79 4b 65 79 20 43 72 65 61 74 65 53 75 62 4b 65  yKey CreateSubKe
68b0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
68c0: 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
68d0: 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
68f0: 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c  ring subKeyName,
6900: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6910: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
6950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
6980: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
6990: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
69a0: 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20   null;....      
69b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65            if (ve
69c0: 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20  rbose)..        
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
69e0: 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65  eOps.Trace(trace
69f0: 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
6a00: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a20: 20 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30 7d    "rootKey = {0}
6a30: 2c 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20 7b  , subKeyName = {
6a40: 31 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  1}", ForDisplay(
6a50: 72 6f 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20 20  rootKey),..     
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 73 75     ForDisplay(su
6a80: 62 4b 65 79 4e 61 6d 65 29 29 2c 20 74 72 61 63  bKeyName)), trac
6a90: 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6ab0: 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry..            
6ac0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
6ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 2f 2f 20 48 41 43 4b 3a 20 41 6c 77 61     // HACK: Alwa
6b00: 79 73 20 6f 70 65 6e 20 61 20 6b 65 79 2c 20 72  ys open a key, r
6b10: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
6b20: 69 6e 67 20 6f 6e 65 20 77 68 65 6e 0d 0a 20 20  ing one when..  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 65 72 61    //       opera
6b50: 74 69 6e 67 20 69 6e 20 27 77 68 61 74 2d 69 66  ting in 'what-if
6b60: 27 20 6d 6f 64 65 2e 0d 0a 20 20 20 20 20 20 20  ' mode...       
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
6b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6b90: 20 20 20 20 20 69 66 20 28 77 68 61 74 49 66 29       if (whatIf)
6ba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6bb0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
6bf0: 48 41 43 4b 3a 20 41 74 74 65 6d 70 74 20 74 6f  HACK: Attempt to
6c00: 20 6f 70 65 6e 20 74 68 65 20 73 70 65 63 69 66   open the specif
6c10: 69 65 64 20 73 75 62 2d 6b 65 79 2e 20 20 49 66  ied sub-key.  If
6c20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6c30: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
6c40: 20 20 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77     this fails, w
6c50: 65 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 72 65  e will simply re
6c60: 74 75 72 6e 20 74 68 65 20 72 6f 6f 74 20 6b 65  turn the root ke
6c70: 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y..             
6c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
6c90: 20 20 20 20 69 74 73 65 6c 66 20 73 69 6e 63 65      itself since
6ca0: 20 6e 6f 20 77 72 69 74 65 73 20 61 72 65 20 61   no writes are a
6cb0: 6c 6c 6f 77 65 64 20 69 6e 0d 0a 20 20 20 20 20  llowed in..     
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 20 20 20 2f 2f 20 20 20 20 20 20 20 27 77 68 61     //       'wha
6ce0: 74 2d 69 66 27 20 6d 6f 64 65 20 61 6e 79 68 6f  t-if' mode anyho
6cf0: 77 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  w...            
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
6d30: 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 72 6f  stryKey key = ro
6d40: 6f 74 4b 65 79 2e 4f 70 65 6e 53 75 62 4b 65 79  otKey.OpenSubKey
6d50: 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d  (subKeyName);...
6d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6d80: 28 6b 65 79 20 21 3d 20 6e 75 6c 6c 29 20 3f 0d  (key != null) ?.
6d90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
6db0: 20 3a 20 6e 65 77 20 4d 6f 63 6b 52 65 67 69 73   : new MockRegis
6dc0: 74 72 79 4b 65 79 28 72 6f 6f 74 4b 65 79 2c 20  tryKey(rootKey, 
6dd0: 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 20 20  subKeyName);..  
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6df0: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
6e00: 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
6e40: 74 75 72 6e 20 6e 65 77 20 4d 6f 63 6b 52 65 67  turn new MockReg
6e50: 69 73 74 72 79 4b 65 79 28 0d 0a 20 20 20 20 20  istryKey(..     
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2e 43         rootKey.C
6e80: 72 65 61 74 65 53 75 62 4b 65 79 28 73 75 62 4b  reateSubKey(subK
6e90: 65 79 4e 61 6d 65 29 2c 20 66 61 6c 73 65 29 3b  eyName), false);
6ea0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6eb0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
6ec0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61              fina
6ee0: 6c 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lly..           
6ef0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b              subK
6f10: 65 79 73 43 72 65 61 74 65 64 2b 2b 3b 0d 0a 20  eysCreated++;.. 
6f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6f30: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
6f40: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
6f50: 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
6fa0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
6fb0: 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62 4b 65  void DeleteSubKe
6fc0: 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
6fd0: 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74 72 79      MockRegistry
6fe0: 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
7000: 72 69 6e 67 20 73 75 62 4b 65 79 4e 61 6d 65 2c  ring subKeyName,
7010: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7020: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
7060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e  if (rootKey == n
7090: 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
70a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
70b0: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
70c0: 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73 65       if (verbose
70d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
70e0: 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
70f0: 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
7100: 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
7110: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 6f               "ro
7130: 6f 74 4b 65 79 20 3d 20 7b 30 7d 2c 20 73 75 62  otKey = {0}, sub
7140: 4b 65 79 4e 61 6d 65 20 3d 20 7b 31 7d 22 2c 20  KeyName = {1}", 
7150: 46 6f 72 44 69 73 70 6c 61 79 28 72 6f 6f 74 4b  ForDisplay(rootK
7160: 65 79 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ey),..          
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
7180: 72 44 69 73 70 6c 61 79 28 73 75 62 4b 65 79 4e  rDisplay(subKeyN
7190: 61 6d 65 29 29 2c 20 74 72 61 63 65 43 61 74 65  ame)), traceCate
71a0: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
71b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77            if (!w
71c0: 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20  hatIf)..        
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74              root
71e0: 4b 65 79 2e 44 65 6c 65 74 65 53 75 62 4b 65 79  Key.DeleteSubKey
71f0: 28 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d  (subKeyName);...
7200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7210: 20 73 75 62 4b 65 79 73 44 65 6c 65 74 65 64 2b   subKeysDeleted+
7220: 2b 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +;..            
7230: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
7240: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7280: 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
7290: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
72a0: 63 20 76 6f 69 64 20 44 65 6c 65 74 65 53 75 62  c void DeleteSub
72b0: 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20 20 20  KeyTree(..      
72c0: 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65            MockRe
72d0: 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65  gistryKey rootKe
72e0: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
72f0: 20 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65      string subKe
7300: 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
7310: 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
7320: 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
7330: 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f        bool verbo
7340: 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
7350: 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 20      )..         
7360: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
7370: 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
7380: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20  return;....     
73b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
73c0: 65 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20  erbose)..       
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
73e0: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
73f0: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
7400: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 22 72 6f 6f 74 4b 65 79 20 3d 20 7b 30     "rootKey = {0
7430: 7d 2c 20 73 75 62 4b 65 79 4e 61 6d 65 20 3d 20  }, subKeyName = 
7440: 7b 31 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {1}", ForDisplay
7450: 28 72 6f 6f 74 4b 65 79 29 2c 0d 0a 20 20 20 20  (rootKey),..    
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7470: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 73      ForDisplay(s
7480: 75 62 4b 65 79 4e 61 6d 65 29 29 2c 20 74 72 61  ubKeyName)), tra
7490: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20  if (!whatIf)..  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 72 6f 6f 74 4b 65 79 2e 44 65 6c 65 74 65    rootKey.Delete
74e0: 53 75 62 4b 65 79 54 72 65 65 28 73 75 62 4b 65  SubKeyTree(subKe
74f0: 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  yName);....     
7500: 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b 65             subKe
7510: 79 73 44 65 6c 65 74 65 64 2b 2b 3b 0d 0a 20 20  ysDeleted++;..  
7520: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
7530: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
7540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
7580: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
7590: 62 6c 69 63 20 73 74 61 74 69 63 20 73 74 72 69  blic static stri
75a0: 6e 67 5b 5d 20 47 65 74 53 75 62 4b 65 79 4e 61  ng[] GetSubKeyNa
75b0: 6d 65 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mes(..          
75c0: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
75d0: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
75f0: 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
7600: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
7610: 65 72 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20  erbose..        
7620: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
7630: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
7640: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65            if (ke
7650: 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a  return null;....
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
76c0: 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
76d0: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b          "key = {
7700: 30 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  0}", ForDisplay(
7710: 6b 65 79 29 29 2c 20 74 72 61 63 65 43 61 74 65  key)), traceCate
7720: 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
7730: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7740: 20 6b 65 79 2e 47 65 74 53 75 62 4b 65 79 4e 61   key.GetSubKeyNa
7750: 6d 65 73 28 29 3b 0d 0a 20 20 20 20 20 20 20 20  mes();..        
7760: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7770: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
7780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77b0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
77c0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
77d0: 74 61 74 69 63 20 6f 62 6a 65 63 74 20 47 65 74  tatic object Get
77e0: 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
77f0: 20 20 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69          MockRegi
7800: 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20  stryKey key,..  
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
7820: 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20  ring name,..    
7830: 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65              obje
7840: 63 74 20 64 65 66 61 75 6c 74 56 61 6c 75 65 2c  ct defaultValue,
7850: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7860: 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7880: 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
78a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
78d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
78e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
78f0: 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  l;....          
7900: 20 20 20 20 20 20 69 66 20 28 76 65 72 62 6f 73        if (verbos
7910: 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e)..            
7920: 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
7930: 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
7940: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
7950: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6b                "k
7970: 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65 20 3d  ey = {0}, name =
7980: 20 7b 31 7d 2c 20 64 65 66 61 75 6c 74 56 61 6c   {1}, defaultVal
7990: 75 65 20 3d 20 7b 32 7d 22 2c 0d 0a 20 20 20 20  ue = {2}",..    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 6b      ForDisplay(k
79c0: 65 79 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  ey), ForDisplay(
79d0: 6e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20  name),..        
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 46 6f 72 44 69 73 70 6c 61 79 28 64 65 66 61 75  ForDisplay(defau
7a00: 6c 74 56 61 6c 75 65 29 29 2c 20 74 72 61 63 65  ltValue)), trace
7a10: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
7a30: 74 75 72 6e 20 6b 65 79 2e 47 65 74 56 61 6c 75  turn key.GetValu
7a40: 65 28 6e 61 6d 65 2c 20 64 65 66 61 75 6c 74 56  e(name, defaultV
7a50: 61 6c 75 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  alue);..        
7a60: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
7a70: 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
7a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ab0: 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
7ac0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 73          public s
7ad0: 74 61 74 69 63 20 76 6f 69 64 20 53 65 74 56 61  tatic void SetVa
7ae0: 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  lue(..          
7af0: 20 20 20 20 20 20 4d 6f 63 6b 52 65 67 69 73 74        MockRegist
7b00: 72 79 4b 65 79 20 6b 65 79 2c 0d 0a 20 20 20 20  ryKey key,..    
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
7b20: 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  ng name,..      
7b30: 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
7b40: 20 76 61 6c 75 65 2c 0d 0a 20 20 20 20 20 20 20   value,..       
7b50: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
7b60: 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
7b70: 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
7b80: 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ose..           
7b90: 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
7ba0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
7bb0: 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d         if (key =
7bc0: 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
7be0: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
7bf0: 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72 62          if (verb
7c00: 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ose)..          
7c10: 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
7c20: 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61  ps.Trace(traceCa
7c30: 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
7c40: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 22 6b 65 79 20 3d 20 7b 30 7d 2c 20 6e 61 6d 65  "key = {0}, name
7c70: 20 3d 20 7b 31 7d 2c 20 76 61 6c 75 65 20 3d 20   = {1}, value = 
7c80: 7b 32 7d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  {2}", ForDisplay
7c90: 28 6b 65 79 29 2c 0d 0a 20 20 20 20 20 20 20 20  (key),..        
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 46 6f 72 44 69 73 70 6c 61 79 28 6e 61 6d 65 29  ForDisplay(name)
7cc0: 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 76 61 6c  , ForDisplay(val
7cd0: 75 65 29 29 2c 20 74 72 61 63 65 43 61 74 65 67  ue)), traceCateg
7ce0: 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
7cf0: 20 20 20 20 20 20 20 20 20 69 66 20 28 21 77 68           if (!wh
7d00: 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20  atIf)..         
7d10: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2e 53             key.S
7d20: 65 74 56 61 6c 75 65 28 6e 61 6d 65 2c 20 76 61  etValue(name, va
7d30: 6c 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  lue);....       
7d40: 20 20 20 20 20 20 20 20 20 6b 65 79 56 61 6c 75           keyValu
7d50: 65 73 53 65 74 2b 2b 3b 0d 0a 20 20 20 20 20 20  esSet++;..      
7d60: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
7d70: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
7d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
7dc0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
7dd0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 44 65 6c   static void Del
7de0: 65 74 65 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  eteValue(..     
7df0: 20 20 20 20 20 20 20 20 20 20 20 4d 6f 63 6b 52             MockR
7e00: 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 2c 0d  egistryKey key,.
7e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e20: 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20   string name,.. 
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7e40: 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  ool whatIf,..   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
7e60: 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20 20  l verbose..     
7e70: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
7e80: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
7ea0: 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  (key == null).. 
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ec0: 20 20 20 72 65 74 75 72 6e 3b 0d 0a 0d 0a 20 20     return;....  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
7ee0: 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20 20 20   (verbose)..    
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74  TraceOps.Trace(t
7f10: 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74  raceCallback, St
7f20: 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 20 22 6b 65 79 20 3d 20 7b 30 7d        "key = {0}
7f50: 2c 20 6e 61 6d 65 20 3d 20 7b 31 7d 22 2c 20 46  , name = {1}", F
7f60: 6f 72 44 69 73 70 6c 61 79 28 6b 65 79 29 2c 0d  orDisplay(key),.
7f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f80: 20 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70           ForDisp
7f90: 6c 61 79 28 6e 61 6d 65 29 29 2c 20 74 72 61 63  lay(name)), trac
7fa0: 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20  eCategory);.... 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7fc0: 66 20 28 21 77 68 61 74 49 66 29 0d 0a 20 20 20  f (!whatIf)..   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 6b 65 79 2e 44 65 6c 65 74 65 56 61 6c 75 65   key.DeleteValue
7ff0: 28 6e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  (name);....     
8000: 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 56 61             keyVa
8010: 6c 75 65 73 44 65 6c 65 74 65 64 2b 2b 3b 0d 0a  luesDeleted++;..
8020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8030: 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
8040: 65 67 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7d  egion..        }
8050: 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
8060: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
8070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80b0: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
80c0: 20 20 20 23 72 65 67 69 6f 6e 20 53 74 72 69 6e     #region Strin
80d0: 67 4c 69 73 74 20 43 6c 61 73 73 0d 0a 20 20 20  gList Class..   
80e0: 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65 61       private sea
80f0: 6c 65 64 20 63 6c 61 73 73 20 53 74 72 69 6e 67  led class String
8100: 4c 69 73 74 20 3a 20 4c 69 73 74 3c 73 74 72 69  List : List<stri
8110: 6e 67 3e 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ng>..        {..
8120: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
8130: 69 63 20 53 74 72 69 6e 67 4c 69 73 74 28 29 0d  ic StringList().
8140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8150: 20 3a 20 62 61 73 65 28 29 0d 0a 20 20 20 20 20   : base()..     
8160: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
8170: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20            // do 
8180: 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20  nothing...      
8190: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
81a0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
81b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
81f0: 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
8200: 20 53 74 72 69 6e 67 4c 69 73 74 28 49 45 6e 75   StringList(IEnu
8210: 6d 65 72 61 62 6c 65 3c 73 74 72 69 6e 67 3e 20  merable<string> 
8220: 63 6f 6c 6c 65 63 74 69 6f 6e 29 0d 0a 20 20 20  collection)..   
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 62               : b
8240: 61 73 65 28 63 6f 6c 6c 65 63 74 69 6f 6e 29 0d  ase(collection).
8250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a  // do nothing...
8280: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
8290: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
82a0: 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
82b0: 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
82c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
82d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
82e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
82f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
8300: 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69  ...        #regi
8310: 6f 6e 20 53 74 72 69 6e 67 44 69 63 74 69 6f 6e  on StringDiction
8320: 61 72 79 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  ary Class..     
8330: 20 20 20 70 72 69 76 61 74 65 20 73 65 61 6c 65     private seale
8340: 64 20 63 6c 61 73 73 20 53 74 72 69 6e 67 44 69  d class StringDi
8350: 63 74 69 6f 6e 61 72 79 20 3a 20 44 69 63 74 69  ctionary : Dicti
8360: 6f 6e 61 72 79 3c 73 74 72 69 6e 67 2c 20 73 74  onary<string, st
8370: 72 69 6e 67 3e 0d 0a 20 20 20 20 20 20 20 20 7b  ring>..        {
8380: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
8390: 62 6c 69 63 20 53 74 72 69 6e 67 44 69 63 74 69  blic StringDicti
83a0: 6f 6e 61 72 79 28 29 0d 0a 20 20 20 20 20 20 20  onary()..       
83b0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
83c0: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
83d0: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
83e0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
83f0: 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65  ..        #endre
8400: 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
8410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8450: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
8460: 20 20 20 23 72 65 67 69 6f 6e 20 56 65 72 73 69     #region Versi
8470: 6f 6e 4c 69 73 74 20 43 6c 61 73 73 0d 0a 20 20  onList Class..  
8480: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 65        private se
8490: 61 6c 65 64 20 63 6c 61 73 73 20 56 65 72 73 69  aled class Versi
84a0: 6f 6e 4c 69 73 74 20 3a 20 4c 69 73 74 3c 56 65  onList : List<Ve
84b0: 72 73 69 6f 6e 3e 0d 0a 20 20 20 20 20 20 20 20  rsion>..        
84c0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {..            p
84d0: 75 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c 69 73  ublic VersionLis
84e0: 74 28 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t()..           
84f0: 20 20 20 20 20 3a 20 62 61 73 65 28 29 0d 0a 20       : base().. 
8500: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
8520: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d 0a 20 20   do nothing...  
8530: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
8540: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
8550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
8590: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
85a0: 62 6c 69 63 20 56 65 72 73 69 6f 6e 4c 69 73 74  blic VersionList
85b0: 28 49 45 6e 75 6d 65 72 61 62 6c 65 3c 56 65 72  (IEnumerable<Ver
85c0: 73 69 6f 6e 3e 20 63 6f 6c 6c 65 63 74 69 6f 6e  sion> collection
85d0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
85e0: 20 20 20 3a 20 62 61 73 65 28 63 6f 6c 6c 65 63     : base(collec
85f0: 74 69 6f 6e 29 0d 0a 20 20 20 20 20 20 20 20 20  tion)..         
8600: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
8610: 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f 74 68        // do noth
8620: 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ing...          
8630: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
8640: 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
8650: 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
8660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86a0: 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
86b0: 20 23 72 65 67 69 6f 6e 20 56 65 72 73 69 6f 6e   #region Version
86c0: 4d 61 70 20 43 6c 61 73 73 0d 0a 20 20 20 20 20  Map Class..     
86d0: 20 20 20 70 72 69 76 61 74 65 20 73 65 61 6c 65     private seale
86e0: 64 20 63 6c 61 73 73 20 56 65 72 73 69 6f 6e 4d  d class VersionM
86f0: 61 70 20 3a 20 44 69 63 74 69 6f 6e 61 72 79 3c  ap : Dictionary<
8700: 73 74 72 69 6e 67 2c 20 56 65 72 73 69 6f 6e 4c  string, VersionL
8710: 69 73 74 3e 0d 0a 20 20 20 20 20 20 20 20 7b 0d  ist>..        {.
8720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62  .            pub
8730: 6c 69 63 20 56 65 72 73 69 6f 6e 4d 61 70 28 29  lic VersionMap()
8740: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
8750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8760: 20 2f 2f 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0d   // do nothing..
8770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
8780: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
8790: 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
87a0: 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
87b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87f0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
8800: 69 6f 6e 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  ion Configuratio
8810: 6e 20 43 6c 61 73 73 0d 0a 20 20 20 20 20 20 20  n Class..       
8820: 20 70 72 69 76 61 74 65 20 73 65 61 6c 65 64 20   private sealed 
8830: 63 6c 61 73 73 20 43 6f 6e 66 69 67 75 72 61 74  class Configurat
8840: 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a  ion..        {..
8850: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
8860: 69 6f 6e 20 50 72 69 76 61 74 65 20 43 6f 6e 73  ion Private Cons
8870: 74 61 6e 74 73 0d 0a 20 20 20 20 20 20 20 20 20  tants..         
8880: 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74     private const
8890: 20 63 68 61 72 20 53 77 69 74 63 68 20 3d 20 27   char Switch = '
88a0: 2d 27 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  -';..           
88b0: 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20 63   private const c
88c0: 68 61 72 20 41 6c 74 53 77 69 74 63 68 20 3d 20  har AltSwitch = 
88d0: 27 2f 27 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  '/';....        
88e0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
88f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8920: 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
8930: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
8940: 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 63  tatic readonly c
8950: 68 61 72 5b 5d 20 53 77 69 74 63 68 43 68 61 72  har[] SwitchChar
8960: 73 20 3d 20 7b 0d 0a 20 20 20 20 20 20 20 20 20  s = {..         
8970: 20 20 20 20 20 20 20 53 77 69 74 63 68 2c 20 41         Switch, A
8980: 6c 74 53 77 69 74 63 68 0d 0a 20 20 20 20 20 20  ltSwitch..      
8990: 20 20 20 20 20 20 7d 3b 0d 0a 20 20 20 20 20 20        };..      
89a0: 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
89b0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
89c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a00: 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ///....         
8a10: 20 20 20 23 72 65 67 69 6f 6e 20 50 72 69 76 61     #region Priva
8a20: 74 65 20 43 6f 6e 73 74 72 75 63 74 6f 72 73 0d  te Constructors.
8a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
8a40: 76 61 74 65 20 43 6f 6e 66 69 67 75 72 61 74 69  vate Configurati
8a50: 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on(..           
8a60: 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20 61 73       Assembly as
8a70: 73 65 6d 62 6c 79 2c 0d 0a 20 20 20 20 20 20 20  sembly,..       
8a80: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
8a90: 6c 6f 67 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20  logFileName,..  
8aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
8ab0: 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 2c 0d  ring directory,.
8ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ad0: 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c 65   string coreFile
8ae0: 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
8af0: 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6c 69         string li
8b00: 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20  nqFileName,..   
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
8b20: 69 6e 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65  ing designerFile
8b30: 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
8b40: 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c         InstallFl
8b50: 61 67 73 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73  ags installFlags
8b60: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
8b70: 20 20 20 62 6f 6f 6c 20 69 6e 73 74 61 6c 6c 2c     bool install,
8b80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8b90: 20 20 62 6f 6f 6c 20 6e 6f 44 65 73 6b 74 6f 70    bool noDesktop
8ba0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
8bb0: 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6d 70 61 63     bool noCompac
8bc0: 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
8bd0: 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46 78      bool noNetFx
8be0: 32 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  20,..           
8bf0: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4e 65 74 46       bool noNetF
8c00: 78 34 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  x40,..          
8c10: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
8c20: 30 30 38 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  008,..          
8c30: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 56 73 32        bool noVs2
8c40: 30 31 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  010,..          
8c50: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 54 72 61        bool noTra
8c60: 63 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce,..           
8c70: 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 43 6f 6e 73       bool noCons
8c80: 6f 6c 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ole,..          
8c90: 20 20 20 20 20 20 62 6f 6f 6c 20 6e 6f 4c 6f 67        bool noLog
8ca0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
8cb0: 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
8cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8cd0: 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 62 6f 6f 6c 20 63 6f 6e 66 69 72 6d 0d 0a 20 20  bool confirm..  
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 74 68 69 73 2e 61 73 73 65 6d 62 6c 79 20 3d 20  this.assembly = 
8d40: 61 73 73 65 6d 62 6c 79 3b 0d 0a 20 20 20 20 20  assembly;..     
8d50: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
8d60: 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20 6c 6f  logFileName = lo
8d70: 67 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  gFileName;..    
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
8d90: 2e 64 69 72 65 63 74 6f 72 79 20 3d 20 64 69 72  .directory = dir
8da0: 65 63 74 6f 72 79 3b 0d 0a 20 20 20 20 20 20 20  ectory;..       
8db0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 63 6f           this.co
8dc0: 72 65 46 69 6c 65 4e 61 6d 65 20 3d 20 63 6f 72  reFileName = cor
8dd0: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20  eFileName;..    
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
8df0: 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
8e00: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20  linqFileName;.. 
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
8e20: 68 69 73 2e 64 65 73 69 67 6e 65 72 46 69 6c 65  his.designerFile
8e30: 4e 61 6d 65 20 3d 20 64 65 73 69 67 6e 65 72 46  Name = designerF
8e40: 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20  ileName;..      
8e50: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 69            this.i
8e60: 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d 20 69 6e  nstallFlags = in
8e70: 73 74 61 6c 6c 46 6c 61 67 73 3b 0d 0a 20 20 20  stallFlags;..   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
8e90: 73 2e 69 6e 73 74 61 6c 6c 20 3d 20 69 6e 73 74  s.install = inst
8ea0: 61 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  all;..          
8eb0: 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 44 65 73        this.noDes
8ec0: 6b 74 6f 70 20 3d 20 6e 6f 44 65 73 6b 74 6f 70  ktop = noDesktop
8ed0: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
8ee0: 20 20 20 74 68 69 73 2e 6e 6f 43 6f 6d 70 61 63     this.noCompac
8ef0: 74 20 3d 20 6e 6f 43 6f 6d 70 61 63 74 3b 0d 0a  t = noCompact;..
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 74 68 69 73 2e 6e 6f 4e 65 74 46 78 32 30 20 3d  this.noNetFx20 =
8f20: 20 6e 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20 20   noNetFx20;..   
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
8f40: 73 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 6e 6f  s.noNetFx40 = no
8f50: 4e 65 74 46 78 34 30 3b 0d 0a 20 20 20 20 20 20  NetFx40;..      
8f60: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e            this.n
8f70: 6f 56 73 32 30 30 38 20 3d 20 6e 6f 56 73 32 30  oVs2008 = noVs20
8f80: 30 38 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  08;..           
8f90: 20 20 20 20 20 74 68 69 73 2e 6e 6f 56 73 32 30       this.noVs20
8fa0: 31 30 20 3d 20 6e 6f 56 73 32 30 31 30 3b 0d 0a  10 = noVs2010;..
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fc0: 74 68 69 73 2e 6e 6f 54 72 61 63 65 20 3d 20 6e  this.noTrace = n
8fd0: 6f 54 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20  oTrace;..       
8fe0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 6e 6f           this.no
8ff0: 43 6f 6e 73 6f 6c 65 20 3d 20 6e 6f 43 6f 6e 73  Console = noCons
9000: 6f 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ole;..          
9010: 20 20 20 20 20 20 74 68 69 73 2e 6e 6f 4c 6f 67        this.noLog
9020: 20 3d 20 6e 6f 4c 6f 67 3b 0d 0a 20 20 20 20 20   = noLog;..     
9030: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9040: 77 68 61 74 49 66 20 3d 20 77 68 61 74 49 66 3b  whatIf = whatIf;
9050: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9060: 20 20 74 68 69 73 2e 76 65 72 62 6f 73 65 20 3d    this.verbose =
9070: 20 76 65 72 62 6f 73 65 3b 0d 0a 20 20 20 20 20   verbose;..     
9080: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
9090: 63 6f 6e 66 69 72 6d 20 3d 20 63 6f 6e 66 69 72  confirm = confir
90a0: 6d 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  m;..            
90b0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  }..            #
90c0: 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20  endregion....   
90d0: 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
90e0: 2f 2f 2f 2f 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 0d 0a 0d 0a  ////////////....
9120: 20 20 20 20 20 20 20 20 20 20 20 20 23 72 65 67              #reg
9130: 69 6f 6e 20 50 72 69 76 61 74 65 20 53 74 61 74  ion Private Stat
9140: 69 63 20 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20  ic Methods..    
9150: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
9160: 73 74 61 74 69 63 20 76 6f 69 64 20 47 65 74 44  static void GetD
9170: 65 66 61 75 6c 74 46 69 6c 65 4e 61 6d 65 73 28  efaultFileNames(
9180: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9190: 20 20 72 65 66 20 73 74 72 69 6e 67 20 64 69 72    ref string dir
91a0: 65 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20  ectory,..       
91b0: 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
91c0: 69 6e 67 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65  ing coreFileName
91d0: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
91e0: 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 6c 69     ref string li
91f0: 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20  nqFileName,..   
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
9210: 20 73 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72   string designer
9220: 46 69 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20  FileName..      
9230: 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
9240: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
9250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
9260: 74 68 69 73 41 73 73 65 6d 62 6c 79 20 3d 3d 20  thisAssembly == 
9270: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
9280: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9290: 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  n;....          
92a0: 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
92b0: 3d 20 50 61 74 68 2e 47 65 74 44 69 72 65 63 74  = Path.GetDirect
92c0: 6f 72 79 4e 61 6d 65 28 74 68 69 73 41 73 73 65  oryName(thisAsse
92d0: 6d 62 6c 79 2e 4c 6f 63 61 74 69 6f 6e 29 3b 0d  mbly.Location);.
92e0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
92f0: 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73     if (String.Is
9300: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72 65  NullOrEmpty(dire
9310: 63 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20  ctory))..       
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
9330: 75 72 6e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  urn;....        
9340: 20 20 20 20 20 20 20 20 63 6f 72 65 46 69 6c 65          coreFile
9350: 4e 61 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62  Name = Path.Comb
9360: 69 6e 65 28 64 69 72 65 63 74 6f 72 79 2c 0d 0a  ine(directory,..
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 49 6e 73 74 61 6c 6c 65 72 2e 43 6f      Installer.Co
9390: 72 65 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  reFileName);....
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 50  linqFileName = P
93c0: 61 74 68 2e 43 6f 6d 62 69 6e 65 28 64 69 72 65  ath.Combine(dire
93d0: 63 74 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20  ctory,..        
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 73 74              Inst
93f0: 61 6c 6c 65 72 2e 4c 69 6e 71 46 69 6c 65 4e 61  aller.LinqFileNa
9400: 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me);....        
9410: 20 20 20 20 20 20 20 20 64 65 73 69 67 6e 65 72          designer
9420: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
9430: 43 6f 6d 62 69 6e 65 28 64 69 72 65 63 74 6f 72  Combine(director
9440: 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
9450: 20 20 20 20 20 20 20 20 49 6e 73 74 61 6c 6c 65          Installe
9460: 72 2e 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  r.DesignerFileNa
9470: 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  me);..          
9480: 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
9490: 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
94a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94d0: 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
94e0: 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
94f0: 61 74 69 63 20 62 6f 6f 6c 20 43 68 65 63 6b 4f  atic bool CheckO
9500: 70 74 69 6f 6e 28 0d 0a 20 20 20 20 20 20 20 20  ption(..        
9510: 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
9520: 6e 67 20 61 72 67 0d 0a 20 20 20 20 20 20 20 20  ng arg..        
9530: 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
9540: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
9550: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
9560: 20 72 65 73 75 6c 74 20 3d 20 61 72 67 3b 0d 0a   result = arg;..
9570: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9580: 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49 73    if (!String.Is
9590: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 72 65 73 75  NullOrEmpty(resu
95a0: 6c 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  lt))..          
95b0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
95d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
95e0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 52 65       // NOTE: Re
95f0: 6d 6f 76 65 20 61 6c 6c 20 6c 65 61 64 69 6e 67  move all leading
9600: 20 73 77 69 74 63 68 20 63 68 61 72 73 2e 0d 0a   switch chars...
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
9630: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
9640: 6c 74 20 3d 20 72 65 73 75 6c 74 2e 54 72 69 6d  lt = result.Trim
9650: 53 74 61 72 74 28 53 77 69 74 63 68 43 68 61 72  Start(SwitchChar
9660: 73 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  s);....         
9670: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 48 6f 77 20     // NOTE: How 
96a0: 6d 61 6e 79 20 63 68 61 72 73 20 77 65 72 65 20  many chars were 
96b0: 72 65 6d 6f 76 65 64 3f 0d 0a 20 20 20 20 20 20  removed?..      
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
96d0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
96e0: 20 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20        int count 
96f0: 3d 20 61 72 67 2e 4c 65 6e 67 74 68 20 2d 20 72  = arg.Length - r
9700: 65 73 75 6c 74 2e 4c 65 6e 67 74 68 3b 0d 0a 0d  esult.Length;...
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9720: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
9740: 4e 4f 54 45 3a 20 57 61 73 20 74 68 65 72 65 20  NOTE: Was there 
9750: 61 74 20 6c 65 61 73 74 20 6f 6e 65 3f 0d 0a 20  at least one?.. 
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9770: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
9780: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
9790: 6f 75 6e 74 20 3e 20 30 29 0d 0a 20 20 20 20 20  ount > 0)..     
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
97b0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
97c0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4f        // NOTE: O
97f0: 6b 2c 20 72 65 70 6c 61 63 65 20 74 68 65 69 72  k, replace their
9800: 20 6f 72 69 67 69 6e 61 6c 0d 0a 20 20 20 20 20   original..     
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 2f 2f 20 20 20 20 20 20 20 61 72 67 75     //       argu
9830: 6d 65 6e 74 2e 0d 0a 20 20 20 20 20 20 20 20 20  ment...         
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9850: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
9860: 20 20 20 20 20 20 20 20 20 20 20 61 72 67 20 3d             arg =
9870: 20 72 65 73 75 6c 74 3b 0d 0a 0d 0a 20 20 20 20   result;....    
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 2f 2f 20 4e 4f 54 45 3a 20 59 65 73 2c 20 74 68  // NOTE: Yes, th
98c0: 69 73 20 69 73 20 61 20 73 77 69 74 63 68 2e 0d  is is a switch..
98d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98e0: 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20           //..   
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
9910: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
9920: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
9930: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9950: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
9960: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
9970: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
9980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
99b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
99c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
99d0: 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
99e0: 6c 20 4d 61 74 63 68 4f 70 74 69 6f 6e 28 0d 0a  l MatchOption(..
99f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a00: 73 74 72 69 6e 67 20 61 72 67 2c 0d 0a 20 20 20  string arg,..   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
9a20: 69 6e 67 20 6f 70 74 69 6f 6e 0d 0a 20 20 20 20  ing option..    
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
9a40: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9a60: 20 28 28 61 72 67 20 3d 3d 20 6e 75 6c 6c 29 20   ((arg == null) 
9a70: 7c 7c 20 28 6f 70 74 69 6f 6e 20 3d 3d 20 6e 75  || (option == nu
9a80: 6c 6c 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ll))..          
9a90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9aa0: 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20   false;....     
9ab0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9ac0: 6e 20 53 74 72 69 6e 67 2e 43 6f 6d 70 61 72 65  n String.Compare
9ad0: 28 61 72 67 2c 20 30 2c 20 6f 70 74 69 6f 6e 2c  (arg, 0, option,
9ae0: 20 30 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20   0,..           
9af0: 20 20 20 20 20 20 20 20 20 61 72 67 2e 4c 65 6e           arg.Len
9b00: 67 74 68 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61  gth, StringCompa
9b10: 72 69 73 6f 6e 2e 4f 72 64 69 6e 61 6c 49 67 6e  rison.OrdinalIgn
9b20: 6f 72 65 43 61 73 65 29 20 3d 3d 20 30 3b 0d 0a  oreCase) == 0;..
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
9b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
9b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 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: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9ba0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
9bb0: 6f 6f 6c 3f 20 50 61 72 73 65 42 6f 6f 6c 65 61  ool? ParseBoolea
9bc0: 6e 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  n(..            
9bd0: 20 20 20 20 73 74 72 69 6e 67 20 74 65 78 74 0d      string text.
9be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9bf0: 20 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   )..            
9c00: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9c10: 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e 49     if (!String.I
9c20: 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 74 65 78  sNullOrEmpty(tex
9c30: 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t))..           
9c40: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
9c60: 20 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20 20 20 20   value;....     
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9c80: 66 20 28 62 6f 6f 6c 2e 54 72 79 50 61 72 73 65  f (bool.TryParse
9c90: 28 74 65 78 74 2c 20 6f 75 74 20 76 61 6c 75 65  (text, out value
9ca0: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
9cc0: 72 6e 20 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20  rn value;..     
9cd0: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 20 20  return null;..  
9d00: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
9d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
9d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d 0a  //////////////..
9d60: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
9d70: 69 76 61 74 65 20 73 74 61 74 69 63 20 6f 62 6a  ivate static obj
9d80: 65 63 74 20 50 61 72 73 65 45 6e 75 6d 28 0d 0a  ect ParseEnum(..
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 54 79 70 65 20 65 6e 75 6d 54 79 70 65 2c 0d 0a  Type enumType,..
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 73 74 72 69 6e 67 20 74 65 78 74 2c 0d 0a 20 20  string text,..  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
9de0: 6f 6c 20 6e 6f 43 61 73 65 0d 0a 20 20 20 20 20  ol noCase..     
9df0: 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20             )..  
9e00: 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9e20: 28 28 65 6e 75 6d 54 79 70 65 20 3d 3d 20 6e 75  ((enumType == nu
9e30: 6c 6c 29 20 7c 7c 20 21 65 6e 75 6d 54 79 70 65  ll) || !enumType
9e40: 2e 49 73 45 6e 75 6d 29 0d 0a 20 20 20 20 20 20  .IsEnum)..      
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
9e60: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20  turn null;....  
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9e80: 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
9e90: 4f 72 45 6d 70 74 79 28 74 65 78 74 29 29 0d 0a  OrEmpty(text))..
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9ec0: 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20 20 20         try..    
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
9ef0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
9f00: 6e 20 45 6e 75 6d 2e 50 61 72 73 65 28 65 6e 75  n Enum.Parse(enu
9f10: 6d 54 79 70 65 2c 20 74 65 78 74 2c 20 6e 6f 43  mType, text, noC
9f20: 61 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ase);..         
9f30: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 63 61 74 63 68 0d 0a 20 20 20 20 20 20 20    catch..       
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 2f 2f 20 64 6f 20 6e 6f          // do no
9f90: 74 68 69 6e 67 2e 0d 0a 20 20 20 20 20 20 20 20  thing...        
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
9fc0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
9fd0: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
9fe0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
9ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
a000: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
a010: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
a020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
a060: 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
a070: 6e 20 50 75 62 6c 69 63 20 53 74 61 74 69 63 20  n Public Static 
a080: 4d 65 74 68 6f 64 73 0d 0a 20 20 20 20 20 20 20  Methods..       
a090: 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74       public stat
a0a0: 69 63 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ic Configuration
a0b0: 20 43 72 65 61 74 65 44 65 66 61 75 6c 74 28 29   CreateDefault()
a0c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
a0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a0e0: 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72   string director
a0f0: 79 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20  y = null;..     
a100: 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
a110: 67 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 20 3d  g coreFileName =
a120: 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20   null;..        
a130: 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6c          string l
a140: 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 6e 75  inqFileName = nu
a150: 6c 6c 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll;..           
a160: 20 20 20 20 20 73 74 72 69 6e 67 20 64 65 73 69       string desi
a170: 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 6e  gnerFileName = n
a180: 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ull;....        
a190: 20 20 20 20 20 20 20 20 47 65 74 44 65 66 61 75          GetDefau
a1a0: 6c 74 46 69 6c 65 4e 61 6d 65 73 28 0d 0a 20 20  ltFileNames(..  
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 72 65 66 20 64 69 72 65 63 74 6f 72 79 2c    ref directory,
a1d0: 20 72 65 66 20 63 6f 72 65 46 69 6c 65 4e 61 6d   ref coreFileNam
a1e0: 65 2c 20 72 65 66 20 6c 69 6e 71 46 69 6c 65 4e  e, ref linqFileN
a1f0: 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ame,..          
a200: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 64 65            ref de
a210: 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 3b  signerFileName);
a220: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
a230: 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20 43      return new C
a240: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 28 0d 0a 20  onfiguration(.. 
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a260: 20 20 20 74 68 69 73 41 73 73 65 6d 62 6c 79 2c     thisAssembly,
a270: 20 6e 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79   null, directory
a280: 2c 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 2c 20  , coreFileName, 
a290: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 2c 0d 0a 20  linqFileName,.. 
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2b0: 20 20 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e     designerFileN
a2c0: 61 6d 65 2c 20 49 6e 73 74 61 6c 6c 46 6c 61 67  ame, InstallFlag
a2d0: 73 2e 44 65 66 61 75 6c 74 2c 20 74 72 75 65 2c  s.Default, true,
a2e0: 20 66 61 6c 73 65 2c 20 74 72 75 65 2c 0d 0a 20   false, true,.. 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c     false, false,
a310: 20 66 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66   false, false, f
a320: 61 6c 73 65 2c 20 66 61 6c 73 65 2c 20 66 61 6c  alse, false, fal
a330: 73 65 2c 20 74 72 75 65 2c 0d 0a 20 20 20 20 20  se, true,..     
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
a350: 72 75 65 2c 20 66 61 6c 73 65 29 3b 0d 0a 20 20  rue, false);..  
a360: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
a370: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
a380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a3a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a3b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
a3c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
a3d0: 62 6c 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c  blic static bool
a3e0: 20 46 72 6f 6d 41 72 67 73 28 0d 0a 20 20 20 20   FromArgs(..    
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
a400: 6e 67 5b 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20  ng[] args,..    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
a420: 20 73 74 72 69 63 74 2c 0d 0a 20 20 20 20 20 20   strict,..      
a430: 20 20 20 20 20 20 20 20 20 20 72 65 66 20 43 6f            ref Co
a440: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66  nfiguration conf
a450: 69 67 75 72 61 74 69 6f 6e 2c 0d 0a 20 20 20 20  iguration,..    
a460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
a470: 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0d                ).
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4b0: 74 72 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20  try..           
a4c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a4e0: 61 72 67 73 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  args == null).. 
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
a510: 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
a520: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
a530: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20  onfiguration == 
a540: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
a560: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 20 43  onfiguration = C
a570: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 72 65  onfiguration.Cre
a580: 61 74 65 44 65 66 61 75 6c 74 28 29 3b 0d 0a 0d  ateDefault();...
a590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a5a0: 20 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20       int length 
a5b0: 3d 20 61 72 67 73 2e 4c 65 6e 67 74 68 3b 0d 0a  = args.Length;..
a5c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a5d0: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69        for (int i
a5e0: 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78 20  ndex = 0; index 
a5f0: 3c 20 6c 65 6e 67 74 68 3b 20 69 6e 64 65 78 2b  < length; index+
a600: 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  +)..            
a610: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 73 74 72 69 6e 67 20 61 72 67 20 3d 20     string arg = 
a640: 61 72 67 73 5b 69 6e 64 65 78 5d 3b 0d 0a 0d 0a  args[index];....
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69          if (Stri
a670: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
a680: 28 61 72 67 29 29 0d 0a 20 20 20 20 20 20 20 20  (arg))..        
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d      continue;...
a6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6c0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
a6d0: 6e 65 77 41 72 67 20 3d 20 61 72 67 3b 0d 0a 0d  newArg = arg;...
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6f0: 20 20 20 20 20 20 20 20 20 69 66 20 28 43 68 65           if (Che
a700: 63 6b 4f 70 74 69 6f 6e 28 72 65 66 20 6e 65 77  ckOption(ref new
a710: 41 72 67 29 29 0d 0a 20 20 20 20 20 20 20 20 20  Arg))..         
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a730: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
a750: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
a770: 20 4e 4f 54 45 3a 20 41 6c 6c 20 74 68 65 20 73   NOTE: All the s
a780: 75 70 70 6f 72 74 65 64 20 63 6f 6d 6d 61 6e 64  upported command
a790: 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 6d 75   line options mu
a7a0: 73 74 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  st..            
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 2f 2f 20 20 20 20 20 20 20 68 61 76 65 20 61 20  //       have a 
a7d0: 76 61 6c 75 65 3b 20 74 68 65 72 65 66 6f 72 65  value; therefore
a7e0: 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 64 76  , attempt to adv
a7f0: 61 6e 63 65 0d 0a 20 20 20 20 20 20 20 20 20 20  ance..          
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20 69 74    //       to it
a820: 20 6e 6f 77 2e 20 20 49 66 20 77 65 20 66 61 69   now.  If we fai
a830: 6c 2c 20 77 65 20 61 72 65 20 64 6f 6e 65 2e 0d  l, we are done..
a840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
a860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a870: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
a880: 65 78 2b 2b 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ex++;....       
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8a0: 20 20 20 20 20 69 66 20 28 69 6e 64 65 78 20 3e       if (index >
a8b0: 3d 20 6c 65 6e 67 74 68 29 0d 0a 20 20 20 20 20  = length)..     
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
a900: 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65  = TraceOps.Trace
a910: 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c         traceCall
a940: 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
a950: 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4d                "M
a980: 69 73 73 69 6e 67 20 76 61 6c 75 65 20 66 6f 72  issing value for
a990: 20 6f 70 74 69 6f 6e 3a 20 7b 30 7d 22 2c 0d 0a   option: {0}",..
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
a9d0: 61 79 28 61 72 67 29 29 2c 20 74 72 61 63 65 43  ay(arg)), traceC
a9e0: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
aa10: 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20  (strict)..      
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
aa40: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20  turn false;.... 
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
aa70: 72 65 61 6b 3b 0d 0a 20 20 20 20 20 20 20 20 20  reak;..         
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aad0: 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61      // NOTE: Gra
aae0: 62 20 74 68 65 20 74 65 78 74 75 61 6c 20 76 61  b the textual va
aaf0: 6c 75 65 20 6f 66 20 74 68 69 73 20 63 6f 6d 6d  lue of this comm
ab00: 61 6e 64 20 6c 69 6e 65 0d 0a 20 20 20 20 20 20  and line..      
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f        //       o
ab30: 70 74 69 6f 6e 2e 0d 0a 20 20 20 20 20 20 20 20  ption...        
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 73 74 72 69 6e 67 20 74 65 78 74 20      string text 
ab80: 3d 20 61 72 67 73 5b 69 6e 64 65 78 5d 3b 0d 0a  = args[index];..
ab90: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
abb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
abd0: 20 4e 4f 54 45 3a 20 46 69 67 75 72 65 20 6f 75   NOTE: Figure ou
abe0: 74 20 77 68 69 63 68 20 63 6f 6d 6d 61 6e 64 20  t which command 
abf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 74 68 69 73  line option this
ac00: 20 69 73 0d 0a 20 20 20 20 20 20 20 20 20 20 20   is..           
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 2f 2f 20 20 20 20 20 20 20 28 62 61 73 65 64   //       (based
ac30: 20 6f 6e 20 61 20 70 61 72 74 69 61 6c 20 6e 61   on a partial na
ac40: 6d 65 20 6d 61 74 63 68 29 20 61 6e 64 20 74 68  me match) and th
ac50: 65 6e 20 74 72 79 0d 0a 20 20 20 20 20 20 20 20  en try..        
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 74 6f 20      //       to 
ac80: 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 74 65  interpret the te
ac90: 78 74 75 61 6c 20 76 61 6c 75 65 20 61 73 20 74  xtual value as t
aca0: 68 65 20 63 6f 72 72 65 63 74 0d 0a 20 20 20 20  he correct..    
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
acd0: 20 74 79 70 65 2e 0d 0a 20 20 20 20 20 20 20 20   type...        
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 20 20 20 69 66 20 28 4d 61 74 63 68 4f 70 74      if (MatchOpt
ad20: 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 73 74 72  ion(newArg, "str
ad30: 69 63 74 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ict"))..        
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
ad80: 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
ad90: 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
adc0: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae10: 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
ae20: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
ae30: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
ae40: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
ae80: 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
ae90: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c  ForDisplay(arg),
aed0: 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74   ForDisplay(text
aee0: 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
af10: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d      if (strict).
af50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
af80: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
afb0: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b000: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b020: 20 20 2f 2f 20 4e 4f 54 45 3a 20 41 6c 6c 6f 77    // NOTE: Allow
b030: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
b040: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6f  e arguments to o
b050: 76 65 72 72 69 64 65 0d 0a 20 20 20 20 20 20 20  verride..       
b060: 20 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 2f 2f 20 20 20 20 20           //     
b080: 20 20 74 68 65 20 22 73 74 72 69 63 74 6e 65 73    the "strictnes
b090: 73 22 20 73 65 74 74 69 6e 67 20 70 72 6f 76 69  s" setting provi
b0a0: 64 65 64 20 62 79 20 6f 75 72 20 63 61 6c 6c 65  ded by our calle
b0b0: 72 2e 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r...            
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20      //..        
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 20 20 20 20 20 20 20 20 73 74 72 69 63 74 20 3d          strict =
b100: 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20   (bool)value;.. 
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
b150: 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e  f (MatchOption(n
b160: 65 77 41 72 67 2c 20 22 6c 6f 67 46 69 6c 65 4e  ewArg, "logFileN
b170: 61 6d 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ame"))..        
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
b1c0: 74 69 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65  tion.logFileName
b1d0: 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20   = text;..      
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b210: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
b220: 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
b230: 2c 20 22 64 69 72 65 63 74 6f 72 79 22 29 29 0d  , "directory")).
b240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
b260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69  configuration.di
b290: 72 65 63 74 6f 72 79 20 3d 20 74 65 78 74 3b 0d  rectory = text;.
b2a0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20     //..         
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
b2f0: 2a 53 50 45 43 49 41 4c 2a 20 4d 75 73 74 20 72  *SPECIAL* Must r
b300: 65 66 72 65 73 68 20 74 68 65 20 66 69 6c 65 20  efresh the file 
b310: 6e 61 6d 65 73 0d 0a 20 20 20 20 20 20 20 20 20  names..         
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
b340: 68 65 72 65 20 62 65 63 61 75 73 65 20 74 68 65  here because the
b350: 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 69 72 65   underlying dire
b360: 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20 20  ctory..         
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20         //       
b390: 68 61 73 20 63 68 61 6e 67 65 64 2e 0d 0a 20 20  has changed...  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
b3c0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 73 74 72 69 6e 67 20 63 6f 72 65 46 69 6c    string coreFil
b3f0: 65 4e 61 6d 65 20 3d 20 63 6f 6e 66 69 67 75 72  eName = configur
b400: 61 74 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61  ation.coreFileNa
b410: 6d 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  me;....         
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72 69         if (!Stri
b440: 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79  ng.IsNullOrEmpty
b450: 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29 0d  (coreFileName)).
b460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61 6d       coreFileNam
b490: 65 20 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65  e = Path.GetFile
b4a0: 4e 61 6d 65 28 63 6f 72 65 46 69 6c 65 4e 61 6d  Name(coreFileNam
b4b0: 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 20 20 20 20 20 20 20 69 66 20 28 53 74 72 69 6e         if (Strin
b4e0: 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28  g.IsNullOrEmpty(
b4f0: 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29 0d 0a  coreFileName))..
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 20 20 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65      coreFileName
b530: 20 3d 20 49 6e 73 74 61 6c 6c 65 72 2e 43 6f 72   = Installer.Cor
b540: 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  eFileName;....  
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b570: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 63 6f 72 65  nfiguration.core
b580: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
b590: 43 6f 6d 62 69 6e 65 28 0d 0a 20 20 20 20 20 20  Combine(..      
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
b5c0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69 72 65  nfiguration.dire
b5d0: 63 74 6f 72 79 2c 20 63 6f 72 65 46 69 6c 65 4e  ctory, coreFileN
b5e0: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20           string 
b610: 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 63  linqFileName = c
b620: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 69 6e  onfiguration.lin
b630: 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20  qFileName;....  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b660: 20 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c   (!String.IsNull
b670: 4f 72 45 6d 70 74 79 28 6c 69 6e 71 46 69 6c 65  OrEmpty(linqFile
b680: 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20  Name))..        
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 71              linq
b6b0: 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74 68 2e  FileName = Path.
b6c0: 47 65 74 46 69 6c 65 4e 61 6d 65 28 6c 69 6e 71  GetFileName(linq
b6d0: 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20  FileName);....  
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
b700: 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f   (String.IsNullO
b710: 72 45 6d 70 74 79 28 6c 69 6e 71 46 69 6c 65 4e  rEmpty(linqFileN
b720: 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  ame))..         
b730: 20 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 20 20 6c 69 6e 71 46             linqF
b750: 69 6c 65 4e 61 6d 65 20 3d 20 49 6e 73 74 61 6c  ileName = Instal
b760: 6c 65 72 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65  ler.LinqFileName
b770: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
b7a0: 6f 6e 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20  on.linqFileName 
b7b0: 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e 65 28 0d  = Path.Combine(.
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
b7f0: 6f 6e 2e 64 69 72 65 63 74 6f 72 79 2c 20 6c 69  on.directory, li
b800: 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  nqFileName);....
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 73 74 72 69 6e 67 20 64 65 73 69 67 6e 65 72 46  string designerF
b840: 69 6c 65 4e 61 6d 65 20 3d 20 63 6f 6e 66 69 67  ileName = config
b850: 75 72 61 74 69 6f 6e 2e 64 65 73 69 67 6e 65 72  uration.designer
b860: 46 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20  FileName;....   
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
b890: 28 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f  (!String.IsNullO
b8a0: 72 45 6d 70 74 79 28 64 65 73 69 67 6e 65 72 46  rEmpty(designerF
b8b0: 69 6c 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20  ileName))..     
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
b8e0: 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20  esignerFileName 
b8f0: 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e 61  = Path.GetFileNa
b900: 6d 65 28 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  me(designerFileN
b910: 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 69 66 20 28 53 74 72           if (Str
b940: 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70 74  ing.IsNullOrEmpt
b950: 79 28 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  y(designerFileNa
b960: 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  me))..          
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 20 20 20 20 20 20 20 20 20 20 64 65 73 69 67 6e            design
b990: 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 49 6e 73  erFileName = Ins
b9a0: 74 61 6c 6c 65 72 2e 44 65 73 69 67 6e 65 72 46  taller.DesignerF
b9b0: 69 6c 65 4e 61 6d 65 3b 0d 0a 0d 0a 20 20 20 20  ileName;....    
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
b9e0: 69 67 75 72 61 74 69 6f 6e 2e 64 65 73 69 67 6e  iguration.design
b9f0: 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 50 61 74  erFileName = Pat
ba00: 68 2e 43 6f 6d 62 69 6e 65 28 0d 0a 20 20 20 20  h.Combine(..    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 64 69  configuration.di
ba40: 72 65 63 74 6f 72 79 2c 20 64 65 73 69 67 6e 65  rectory, designe
ba50: 72 46 69 6c 65 4e 61 6d 65 29 3b 0d 0a 20 20 20  rFileName);..   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
baa0: 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
bab0: 41 72 67 2c 20 22 63 6f 72 65 46 69 6c 65 4e 61  Arg, "coreFileNa
bac0: 6d 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20  me"))..         
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
bb10: 69 6f 6e 2e 63 6f 72 65 46 69 6c 65 4e 61 6d 65  ion.coreFileName
bb20: 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20 20 20   = text;..      
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb40: 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61       else if (Ma
bb70: 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67  tchOption(newArg
bb80: 2c 20 22 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 22  , "linqFileName"
bb90: 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
bbe0: 2e 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20  .linqFileName = 
bbf0: 74 65 78 74 3b 0d 0a 20 20 20 20 20 20 20 20 20  text;..         
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
bc40: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
bc50: 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  designerFileName
bc60: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
bcb0: 6e 2e 64 65 73 69 67 6e 65 72 46 69 6c 65 4e 61  n.designerFileNa
bcc0: 6d 65 20 3d 20 74 65 78 74 3b 0d 0a 20 20 20 20  me = text;..    
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
bd10: 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41  MatchOption(newA
bd20: 72 67 2c 20 22 69 6e 73 74 61 6c 6c 46 6c 61 67  rg, "installFlag
bd30: 73 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  s"))..          
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75       object valu
bd80: 65 20 3d 20 50 61 72 73 65 45 6e 75 6d 28 0d 0a  e = ParseEnum(..
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 74 79 70 65 6f 66 28 49 6e 73 74 61      typeof(Insta
bdc0: 6c 6c 46 6c 61 67 73 29 2c 20 74 65 78 74 2c 20  llFlags), text, 
bdd0: 74 72 75 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  true);....      
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
be00: 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
be30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
be60: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
be70: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
be80: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 22 49 6e 76 61 6c 69 64 20 69 6e 73 74     "Invalid inst
bec0: 61 6c 6c 20 66 6c 61 67 73 20 76 61 6c 75 65 3a  all flags value:
bed0: 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {0}",..        
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29  ForDisplay(text)
bf10: 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ), traceCategory
bf20: 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74            if (st
bf50: 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20  rict)..         
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
bf80: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a  eturn false;....
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
bfc0: 20 20 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 20 20 20 20 20 7d                 }
bfe0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f      configuratio
c010: 6e 2e 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 3d  n.installFlags =
c020: 20 28 49 6e 73 74 61 6c 6c 46 6c 61 67 73 29 76   (InstallFlags)v
c030: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
c080: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
c090: 69 6e 73 74 61 6c 6c 22 29 29 0d 0a 20 20 20 20  install"))..    
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
c0e0: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
c0f0: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
c130: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
c180: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
c190: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
c1a0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
c1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
c1e0: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
c1f0: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
c230: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
c240: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
c280: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
c2b0: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
c2e0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c340: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c360: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
c370: 69 6e 73 74 61 6c 6c 20 3d 20 28 62 6f 6f 6c 29  install = (bool)
c380: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
c3d0: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
c3e0: 22 77 68 61 74 49 66 22 29 29 0d 0a 20 20 20 20  "whatIf"))..    
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c400: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
c430: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
c440: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
c480: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4c0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
c4d0: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
c4e0: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
c4f0: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
c500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
c530: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
c540: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c570: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
c580: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
c590: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
c5d0: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
c600: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
c630: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c660: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c690: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6b0: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
c6c0: 77 68 61 74 49 66 20 3d 20 28 62 6f 6f 6c 29 76  whatIf = (bool)v
c6d0: 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alue;..         
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63 68    else if (Match
c720: 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22  Option(newArg, "
c730: 76 65 72 62 6f 73 65 22 29 29 0d 0a 20 20 20 20  verbose"))..    
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
c780: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
c790: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
c7d0: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
c820: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
c830: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
c840: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
c850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
c880: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
c890: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
c8a0: 20 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 20 20 20 20 20 20 20                  
c8c0: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
c8d0: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
c8e0: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
c920: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
c950: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
c980: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
c9e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
ca10: 76 65 72 62 6f 73 65 20 3d 20 28 62 6f 6f 6c 29  verbose = (bool)
ca20: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
ca70: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
ca80: 22 63 6f 6e 66 69 72 6d 22 29 29 0d 0a 20 20 20  "confirm"))..   
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
cad0: 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42  ? value = ParseB
cae0: 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d  oolean(text);...
caf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75   if (value == nu
cb20: 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
cb70: 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61  r = TraceOps.Tra
cb80: 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
cb90: 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
cba0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c            "Inval
cbd0: 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76  id {0} boolean v
cbe0: 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20  alue: {1}",..   
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28       ForDisplay(
cc20: 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79  arg), ForDisplay
cc30: 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20  (text)),..      
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
cc70: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc90: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72           if (str
cca0: 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ict)..          
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
ccd0: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20  turn false;.... 
cce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd00: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20     continue;..  
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
cd30: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e     configuration
cd60: 2e 63 6f 6e 66 69 72 6d 20 3d 20 28 62 6f 6f 6c  .confirm = (bool
cd70: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
cdc0: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
cdd0: 20 22 6e 6f 44 65 73 6b 74 6f 70 22 29 29 0d 0a   "noDesktop"))..
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
ce20: 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72  ool? value = Par
ce30: 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b  seBoolean(text);
ce40: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d      if (value ==
ce70: 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
cec0: 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e  rror = TraceOps.
ced0: 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
cee0: 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
cef0: 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e               "In
cf20: 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61  valid {0} boolea
cf30: 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a  n value: {1}",..
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c          ForDispl
cf70: 61 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70  ay(arg), ForDisp
cf80: 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20  lay(text)),..   
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfb0: 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
cfc0: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
cff0: 73 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20  strict)..       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
d030: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
d060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74        configurat
d0b0: 69 6f 6e 2e 6e 6f 44 65 73 6b 74 6f 70 20 3d 20  ion.noDesktop = 
d0c0: 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20  (bool)value;..  
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0e0: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
d110: 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65   (MatchOption(ne
d120: 77 41 72 67 2c 20 22 6e 6f 43 6f 6d 70 61 63 74  wArg, "noCompact
d130: 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  "))..           
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20      bool? value 
d180: 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74  = ParseBoolean(t
d190: 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ext);....       
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
d1c0: 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ue == null)..   
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63      error = Trac
d220: 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65  eOps.Trace(trace
d230: 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67  Callback, String
d240: 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62    "Invalid {0} b
d280: 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31  oolean value: {1
d290: 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
d2c0: 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f  Display(arg), Fo
d2d0: 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c  rDisplay(text)),
d2e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
d310: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20   if (strict)..  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
d380: 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  se;....         
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
d3b0: 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
d400: 67 75 72 61 74 69 6f 6e 2e 6e 6f 43 6f 6d 70 61  guration.noCompa
d410: 63 74 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65  ct = (bool)value
d420: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
d440: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
d460: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
d470: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 4e 65  on(newArg, "noNe
d480: 74 46 78 32 30 22 29 29 0d 0a 20 20 20 20 20 20  tFx20"))..      
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76           bool? v
d4d0: 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c  alue = ParseBool
d4e0: 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20  ean(text);....  
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d510: 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29   (value == null)
d520: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
d570: 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
d580: 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
d590: 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20         "Invalid 
d5d0: 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  {0} boolean valu
d5e0: 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20  e: {1}",..      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
d620: 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65  ), ForDisplay(te
d630: 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  xt)),..         
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
d660: 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
d670: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63 74        if (strict
d6a0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
d6d0: 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20  n false;....    
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20  continue;..     
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f  configuration.no
d760: 4e 65 74 46 78 32 30 20 3d 20 28 62 6f 6f 6c 29  NetFx20 = (bool)
d770: 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  value;..        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74 63     else if (Matc
d7c0: 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c 20  hOption(newArg, 
d7d0: 22 6e 6f 4e 65 74 46 78 34 30 22 29 29 0d 0a 20  "noNetFx40")).. 
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f                bo
d820: 6f 6c 3f 20 76 61 6c 75 65 20 3d 20 50 61 72 73  ol? value = Pars
d830: 65 42 6f 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d  eBoolean(text);.
d840: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 69 66 20 28 76 61 6c 75 65 20 3d 3d 20     if (value == 
d870: 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
d8c0: 72 6f 72 20 3d 20 54 72 61 63 65 4f 70 73 2e 54  ror = TraceOps.T
d8d0: 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61  race(traceCallba
d8e0: 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ck, String.Forma
d8f0: 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 76              "Inv
d920: 61 6c 69 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e  alid {0} boolean
d930: 20 76 61 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20   value: {1}",.. 
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
d970: 79 28 61 72 67 29 2c 20 46 6f 72 44 69 73 70 6c  y(arg), ForDispl
d980: 61 79 28 74 65 78 74 29 29 2c 0d 0a 20 20 20 20  ay(text)),..    
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
d9c0: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73             if (s
d9f0: 74 72 69 63 74 29 0d 0a 20 20 20 20 20 20 20 20  trict)..        
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
da30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a       continue;..
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61 74 69       configurati
dab0: 6f 6e 2e 6e 6f 4e 65 74 46 78 34 30 20 3d 20 28  on.noNetFx40 = (
dac0: 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a 20 20 20  bool)value;..   
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
db10: 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28 6e 65 77  (MatchOption(new
db20: 41 72 67 2c 20 22 6e 6f 56 73 32 30 30 38 22 29  Arg, "noVs2008")
db30: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
db50: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65 20 3d 20    bool? value = 
db80: 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28 74 65 78  ParseBoolean(tex
db90: 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  t);....         
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
dbc0: 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f    error = TraceO
dc20: 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61  ps.Trace(traceCa
dc30: 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46  llback, String.F
dc40: 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20 62 6f 6f  "Invalid {0} boo
dc80: 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b 31 7d 22  lean value: {1}"
dc90: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 46 6f 72 44 69             ForDi
dcc0: 73 70 6c 61 79 28 61 72 67 29 2c 20 46 6f 72 44  splay(arg), ForD
dcd0: 69 73 70 6c 61 79 28 74 65 78 74 29 29 2c 0d 0a  isplay(text)),..
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
dd10: 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
dd40: 66 20 28 73 74 72 69 63 74 29 0d 0a 20 20 20 20  f (strict)..    
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
dd80: 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
ddb0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
de00: 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30 30 38 20  ration.noVs2008 
de10: 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65 3b 0d 0a  = (bool)value;..
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
de60: 69 66 20 28 4d 61 74 63 68 4f 70 74 69 6f 6e 28  if (MatchOption(
de70: 6e 65 77 41 72 67 2c 20 22 6e 6f 56 73 32 30 31  newArg, "noVs201
de80: 30 22 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  0"))..          
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c 75 65       bool? value
ded0: 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61 6e 28   = ParseBoolean(
dee0: 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  text);....      
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61            if (va
df10: 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  lue == null)..  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
df40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72 61       error = Tra
df70: 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63  ceOps.Trace(trac
df80: 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e  eCallback, Strin
df90: 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20  g.Format(..     
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfc0: 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30 7d 20     "Invalid {0} 
dfd0: 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 7b  boolean value: {
dfe0: 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  1}",..          
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f                Fo
e010: 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c 20 46  rDisplay(arg), F
e020: 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74 29 29  orDisplay(text))
e030: 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e050: 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
e060: 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e090: 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
e0d0: 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
e100: 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  inue;..         
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66              conf
e150: 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 56 73 32 30  iguration.noVs20
e160: 31 30 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75 65  10 = (bool)value
e170: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
e190: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
e1b0: 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74 69  se if (MatchOpti
e1c0: 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 54 72  on(newArg, "noTr
e1d0: 61 63 65 22 29 29 0d 0a 20 20 20 20 20 20 20 20  ace"))..        
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20 76 61 6c         bool? val
e220: 75 65 20 3d 20 50 61 72 73 65 42 6f 6f 6c 65 61  ue = ParseBoolea
e230: 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20 20 20 20  n(text);....    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
e260: 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  value == null)..
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2b0: 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54         error = T
e2c0: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
e2d0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
e2e0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 22 49 6e 76 61 6c 69 64 20 7b 30       "Invalid {0
e320: 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a  } boolean value:
e330: 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20   {1}",..        
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67 29 2c  ForDisplay(arg),
e370: 20 46 6f 72 44 69 73 70 6c 61 79 28 74 65 78 74   ForDisplay(text
e380: 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
e3b0: 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d      if (strict).
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
e420: 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
e450: 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20  ntinue;..       
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
e4a0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 54 72  nfiguration.noTr
e4b0: 61 63 65 20 3d 20 28 62 6f 6f 6c 29 76 61 6c 75  ace = (bool)valu
e4c0: 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
e500: 6c 73 65 20 69 66 20 28 4d 61 74 63 68 4f 70 74  lse if (MatchOpt
e510: 69 6f 6e 28 6e 65 77 41 72 67 2c 20 22 6e 6f 43  ion(newArg, "noC
e520: 6f 6e 73 6f 6c 65 22 29 29 0d 0a 20 20 20 20 20  onsole"))..     
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f 20            bool? 
e570: 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f 6f  value = ParseBoo
e580: 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a 20  lean(text);.... 
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
e5b0: 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c  f (value == null
e5c0: 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e600: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
e610: 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65  = TraceOps.Trace
e620: 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
e630: 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69 64          "Invalid
e670: 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61 6c   {0} boolean val
e680: 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  ue: {1}",..     
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72     ForDisplay(ar
e6c0: 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 74  g), ForDisplay(t
e6d0: 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20 20  ext)),..        
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
e710: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69 63         if (stric
e740: 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e770: 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7a0: 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20 20   continue;..    
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
e7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6e   configuration.n
e800: 6f 43 6f 6e 73 6f 6c 65 20 3d 20 28 62 6f 6f 6c  oConsole = (bool
e810: 29 76 61 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20  )value;..       
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 65 6c 73 65 20 69 66 20 28 4d 61 74      else if (Mat
e860: 63 68 4f 70 74 69 6f 6e 28 6e 65 77 41 72 67 2c  chOption(newArg,
e870: 20 22 6e 6f 4c 6f 67 22 29 29 0d 0a 20 20 20 20   "noLog"))..    
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 3f             bool?
e8c0: 20 76 61 6c 75 65 20 3d 20 50 61 72 73 65 42 6f   value = ParseBo
e8d0: 6f 6c 65 61 6e 28 74 65 78 74 29 3b 0d 0a 0d 0a  olean(text);....
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 69 66 20 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c  if (value == nul
e910: 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e930: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
e960: 20 3d 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63   = TraceOps.Trac
e970: 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
e980: 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
e990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 20 20 20 20 20 20 20 22 49 6e 76 61 6c 69           "Invali
e9c0: 64 20 7b 30 7d 20 62 6f 6f 6c 65 61 6e 20 76 61  d {0} boolean va
e9d0: 6c 75 65 3a 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  lue: {1}",..    
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61      ForDisplay(a
ea10: 72 67 29 2c 20 46 6f 72 44 69 73 70 6c 61 79 28  rg), ForDisplay(
ea20: 74 65 78 74 29 29 2c 0d 0a 20 20 20 20 20 20 20  text)),..       
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
ea60: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 69 66 20 28 73 74 72 69          if (stri
ea90: 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
eac0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20  urn false;....  
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaf0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
eb20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
eb50: 6e 6f 4c 6f 67 20 3d 20 28 62 6f 6f 6c 29 76 61  noLog = (bool)va
eb60: 6c 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lue;..          
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 54 72        error = Tr
ebf0: 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61  aceOps.Trace(tra
ec00: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
ec10: 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 22 55 6e 73 75 70 70 6f 72 74 65 64 20 63 6f 6d  "Unsupported com
ec50: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
ec60: 3a 20 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20  : {0}",..       
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
ec90: 44 69 73 70 6c 61 79 28 61 72 67 29 29 2c 20 74  Display(arg)), t
eca0: 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
ecb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a 20    if (strict).. 
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
ed10: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
ed30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ed40: 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed60: 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20      else..      
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 65 72 72 6f 72 20 3d 20 54 72 61 63 65 4f 70   error = TraceOp
edb0: 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  s.Trace(traceCal
edc0: 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f  lback, String.Fo
edd0: 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20  rmat(..         
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 22 55 6e 73 75 70 70 6f 72         "Unsuppor
ee00: 74 65 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ted command line
ee10: 20 61 72 67 75 6d 65 6e 74 3a 20 7b 30 7d 22 2c   argument: {0}",
ee20: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 46 6f 72 44 69 73 70 6c 61 79 28 61 72 67    ForDisplay(arg
ee50: 29 29 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72  )), traceCategor
ee60: 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 69 66 20 28 73 74 72 69 63 74 29 0d 0a     if (strict)..
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
eef0: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ef00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72         return tr
ef10: 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ue;..           
ef20: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
ef30: 20 20 20 20 20 20 20 20 63 61 74 63 68 20 28 45          catch (E
ef40: 78 63 65 70 74 69 6f 6e 20 65 29 0d 0a 20 20 20  xception e)..   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
ef80: 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
ef90: 2c 20 65 2c 20 74 72 61 63 65 43 61 74 65 67 6f  , e, traceCatego
efa0: 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
efc0: 72 20 3d 20 22 46 61 69 6c 65 64 20 74 6f 20 6d  r = "Failed to m
efd0: 6f 64 69 66 79 20 63 6f 6e 66 69 67 75 72 61 74  odify configurat
efe0: 69 6f 6e 2e 22 3b 0d 0a 20 20 20 20 20 20 20 20  ion.";..        
eff0: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f010: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
f020: 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
f030: 20 20 20 20 20 20 20 20 20 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 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
f080: 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
f090: 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50  ic static bool P
f0a0: 72 6f 63 65 73 73 28 0d 0a 20 20 20 20 20 20 20  rocess(..       
f0b0: 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b           string[
f0c0: 5d 20 61 72 67 73 2c 0d 0a 20 20 20 20 20 20 20  ] args,..       
f0d0: 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75           Configu
f0e0: 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61  ration configura
f0f0: 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  tion,..         
f100: 20 20 20 20 20 20 20 62 6f 6f 6c 20 73 74 72 69         bool stri
f110: 63 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct,..           
f120: 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
f130: 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
f140: 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
f150: 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
f160: 20 20 20 20 20 20 20 20 20 74 72 79 0d 0a 20 20           try..  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
f180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f190: 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75       if (configu
f1a0: 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c 6c 29 0d  ration == null).
f1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f1c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
f1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1e0: 65 72 72 6f 72 20 3d 20 22 49 6e 76 61 6c 69 64  error = "Invalid
f1f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22   configuration."
f200: 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
f210: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
f220: 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
f240: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
f250: 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c 79 20         Assembly 
f260: 61 73 73 65 6d 62 6c 79 20 3d 20 63 6f 6e 66 69  assembly = confi
f270: 67 75 72 61 74 69 6f 6e 2e 61 73 73 65 6d 62 6c  guration.assembl
f280: 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y;....          
f290: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 61 73            if (as
f2a0: 73 65 6d 62 6c 79 20 3d 3d 20 6e 75 6c 6c 29 0d  sembly == null).
f2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2c0: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
f2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2e0: 65 72 72 6f 72 20 3d 20 22 49 6e 76 61 6c 69 64  error = "Invalid
f2f0: 20 61 73 73 65 6d 62 6c 79 2e 22 3b 0d 0a 20 20   assembly.";..  
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
f320: 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
f330: 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75 72 61    if (!configura
f360: 74 69 6f 6e 2e 6e 6f 54 72 61 63 65 29 0d 0a 20  tion.noTrace).. 
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
f3a0: 20 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   (!configuration
f3b0: 2e 6e 6f 4c 6f 67 20 26 26 0d 0a 20 20 20 20 20  .noLog &&..     
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 20 20 20 20 20 20 53 74 72 69 6e 67 2e 49 73         String.Is
f3e0: 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 63 6f 6e 66  NullOrEmpty(conf
f3f0: 69 67 75 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c  iguration.logFil
f400: 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20  eName))..       
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 6c 6f  configuration.lo
f450: 67 46 69 6c 65 4e 61 6d 65 20 3d 20 47 65 74 4c  gFileName = GetL
f460: 6f 67 46 69 6c 65 4e 61 6d 65 28 29 3b 0d 0a 20  ogFileName();.. 
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
f4b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
f4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66         if (!conf
f500: 69 67 75 72 61 74 69 6f 6e 2e 6e 6f 43 6f 6e 73  iguration.noCons
f510: 6f 6c 65 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ole)..          
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
f530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61               Tra
f550: 63 65 2e 4c 69 73 74 65 6e 65 72 73 2e 41 64 64  ce.Listeners.Add
f560: 28 6e 65 77 20 43 6f 6e 73 6f 6c 65 54 72 61 63  (new ConsoleTrac
f570: 65 4c 69 73 74 65 6e 65 72 28 29 29 3b 0d 0a 20  eListener());.. 
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75      if (!configu
f5c0: 72 61 74 69 6f 6e 2e 6e 6f 4c 6f 67 20 26 26 0d  ration.noLog &&.
f5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 21 53 74               !St
f5f0: 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45 6d 70  ring.IsNullOrEmp
f600: 74 79 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ty(configuration
f610: 2e 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 0d 0a  .logFileName))..
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 54 72 61 63 65 2e 4c 69 73         Trace.Lis
f660: 74 65 6e 65 72 73 2e 41 64 64 28 6e 65 77 20 54  teners.Add(new T
f670: 65 78 74 57 72 69 74 65 72 54 72 61 63 65 4c 69  extWriterTraceLi
f680: 73 74 65 6e 65 72 28 0d 0a 20 20 20 20 20 20 20  stener(..       
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
f6b0: 72 61 74 69 6f 6e 2e 6c 6f 67 46 69 6c 65 4e 61  ration.logFileNa
f6c0: 6d 65 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  me));..         
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
f6e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f6f0: 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f710: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
f720: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
f730: 44 75 6d 70 20 74 68 65 20 63 6f 6e 66 69 67 75  Dump the configu
f740: 72 61 74 69 6f 6e 20 6e 6f 77 20 69 6e 20 63 61  ration now in ca
f750: 73 65 20 77 65 20 6e 65 65 64 20 74 6f 0d 0a 20  se we need to.. 
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 2f 2f 20 20 20 20 20 20 20 74 72 6f 75     //       trou
f780: 62 6c 65 73 68 6f 6f 74 20 61 6e 79 20 69 73 73  bleshoot any iss
f790: 75 65 73 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  ues...          
f7a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20            //..  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e    configuration.
f7d0: 44 75 6d 70 28 29 3b 0d 0a 0d 0a 20 20 20 20 20  Dump();....     
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7f0: 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
f800: 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20         // NOTE: 
f810: 53 68 6f 77 20 77 68 65 72 65 20 77 65 20 61 72  Show where we ar
f820: 65 20 72 75 6e 6e 69 6e 67 20 66 72 6f 6d 20 61  e running from a
f830: 6e 64 20 68 6f 77 20 77 65 20 77 65 72 65 0d 0a  nd how we were..
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 69 6e 76      //       inv
f860: 6f 6b 65 64 2e 0d 0a 20 20 20 20 20 20 20 20 20  oked...         
f870: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20             //.. 
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 73 74 72 69 6e 67 20 6c 6f 63 61 74 69     string locati
f8a0: 6f 6e 20 3d 20 61 73 73 65 6d 62 6c 79 2e 4c 6f  on = assembly.Lo
f8b0: 63 61 74 69 6f 6e 3b 0d 0a 0d 0a 20 20 20 20 20  cation;....     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
f8d0: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
f8e0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72  aceCallback, Str
f8f0: 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 22 4f 72 69 67 69 6e 61 6c 20 63       "Original c
f920: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 3a 20  ommand line is: 
f930: 7b 30 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {0}",..         
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
f950: 6e 76 69 72 6f 6e 6d 65 6e 74 2e 43 6f 6d 6d 61  nvironment.Comma
f960: 6e 64 4c 69 6e 65 29 2c 20 74 72 61 63 65 43 61  ndLine), traceCa
f970: 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
f9a0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a          // NOTE:
f9b0: 20 49 66 20 74 68 65 20 64 65 62 75 67 67 65 72   If the debugger
f9c0: 20 69 73 20 61 74 74 61 63 68 65 64 20 61 6e 64   is attached and
f9d0: 20 57 68 61 74 2d 49 66 20 6d 6f 64 65 20 69 73   What-If mode is
f9e0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
f9f0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 20 5b        //       [
fa00: 6e 6f 77 5d 20 64 69 73 61 62 6c 65 64 2c 20 69  now] disabled, i
fa10: 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 2e 0d  ssue a warning..
fa20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fa30: 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
fa50: 28 21 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  (!configuration.
fa60: 77 68 61 74 49 66 20 26 26 20 44 65 62 75 67 67  whatIf && Debugg
fa70: 65 72 2e 49 73 41 74 74 61 63 68 65 64 29 0d 0a  er.IsAttached)..
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
fab0: 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72  raceOps.Trace(tr
fac0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20  aceCallback,..  
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 20 20 22 46 6f 72 63 65            "Force
faf0: 64 20 74 6f 20 64 69 73 61 62 6c 65 20 5c 22 77  d to disable \"w
fb00: 68 61 74 2d 69 66 5c 22 20 6d 6f 64 65 20 77 69  hat-if\" mode wi
fb10: 74 68 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20  th " +..        
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 22 64 65 62 75 67 67 65 72 20 61 74      "debugger at
fb40: 74 61 63 68 65 64 2e 22 2c 20 74 72 61 63 65 43  tached.", traceC
fb50: 61 74 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20  ategory);..     
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
fb70: 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
fb80: 20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20          //..    
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 74 68 65 20  // NOTE: If the 
fbb0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 68 61 73  command line has
fbc0: 20 6e 6f 74 20 62 65 65 6e 20 6d 61 6e 75 61 6c   not been manual
fbd0: 6c 79 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ly..            
fbe0: 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20          //      
fbf0: 20 63 6f 6e 66 69 72 6d 65 64 20 28 69 2e 65 2e   confirmed (i.e.
fc00: 20 76 69 61 20 74 68 65 20 65 78 70 6c 69 63 69   via the explici
fc10: 74 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 0d 0a  t command line..
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 6f 70 74      //       opt
fc40: 69 6f 6e 29 2c 20 74 68 65 6e 20 73 74 6f 70 20  ion), then stop 
fc50: 70 72 6f 63 65 73 73 69 6e 67 20 6e 6f 77 2e 20  processing now. 
fc60: 20 57 65 20 65 6e 66 6f 72 63 65 0d 0a 20 20 20   We enforce..   
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 2f 2f 20 20 20 20 20 20 20 74 68 69 73 20 72   //       this r
fc90: 75 6c 65 20 73 6f 20 74 68 61 74 20 73 69 6d 70  ule so that simp
fca0: 6c 79 20 64 6f 75 62 6c 65 2d 63 6c 69 63 6b 69  ly double-clicki
fcb0: 6e 67 20 74 68 65 0d 0a 20 20 20 20 20 20 20 20  ng the..        
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
fcd0: 20 20 20 20 20 65 78 65 63 75 74 61 62 6c 65 20       executable 
fce0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 75 6c 74 20  will not result 
fcf0: 69 6e 20 61 6e 79 20 63 68 61 6e 67 65 73 20 62  in any changes b
fd00: 65 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 20 20  eing..          
fd10: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20            //    
fd20: 20 20 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73     made to the s
fd30: 79 73 74 65 6d 2e 0d 0a 20 20 20 20 20 20 20 20  ystem...        
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d 0a              //..
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd60: 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69 67 75      if (!configu
fd70: 72 61 74 69 6f 6e 2e 63 6f 6e 66 69 72 6d 29 0d  ration.confirm).
fd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fd90: 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 65 72 72 6f 72 20 3d 20 22 43 61 6e 6e 6f 74 20  error = "Cannot 
fdc0: 63 6f 6e 74 69 6e 75 65 2c 20 74 68 65 20 5c 22  continue, the \"
fdd0: 63 6f 6e 66 69 72 6d 5c 22 20 6f 70 74 69 6f 6e  confirm\" option
fde0: 20 69 73 20 22 20 2b 0d 0a 20 20 20 20 20 20 20   is " +..       
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe00: 20 20 20 20 20 22 6e 6f 74 20 65 6e 61 62 6c 65       "not enable
fe10: 64 2e 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  d.";....        
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe50: 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
fe70: 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
fe80: 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20            }..   
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 74               cat
fea0: 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20 65 29  ch (Exception e)
feb0: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
fec0: 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
fed0: 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70           TraceOp
fee0: 73 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c  s.Trace(traceCal
fef0: 6c 62 61 63 6b 2c 20 65 2c 20 74 72 61 63 65 43  lback, e, traceC
ff00: 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20  ategory);....   
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 65 72 72 6f 72 20 3d 20 22 46 61 69 6c 65 64   error = "Failed
ff30: 20 74 6f 20 70 72 6f 63 65 73 73 20 63 6f 6e 66   to process conf
ff40: 69 67 75 72 61 74 69 6f 6e 2e 22 3b 0d 0a 20 20  iguration.";..  
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
ff60: 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
ff70: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
ff80: 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
ff90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e  .            #en
ffa0: 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20  dregion....     
ffb0: 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
ffc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ffd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ffe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
fff0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
10000 20 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f            #regio
10010 6e 20 50 75 62 6c 69 63 20 4d 65 74 68 6f 64 73  n Public Methods
10020 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
10030 62 6c 69 63 20 62 6f 6f 6c 20 48 61 73 46 6c 61  blic bool HasFla
10040 67 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  gs(..           
10050 20 20 20 20 20 49 6e 73 74 61 6c 6c 46 6c 61 67       InstallFlag
10060 73 20 68 61 73 46 6c 61 67 73 2c 0d 0a 20 20 20  s hasFlags,..   
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f               boo
10080 6c 20 61 6c 6c 0d 0a 20 20 20 20 20 20 20 20 20  l all..         
10090 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
100a0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
100b0 20 20 20 20 20 20 20 20 20 69 66 20 28 61 6c 6c           if (all
100c0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
100d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28         return ((
100e0 69 6e 73 74 61 6c 6c 46 6c 61 67 73 20 26 20 68  installFlags & h
100f0 61 73 46 6c 61 67 73 29 20 3d 3d 20 68 61 73 46  asFlags) == hasF
10100 6c 61 67 73 29 3b 0d 0a 20 20 20 20 20 20 20 20  lags);..        
10110 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 72 65 74 75 72 6e 20 28 28 69 6e 73 74 61    return ((insta
10140 6c 6c 46 6c 61 67 73 20 26 20 68 61 73 46 6c 61  llFlags & hasFla
10150 67 73 29 20 21 3d 20 49 6e 73 74 61 6c 6c 46 6c  gs) != InstallFl
10160 61 67 73 2e 4e 6f 6e 65 29 3b 0d 0a 20 20 20 20  ags.None);..    
10170 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
10180 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
10190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
101a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
101b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
101c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
101d0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
101e0 69 63 20 76 6f 69 64 20 44 75 6d 70 28 29 0d 0a  ic void Dump()..
101f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
10210 66 20 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  f (traceCallback
10220 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   != null)..     
10230 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
10260 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
10270 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
10280 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
10290 20 20 20 20 20 20 20 20 20 20 20 22 41 73 73 65             "Asse
102a0 6d 62 6c 79 22 2c 20 46 6f 72 44 69 73 70 6c 61  mbly", ForDispla
102b0 79 28 61 73 73 65 6d 62 6c 79 29 29 2c 0d 0a 20  y(assembly)),.. 
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
102e0 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
10300 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
10310 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
10320 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
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 22 4c 6f 67 46 69 6c 65 4e         "LogFileN
10350 61 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  ame", ForDisplay
10360 28 6c 6f 67 46 69 6c 65 4e 61 6d 65 29 29 2c 0d  (logFileName)),.
10370 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10380 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
10390 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
103c0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
103d0 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
103e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
103f0 20 20 20 20 20 20 20 20 20 22 44 69 72 65 63 74           "Direct
10400 6f 72 79 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  ory", ForDisplay
10410 28 64 69 72 65 63 74 6f 72 79 29 29 2c 0d 0a 20  (directory)),.. 
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10430 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
10440 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
10460 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
10470 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
10480 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 20 22 43 6f 72 65 46 69 6c 65         "CoreFile
104b0 4e 61 6d 65 22 2c 20 46 6f 72 44 69 73 70 6c 61  Name", ForDispla
104c0 79 28 63 6f 72 65 46 69 6c 65 4e 61 6d 65 29 29  y(coreFileName))
104d0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
104e0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
104f0 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
10520 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
10530 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
10540 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
10550 20 20 20 20 20 20 20 20 20 20 20 22 4c 69 6e 71             "Linq
10560 46 69 6c 65 4e 61 6d 65 22 2c 20 46 6f 72 44 69  FileName", ForDi
10570 73 70 6c 61 79 28 6c 69 6e 71 46 69 6c 65 4e 61  splay(linqFileNa
10580 6d 65 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  me)),..         
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
105a0 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
105b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
105c0 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
105d0 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
105e0 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
105f0 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10610 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  DesignerFileName
10620 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 64 65  ", ForDisplay(de
10630 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 29 29  signerFileName))
10640 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
10650 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
10660 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20  Category);....  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28    traceCallback(
10690 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61  String.Format(Na
106a0 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74  meAndValueFormat
106b0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
106c0 20 20 20 20 20 20 20 20 20 20 20 22 49 6e 73 74             "Inst
106d0 61 6c 6c 46 6c 61 67 73 22 2c 20 46 6f 72 44 69  allFlags", ForDi
106e0 73 70 6c 61 79 28 69 6e 73 74 61 6c 6c 46 6c 61  splay(installFla
106f0 67 73 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  gs)),..         
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10710 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
10720 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10730 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
10740 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
10750 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
10760 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10780 49 6e 73 74 61 6c 6c 22 2c 20 46 6f 72 44 69 73  Install", ForDis
10790 70 6c 61 79 28 69 6e 73 74 61 6c 6c 29 29 2c 0d  play(install)),.
107a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107b0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
107c0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
107f0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
10800 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
10810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10820 20 20 20 20 20 20 20 20 20 22 4e 6f 44 65 73 6b           "NoDesk
10830 74 6f 70 22 2c 20 46 6f 72 44 69 73 70 6c 61 79  top", ForDisplay
10840 28 6e 6f 44 65 73 6b 74 6f 70 29 29 2c 0d 0a 20  (noDesktop)),.. 
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10860 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
10870 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
10890 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
108a0 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
108b0 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
108c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108d0 20 20 20 20 20 20 20 22 4e 6f 43 6f 6d 70 61 63         "NoCompac
108e0 74 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e  t", ForDisplay(n
108f0 6f 43 6f 6d 70 61 63 74 29 29 2c 0d 0a 20 20 20  oCompact)),..   
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
10920 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
10930 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63              trac
10940 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67  eCallback(String
10950 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56  .Format(NameAndV
10960 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20  alueFormat,..   
10970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10980 20 20 20 20 20 22 4e 6f 4e 65 74 46 78 32 30 22       "NoNetFx20"
10990 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e  , ForDisplay(noN
109a0 65 74 46 78 32 30 29 29 2c 0d 0a 20 20 20 20 20  etFx20)),..     
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109c0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
109d0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
109e0 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
109f0 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46  allback(String.F
10a00 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c  ormat(NameAndVal
10a10 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20  ueFormat,..     
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 20 20 22 4e 6f 4e 65 74 46 78 34 30 22 2c 20     "NoNetFx40", 
10a40 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 4e 65 74  ForDisplay(noNet
10a50 46 78 34 30 29 29 2c 0d 0a 20 20 20 20 20 20 20  Fx40)),..       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
10a80 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10a90 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
10aa0 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72  lback(String.For
10ab0 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65  mat(NameAndValue
10ac0 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20  Format,..       
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 22 4e 6f 56 73 32 30 30 38 22 2c 20 46 6f 72   "NoVs2008", For
10af0 44 69 73 70 6c 61 79 28 6e 6f 56 73 32 30 30 38  Display(noVs2008
10b00 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  )),..           
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
10b20 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
10b50 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  k(String.Format(
10b60 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f 72 6d  NameAndValueForm
10b70 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at,..           
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 6f               "No
10b90 56 73 32 30 31 30 22 2c 20 46 6f 72 44 69 73 70  Vs2010", ForDisp
10ba0 6c 61 79 28 6e 6f 56 73 32 30 31 30 29 29 2c 0d  lay(noVs2010)),.
10bb0 0a 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 74 72 61 63 65 43 61           traceCa
10bd0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
10be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bf0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
10c00 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
10c10 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
10c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10c30 20 20 20 20 20 20 20 20 20 22 4e 6f 54 72 61 63           "NoTrac
10c40 65 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 6e  e", ForDisplay(n
10c50 6f 54 72 61 63 65 29 29 2c 0d 0a 20 20 20 20 20  oTrace)),..     
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
10c80 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
10c90 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
10ca0 61 6c 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46  allback(String.F
10cb0 6f 72 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c  ormat(NameAndVal
10cc0 75 65 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20  ueFormat,..     
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 20 22 4e 6f 43 6f 6e 73 6f 6c 65 22 2c 20     "NoConsole", 
10cf0 46 6f 72 44 69 73 70 6c 61 79 28 6e 6f 43 6f 6e  ForDisplay(noCon
10d00 73 6f 6c 65 29 29 2c 0d 0a 20 20 20 20 20 20 20  sole)),..       
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b   traceCategory);
10d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
10d40 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 6c          traceCal
10d50 6c 62 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72  lback(String.For
10d60 6d 61 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65  mat(NameAndValue
10d70 46 6f 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20  Format,..       
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 22 4e 6f 4c 6f 67 22 2c 20 46 6f 72 44 69 73   "NoLog", ForDis
10da0 70 6c 61 79 28 6e 6f 4c 6f 67 29 29 2c 0d 0a 20  play(noLog)),.. 
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74 65         traceCate
10dd0 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  gory);....      
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
10df0 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74 72 69  aceCallback(Stri
10e00 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65 41 6e  ng.Format(NameAn
10e10 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d 0a 20  dValueFormat,.. 
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 20 20 20 22 57 68 61 74 49 66 22 2c         "WhatIf",
10e40 20 46 6f 72 44 69 73 70 6c 61 79 28 77 68 61 74   ForDisplay(what
10e50 49 66 29 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  If)),..         
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
10e70 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
10e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
10e90 20 20 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62        traceCallb
10ea0 61 63 6b 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ack(String.Forma
10eb0 74 28 4e 61 6d 65 41 6e 64 56 61 6c 75 65 46 6f  t(NameAndValueFo
10ec0 72 6d 61 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  rmat,..         
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
10ee0 56 65 72 62 6f 73 65 22 2c 20 46 6f 72 44 69 73  Verbose", ForDis
10ef0 70 6c 61 79 28 76 65 72 62 6f 73 65 29 29 2c 0d  play(verbose)),.
10f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f10 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
10f20 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 53 74  traceCallback(St
10f50 72 69 6e 67 2e 46 6f 72 6d 61 74 28 4e 61 6d 65  ring.Format(Name
10f60 41 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 2c 0d  AndValueFormat,.
10f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f80 20 20 20 20 20 20 20 20 20 22 43 6f 6e 66 69 72           "Confir
10f90 6d 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 63  m", ForDisplay(c
10fa0 6f 6e 66 69 72 6d 29 29 2c 0d 0a 20 20 20 20 20  onfirm)),..     
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79     traceCategory
10fd0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
10fe0 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20      }..         
10ff0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
11000 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a    #endregion....
11010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
11020 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
11060 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
11070 72 65 67 69 6f 6e 20 50 75 62 6c 69 63 20 50 72  region Public Pr
11080 6f 70 65 72 74 69 65 73 0d 0a 20 20 20 20 20 20  operties..      
11090 20 20 20 20 20 20 70 72 69 76 61 74 65 20 41 73        private As
110a0 73 65 6d 62 6c 79 20 61 73 73 65 6d 62 6c 79 3b  sembly assembly;
110b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ..            pu
110c0 62 6c 69 63 20 41 73 73 65 6d 62 6c 79 20 41 73  blic Assembly As
110d0 73 65 6d 62 6c 79 0d 0a 20 20 20 20 20 20 20 20  sembly..        
110e0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
110f0 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
11100 75 72 6e 20 61 73 73 65 6d 62 6c 79 3b 20 7d 0d  urn assembly; }.
11110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11120 20 73 65 74 20 7b 20 61 73 73 65 6d 62 6c 79 20   set { assembly 
11130 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
11140 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
11150 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
11160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
111a0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
111b0 61 74 65 20 73 74 72 69 6e 67 20 6c 6f 67 46 69  ate string logFi
111c0 6c 65 4e 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20  leName;..       
111d0 20 20 20 20 20 70 75 62 6c 69 63 20 73 74 72 69       public stri
111e0 6e 67 20 4c 6f 67 46 69 6c 65 4e 61 6d 65 0d 0a  ng LogFileName..
111f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
11210 65 74 20 7b 20 72 65 74 75 72 6e 20 6c 6f 67 46  et { return logF
11220 69 6c 65 4e 61 6d 65 3b 20 7d 0d 0a 20 20 20 20  ileName; }..    
11230 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
11240 7b 20 6c 6f 67 46 69 6c 65 4e 61 6d 65 20 3d 20  { logFileName = 
11250 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20  value; }..      
11260 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
11270 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
11280 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
112a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
112b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
112c0 20 20 20 20 20 20 20 20 20 20 70 72 69 76 61 74            privat
112d0 65 20 73 74 72 69 6e 67 20 64 69 72 65 63 74 6f  e string directo
112e0 72 79 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry;..           
112f0 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20 44   public string D
11300 69 72 65 63 74 6f 72 79 0d 0a 20 20 20 20 20 20  irectory..      
11310 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
11320 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
11330 65 74 75 72 6e 20 64 69 72 65 63 74 6f 72 79 3b  eturn directory;
11340 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11350 20 20 20 20 73 65 74 20 7b 20 64 69 72 65 63 74      set { direct
11360 6f 72 79 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  ory = value; }..
11370 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
11380 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
11390 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
113a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
113b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
113c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
113d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
113e0 70 72 69 76 61 74 65 20 73 74 72 69 6e 67 20 63  private string c
113f0 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 0d 0a 20 20  oreFileName;..  
11400 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
11410 20 73 74 72 69 6e 67 20 43 6f 72 65 46 69 6c 65   string CoreFile
11420 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20 20 20  Name..          
11430 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
11440 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
11450 6e 20 63 6f 72 65 46 69 6c 65 4e 61 6d 65 3b 20  n coreFileName; 
11460 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
11470 20 20 20 73 65 74 20 7b 20 63 6f 72 65 46 69 6c     set { coreFil
11480 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b 20 7d  eName = value; }
11490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
114a0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
114b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
114c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
114d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
114e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
114f0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
11500 20 20 70 72 69 76 61 74 65 20 73 74 72 69 6e 67    private string
11510 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65 3b 0d 0a   linqFileName;..
11520 20 20 20 20 20 20 20 20 20 20 20 20 70 75 62 6c              publ
11530 69 63 20 73 74 72 69 6e 67 20 4c 69 6e 71 46 69  ic string LinqFi
11540 6c 65 4e 61 6d 65 0d 0a 20 20 20 20 20 20 20 20  leName..        
11550 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
11560 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
11570 75 72 6e 20 6c 69 6e 71 46 69 6c 65 4e 61 6d 65  urn linqFileName
11580 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
11590 20 20 20 20 20 73 65 74 20 7b 20 6c 69 6e 71 46       set { linqF
115a0 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75 65 3b  ileName = value;
115b0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
115c0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
115d0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
115e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
115f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11600 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11610 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
11620 20 20 20 20 70 72 69 76 61 74 65 20 73 74 72 69      private stri
11630 6e 67 20 64 65 73 69 67 6e 65 72 46 69 6c 65 4e  ng designerFileN
11640 61 6d 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  ame;..          
11650 20 20 70 75 62 6c 69 63 20 73 74 72 69 6e 67 20    public string 
11660 44 65 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65  DesignerFileName
11670 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
11680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11690 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 64 65   get { return de
116a0 73 69 67 6e 65 72 46 69 6c 65 4e 61 6d 65 3b 20  signerFileName; 
116b0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
116c0 20 20 20 73 65 74 20 7b 20 64 65 73 69 67 6e 65     set { designe
116d0 72 46 69 6c 65 4e 61 6d 65 20 3d 20 76 61 6c 75  rFileName = valu
116e0 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
116f0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
11700 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
11710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11740 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
11750 20 20 20 20 20 20 70 72 69 76 61 74 65 20 49 6e        private In
11760 73 74 61 6c 6c 46 6c 61 67 73 20 69 6e 73 74 61  stallFlags insta
11770 6c 6c 46 6c 61 67 73 3b 0d 0a 20 20 20 20 20 20  llFlags;..      
11780 20 20 20 20 20 20 70 75 62 6c 69 63 20 49 6e 73        public Ins
11790 74 61 6c 6c 46 6c 61 67 73 20 49 6e 73 74 61 6c  tallFlags Instal
117a0 6c 46 6c 61 67 73 0d 0a 20 20 20 20 20 20 20 20  lFlags..        
117b0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
117c0 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
117d0 75 72 6e 20 69 6e 73 74 61 6c 6c 46 6c 61 67 73  urn installFlags
117e0 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ; }..           
117f0 20 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61       set { insta
11800 6c 6c 46 6c 61 67 73 20 3d 20 76 61 6c 75 65 3b  llFlags = value;
11810 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11820 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11830 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
11840 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11850 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11860 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11870 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
11880 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
11890 20 69 6e 73 74 61 6c 6c 3b 0d 0a 20 20 20 20 20   install;..     
118a0 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
118b0 6f 6c 20 49 6e 73 74 61 6c 6c 0d 0a 20 20 20 20  ol Install..    
118c0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
118d0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
118e0 20 72 65 74 75 72 6e 20 69 6e 73 74 61 6c 6c 3b   return install;
118f0 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11900 20 20 20 20 73 65 74 20 7b 20 69 6e 73 74 61 6c      set { instal
11910 6c 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20  l = value; }..  
11920 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
11930 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
11940 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11950 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11960 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
11980 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
11990 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 44 65 73  ivate bool noDes
119a0 6b 74 6f 70 3b 0d 0a 20 20 20 20 20 20 20 20 20  ktop;..         
119b0 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e     public bool N
119c0 6f 44 65 73 6b 74 6f 70 0d 0a 20 20 20 20 20 20  oDesktop..      
119d0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
119e0 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
119f0 65 74 75 72 6e 20 6e 6f 44 65 73 6b 74 6f 70 3b  eturn noDesktop;
11a00 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11a10 20 20 20 20 73 65 74 20 7b 20 6e 6f 44 65 73 6b      set { noDesk
11a20 74 6f 70 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  top = value; }..
11a30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
11a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
11a50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11a60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11a80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11a90 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
11aa0 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 43  private bool noC
11ab0 6f 6d 70 61 63 74 3b 0d 0a 20 20 20 20 20 20 20  ompact;..       
11ac0 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
11ad0 20 4e 6f 43 6f 6d 70 61 63 74 0d 0a 20 20 20 20   NoCompact..    
11ae0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
11af0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 20 7b             get {
11b00 20 72 65 74 75 72 6e 20 6e 6f 43 6f 6d 70 61 63   return noCompac
11b10 74 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  t; }..          
11b20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 43 6f        set { noCo
11b30 6d 70 61 63 74 20 3d 20 76 61 6c 75 65 3b 20 7d  mpact = value; }
11b40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
11b50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
11b60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11b70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11b80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11ba0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
11bb0 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e    private bool n
11bc0 6f 4e 65 74 46 78 32 30 3b 0d 0a 20 20 20 20 20  oNetFx20;..     
11bd0 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f         public bo
11be0 6f 6c 20 4e 6f 4e 65 74 46 78 32 30 0d 0a 20 20  ol NoNetFx20..  
11bf0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
11c00 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
11c10 20 7b 20 72 65 74 75 72 6e 20 6e 6f 4e 65 74 46   { return noNetF
11c20 78 32 30 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  x20; }..        
11c30 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f          set { no
11c40 4e 65 74 46 78 32 30 20 3d 20 76 61 6c 75 65 3b  NetFx20 = value;
11c50 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11c60 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11c70 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
11c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11c90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11ca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11cb0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
11cc0 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
11cd0 20 6e 6f 4e 65 74 46 78 34 30 3b 0d 0a 20 20 20   noNetFx40;..   
11ce0 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
11cf0 62 6f 6f 6c 20 4e 6f 4e 65 74 46 78 34 30 0d 0a  bool NoNetFx40..
11d00 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
11d20 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 4e 65  et { return noNe
11d30 74 46 78 34 30 3b 20 7d 0d 0a 20 20 20 20 20 20  tFx40; }..      
11d40 20 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20            set { 
11d50 6e 6f 4e 65 74 46 78 34 30 20 3d 20 76 61 6c 75  noNetFx40 = valu
11d60 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
11d70 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
11d80 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
11d90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11dc0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
11dd0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f        private bo
11de0 6f 6c 20 6e 6f 56 73 32 30 30 38 3b 0d 0a 20 20  ol noVs2008;..  
11df0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63            public
11e00 20 62 6f 6f 6c 20 4e 6f 56 73 32 30 30 38 0d 0a   bool NoVs2008..
11e10 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
11e30 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f 56 73  et { return noVs
11e40 32 30 30 38 3b 20 7d 0d 0a 20 20 20 20 20 20 20  2008; }..       
11e50 20 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e           set { n
11e60 6f 56 73 32 30 30 38 20 3d 20 76 61 6c 75 65 3b  oVs2008 = value;
11e70 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
11e80 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
11e90 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
11ea0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11eb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11ec0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11ed0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
11ee0 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
11ef0 20 6e 6f 56 73 32 30 31 30 3b 0d 0a 20 20 20 20   noVs2010;..    
11f00 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
11f10 6f 6f 6c 20 4e 6f 56 73 32 30 31 30 0d 0a 20 20  ool NoVs2010..  
11f20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
11f40 20 7b 20 72 65 74 75 72 6e 20 6e 6f 56 73 32 30   { return noVs20
11f50 31 30 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20  10; }..         
11f60 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f 56         set { noV
11f70 73 32 30 31 30 20 3d 20 76 61 6c 75 65 3b 20 7d  s2010 = value; }
11f80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
11f90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
11fa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11fb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11fc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11fd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11fe0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
11ff0 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 6e    private bool n
12000 6f 54 72 61 63 65 3b 0d 0a 20 20 20 20 20 20 20  oTrace;..       
12010 20 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c       public bool
12020 20 4e 6f 54 72 61 63 65 0d 0a 20 20 20 20 20 20   NoTrace..      
12030 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
12040 20 20 20 20 20 20 20 20 20 67 65 74 20 7b 20 72           get { r
12050 65 74 75 72 6e 20 6e 6f 54 72 61 63 65 3b 20 7d  eturn noTrace; }
12060 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12070 20 20 73 65 74 20 7b 20 6e 6f 54 72 61 63 65 20    set { noTrace 
12080 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20  = value; }..    
12090 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
120a0 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f           ///////
120b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
120c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
120d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
120e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
120f0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 76              priv
12100 61 74 65 20 62 6f 6f 6c 20 6e 6f 43 6f 6e 73 6f  ate bool noConso
12110 6c 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  le;..           
12120 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 43   public bool NoC
12130 6f 6e 73 6f 6c 65 0d 0a 20 20 20 20 20 20 20 20  onsole..        
12140 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12150 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
12160 75 72 6e 20 6e 6f 43 6f 6e 73 6f 6c 65 3b 20 7d  urn noConsole; }
12170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
12180 20 20 73 65 74 20 7b 20 6e 6f 43 6f 6e 73 6f 6c    set { noConsol
12190 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a 20 20  e = value; }..  
121a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
121b0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
121c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
121f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
12200 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ..            pr
12210 69 76 61 74 65 20 62 6f 6f 6c 20 6e 6f 4c 6f 67  ivate bool noLog
12220 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ;..            p
12230 75 62 6c 69 63 20 62 6f 6f 6c 20 4e 6f 4c 6f 67  ublic bool NoLog
12240 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
12250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12260 20 67 65 74 20 7b 20 72 65 74 75 72 6e 20 6e 6f   get { return no
12270 4c 6f 67 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20  Log; }..        
12280 20 20 20 20 20 20 20 20 73 65 74 20 7b 20 6e 6f          set { no
12290 4c 6f 67 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  Log = value; }..
122a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
122b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
122c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
122f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12300 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
12310 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 77 68 61  private bool wha
12320 74 49 66 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf;..          
12330 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 57 68    public bool Wh
12340 61 74 49 66 0d 0a 20 20 20 20 20 20 20 20 20 20  atIf..          
12350 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
12360 20 20 20 20 20 67 65 74 20 7b 20 72 65 74 75 72       get { retur
12370 6e 20 77 68 61 74 49 66 3b 20 7d 0d 0a 20 20 20  n whatIf; }..   
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
12390 20 7b 20 77 68 61 74 49 66 20 3d 20 76 61 6c 75   { whatIf = valu
123a0 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
123b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
123c0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
123d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
123f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12400 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
12410 20 20 20 20 20 20 70 72 69 76 61 74 65 20 62 6f        private bo
12420 6f 6c 20 76 65 72 62 6f 73 65 3b 0d 0a 20 20 20  ol verbose;..   
12430 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20           public 
12440 62 6f 6f 6c 20 56 65 72 62 6f 73 65 0d 0a 20 20  bool Verbose..  
12450 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
12470 20 7b 20 72 65 74 75 72 6e 20 76 65 72 62 6f 73   { return verbos
12480 65 3b 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20  e; }..          
12490 20 20 20 20 20 20 73 65 74 20 7b 20 76 65 72 62        set { verb
124a0 6f 73 65 20 3d 20 76 61 6c 75 65 3b 20 7d 0d 0a  ose = value; }..
124b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
124c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f  .            ///
124d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
124e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
124f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12500 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12510 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
12520 70 72 69 76 61 74 65 20 62 6f 6f 6c 20 63 6f 6e  private bool con
12530 66 69 72 6d 3b 0d 0a 20 20 20 20 20 20 20 20 20  firm;..         
12540 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 20 43     public bool C
12550 6f 6e 66 69 72 6d 0d 0a 20 20 20 20 20 20 20 20  onfirm..        
12560 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
12570 20 20 20 20 20 20 20 67 65 74 20 7b 20 72 65 74         get { ret
12580 75 72 6e 20 63 6f 6e 66 69 72 6d 3b 20 7d 0d 0a  urn confirm; }..
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 73 65 74 20 7b 20 63 6f 6e 66 69 72 6d 20 3d 20  set { confirm = 
125b0 76 61 6c 75 65 3b 20 7d 0d 0a 20 20 20 20 20 20  value; }..      
125c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
125d0 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
125e0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
125f0 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
12600 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
12610 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12620 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12630 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12640 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12650 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
12660 67 69 6f 6e 20 50 72 69 76 61 74 65 20 43 6f 6e  gion Private Con
12670 73 74 61 6e 74 20 44 61 74 61 0d 0a 20 20 20 20  stant Data..    
12680 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73      private cons
12690 74 20 73 74 72 69 6e 67 20 43 6f 72 65 46 69 6c  t string CoreFil
126a0 65 4e 61 6d 65 20 3d 20 22 53 79 73 74 65 6d 2e  eName = "System.
126b0 44 61 74 61 2e 53 51 4c 69 74 65 2e 64 6c 6c 22  Data.SQLite.dll"
126c0 3b 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ;..        priva
126d0 74 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20  te const string 
126e0 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 20 3d 20 22  LinqFileName = "
126f0 53 79 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69  System.Data.SQLi
12700 74 65 2e 4c 69 6e 71 2e 64 6c 6c 22 3b 0d 0a 20  te.Linq.dll";.. 
12710 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63         private c
12720 6f 6e 73 74 20 73 74 72 69 6e 67 20 44 65 73 69  onst string Desi
12730 67 6e 65 72 46 69 6c 65 4e 61 6d 65 20 3d 20 22  gnerFileName = "
12740 53 51 4c 69 74 65 2e 44 65 73 69 67 6e 65 72 2e  SQLite.Designer.
12750 64 6c 6c 22 3b 0d 0a 20 20 20 20 20 20 20 20 70  dll";..        p
12760 72 69 76 61 74 65 20 63 6f 6e 73 74 20 73 74 72  rivate const str
12770 69 6e 67 20 50 72 6f 76 69 64 65 72 4e 61 6d 65  ing ProviderName
12780 20 3d 20 22 53 51 4c 69 74 65 20 44 61 74 61 20   = "SQLite Data 
12790 50 72 6f 76 69 64 65 72 22 3b 0d 0a 20 20 20 20  Provider";..    
127a0 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73      private cons
127b0 74 20 73 74 72 69 6e 67 20 50 72 6f 6a 65 63 74  t string Project
127c0 4e 61 6d 65 20 3d 20 22 53 79 73 74 65 6d 2e 44  Name = "System.D
127d0 61 74 61 2e 53 51 4c 69 74 65 22 3b 0d 0a 20 20  ata.SQLite";..  
127e0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
127f0 6e 73 74 20 73 74 72 69 6e 67 20 4c 65 67 61 63  nst string Legac
12800 79 50 72 6f 6a 65 63 74 4e 61 6d 65 20 3d 20 22  yProjectName = "
12810 53 51 4c 69 74 65 22 3b 0d 0a 20 20 20 20 20 20  SQLite";..      
12820 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73 74 20    private const 
12830 73 74 72 69 6e 67 20 49 6e 76 61 72 69 61 6e 74  string Invariant
12840 4e 61 6d 65 20 3d 20 22 53 79 73 74 65 6d 2e 44  Name = "System.D
12850 61 74 61 2e 53 51 4c 69 74 65 22 3b 0d 0a 20 20  ata.SQLite";..  
12860 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
12870 6e 73 74 20 73 74 72 69 6e 67 20 46 61 63 74 6f  nst string Facto
12880 72 79 54 79 70 65 4e 61 6d 65 20 3d 20 22 53 79  ryTypeName = "Sy
12890 73 74 65 6d 2e 44 61 74 61 2e 53 51 4c 69 74 65  stem.Data.SQLite
128a0 2e 53 51 4c 69 74 65 46 61 63 74 6f 72 79 22 3b  .SQLiteFactory";
128b0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
128c0 65 20 63 6f 6e 73 74 20 73 74 72 69 6e 67 20 44  e const string D
128d0 65 73 63 72 69 70 74 69 6f 6e 20 3d 20 22 2e 4e  escription = ".N
128e0 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 44 61 74  ET Framework Dat
128f0 61 20 50 72 6f 76 69 64 65 72 20 66 6f 72 20 53  a Provider for S
12900 51 4c 69 74 65 22 3b 0d 0a 0d 0a 20 20 20 20 20  QLite";....     
12910 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
12920 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12930 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12940 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12950 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
12960 20 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f        private co
12970 6e 73 74 20 73 74 72 69 6e 67 20 4e 61 6d 65 41  nst string NameA
12980 6e 64 56 61 6c 75 65 46 6f 72 6d 61 74 20 3d 20  ndValueFormat = 
12990 22 7b 30 7d 3a 20 7b 31 7d 22 3b 0d 0a 20 20 20  "{0}: {1}";..   
129a0 20 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e       private con
129b0 73 74 20 73 74 72 69 6e 67 20 54 72 61 63 65 46  st string TraceF
129c0 6f 72 6d 61 74 20 3d 20 22 23 7b 30 7d 20 40 20  ormat = "#{0} @ 
129d0 7b 31 7d 3a 20 7b 32 7d 22 3b 0d 0a 20 20 20 20  {1}: {2}";..    
129e0 20 20 20 20 70 72 69 76 61 74 65 20 63 6f 6e 73      private cons
129f0 74 20 73 74 72 69 6e 67 20 4c 6f 67 46 69 6c 65  t string LogFile
12a00 53 75 66 66 69 78 20 3d 20 22 2e 6c 6f 67 22 3b  Suffix = ".log";
12a10 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
12a20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12a60 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
12a70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 72 65  rivate static re
12a80 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 56 73  adonly string Vs
12a90 49 64 46 6f 72 6d 61 74 20 3d 20 22 42 22 3b 0d  IdFormat = "B";.
12aa0 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
12ab0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ac0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ad0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ae0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12af0 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
12b00 69 76 61 74 65 20 73 74 61 74 69 63 20 72 65 61  ivate static rea
12b10 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20 46 72 61  donly string Fra
12b20 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d 65 20 3d 0d  meworkKeyName =.
12b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6f  .            "So
12b40 66 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66  ftware\\Microsof
12b50 74 5c 5c 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b  t\\.NETFramework
12b60 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  ";....        //
12b70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12b80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12b90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ba0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12bb0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
12bc0 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
12bd0 72 65 61 64 6f 6e 6c 79 20 73 74 72 69 6e 67 20  readonly string 
12be0 46 72 61 6d 65 77 6f 72 6b 53 64 6b 4b 65 79 4e  FrameworkSdkKeyN
12bf0 61 6d 65 20 3d 0d 0a 20 20 20 20 20 20 20 20 20  ame =..         
12c00 20 20 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69     "Software\\Mi
12c10 63 72 6f 73 6f 66 74 5c 5c 4d 69 63 72 6f 73 6f  crosoft\\Microso
12c20 66 74 20 53 44 4b 73 5c 5c 2e 4e 45 54 46 72 61  ft SDKs\\.NETFra
12c30 6d 65 77 6f 72 6b 22 3b 0d 0a 0d 0a 20 20 20 20  mework";....    
12c40 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
12c50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12c60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12c70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20  ///////////.... 
12c90 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
12ca0 74 61 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73  tatic readonly s
12cb0 74 72 69 6e 67 20 57 69 6e 64 6f 77 73 53 64 6b  tring WindowsSdk
12cc0 4b 65 79 4e 61 6d 65 20 3d 0d 0a 20 20 20 20 20  KeyName =..     
12cd0 20 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65         "Software
12ce0 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 4d 69 63  \\Microsoft\\Mic
12cf0 72 6f 73 6f 66 74 20 53 44 4b 73 5c 5c 57 69 6e  rosoft SDKs\\Win
12d00 64 6f 77 73 22 3b 0d 0a 0d 0a 20 20 20 20 20 20  dows";....      
12d10 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
12d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12d30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12d40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12d50 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
12d60 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
12d70 74 69 63 20 72 65 61 64 6f 6e 6c 79 20 73 74 72  tic readonly str
12d80 69 6e 67 20 58 50 61 74 68 46 6f 72 41 64 64 45  ing XPathForAddE
12d90 6c 65 6d 65 6e 74 20 3d 0d 0a 20 20 20 20 20 20  lement =..      
12da0 20 20 20 20 20 20 22 63 6f 6e 66 69 67 75 72 61        "configura
12db0 74 69 6f 6e 2f 73 79 73 74 65 6d 2e 64 61 74 61  tion/system.data
12dc0 2f 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f  /DbProviderFacto
12dd0 72 69 65 73 2f 61 64 64 5b 40 69 6e 76 61 72 69  ries/add[@invari
12de0 61 6e 74 3d 5c 22 7b 30 7d 5c 22 5d 22 3b 0d 0a  ant=\"{0}\"]";..
12df0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
12e00 65 20 73 74 61 74 69 63 20 72 65 61 64 6f 6e 6c  e static readonl
12e10 79 20 73 74 72 69 6e 67 20 58 50 61 74 68 46 6f  y string XPathFo
12e20 72 52 65 6d 6f 76 65 45 6c 65 6d 65 6e 74 20 3d  rRemoveElement =
12e30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63  ..            "c
12e40 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2f 73 79 73  onfiguration/sys
12e50 74 65 6d 2e 64 61 74 61 2f 44 62 50 72 6f 76 69  tem.data/DbProvi
12e60 64 65 72 46 61 63 74 6f 72 69 65 73 2f 72 65 6d  derFactories/rem
12e70 6f 76 65 5b 40 69 6e 76 61 72 69 61 6e 74 3d 5c  ove[@invariant=\
12e80 22 7b 30 7d 5c 22 5d 22 3b 0d 0a 20 20 20 20 20  "{0}\"]";..     
12e90 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
12ea0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
12eb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ec0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ed0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ee0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12ef0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
12f00 69 6f 6e 20 50 72 69 76 61 74 65 20 44 61 74 61  ion Private Data
12f10 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
12f20 65 20 73 74 61 74 69 63 20 41 73 73 65 6d 62 6c  e static Assembl
12f30 79 20 74 68 69 73 41 73 73 65 6d 62 6c 79 20 3d  y thisAssembly =
12f40 20 41 73 73 65 6d 62 6c 79 2e 47 65 74 45 78 65   Assembly.GetExe
12f50 63 75 74 69 6e 67 41 73 73 65 6d 62 6c 79 28 29  cutingAssembly()
12f60 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69  ;....        pri
12f70 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69  vate static stri
12f80 6e 67 20 74 72 61 63 65 43 61 74 65 67 6f 72 79  ng traceCategory
12f90 20 3d 20 50 61 74 68 2e 47 65 74 46 69 6c 65 4e   = Path.GetFileN
12fa0 61 6d 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ame(..          
12fb0 20 20 74 68 69 73 41 73 73 65 6d 62 6c 79 2e 4c    thisAssembly.L
12fc0 6f 63 61 74 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20  ocation);....   
12fd0 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
12fe0 74 69 63 20 54 72 61 63 65 43 61 6c 6c 62 61 63  tic TraceCallbac
12ff0 6b 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 20  k traceCallback 
13000 3d 20 41 70 70 54 72 61 63 65 3b 0d 0a 0d 0a 20  = AppTrace;.... 
13010 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
13020 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13030 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
13060 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
13070 65 20 73 74 61 74 69 63 20 52 65 67 69 73 74 72  e static Registr
13080 79 4b 65 79 20 66 72 61 6d 65 77 6f 72 6b 52 6f  yKey frameworkRo
13090 6f 74 4b 65 79 3b 0d 0a 20 20 20 20 20 20 20 20  otKey;..        
130a0 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 53  private static S
130b0 74 72 69 6e 67 4c 69 73 74 20 66 72 61 6d 65 77  tringList framew
130c0 6f 72 6b 4e 61 6d 65 4c 69 73 74 3b 0d 0a 20 20  orkNameList;..  
130d0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
130e0 61 74 69 63 20 56 65 72 73 69 6f 6e 4d 61 70 20  atic VersionMap 
130f0 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
13100 4d 61 70 3b 0d 0a 20 20 20 20 20 20 20 20 70 72  Map;..        pr
13110 69 76 61 74 65 20 73 74 61 74 69 63 20 53 74 72  ivate static Str
13120 69 6e 67 4c 69 73 74 20 70 6c 61 74 66 6f 72 6d  ingList platform
13130 4e 61 6d 65 4c 69 73 74 3b 0d 0a 0d 0a 20 20 20  NameList;....   
13140 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
13150 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a  ////////////....
13190 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
131a0 73 74 61 74 69 63 20 52 65 67 69 73 74 72 79 4b  static RegistryK
131b0 65 79 20 76 73 52 6f 6f 74 4b 65 79 3b 0d 0a 20  ey vsRootKey;.. 
131c0 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73         private s
131d0 74 61 74 69 63 20 56 65 72 73 69 6f 6e 4c 69 73  tatic VersionLis
131e0 74 20 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 3b  t vsVersionList;
131f0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
13200 65 20 73 74 61 74 69 63 20 47 75 69 64 3f 20 76  e static Guid? v
13210 73 50 61 63 6b 61 67 65 49 64 3b 0d 0a 20 20 20  sPackageId;..   
13220 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
13230 74 69 63 20 47 75 69 64 3f 20 76 73 53 65 72 76  tic Guid? vsServ
13240 69 63 65 49 64 3b 0d 0a 20 20 20 20 20 20 20 20  iceId;..        
13250 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 47  private static G
13260 75 69 64 3f 20 76 73 44 61 74 61 53 6f 75 72 63  uid? vsDataSourc
13270 65 73 49 64 3b 0d 0a 20 20 20 20 20 20 20 20 70  esId;..        p
13280 72 69 76 61 74 65 20 73 74 61 74 69 63 20 47 75  rivate static Gu
13290 69 64 3f 20 76 73 44 61 74 61 50 72 6f 76 69 64  id? vsDataProvid
132a0 65 72 49 64 3b 0d 0a 20 20 20 20 20 20 20 20 70  erId;..        p
132b0 72 69 76 61 74 65 20 73 74 61 74 69 63 20 47 75  rivate static Gu
132c0 69 64 3f 20 76 73 41 64 6f 4e 65 74 54 65 63 68  id? vsAdoNetTech
132d0 6e 6f 6c 6f 67 79 49 64 3b 0d 0a 20 20 20 20 20  nologyId;..     
132e0 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
132f0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
13300 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13310 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13320 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13330 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13340 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
13350 69 6f 6e 20 54 72 61 63 65 20 48 61 6e 64 6c 69  ion Trace Handli
13360 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ng..        priv
13370 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69 6e  ate static strin
13380 67 20 47 65 74 4c 6f 67 46 69 6c 65 4e 61 6d 65  g GetLogFileName
13390 28 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20  ()..        {.. 
133a0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
133b0 67 20 72 65 73 75 6c 74 20 3d 20 50 61 74 68 2e  g result = Path.
133c0 47 65 74 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  GetTempFileName(
133d0 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a  ); /* throw */..
133e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ..            Fi
133f0 6c 65 2e 4d 6f 76 65 28 72 65 73 75 6c 74 2c 20  le.Move(result, 
13400 72 65 73 75 6c 74 20 2b 20 4c 6f 67 46 69 6c 65  result + LogFile
13410 53 75 66 66 69 78 29 3b 20 2f 2a 20 74 68 72 6f  Suffix); /* thro
13420 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20 20  w */..          
13430 20 20 72 65 73 75 6c 74 20 2b 3d 20 4c 6f 67 46    result += LogF
13440 69 6c 65 53 75 66 66 69 78 3b 0d 0a 0d 0a 20 20  ileSuffix;....  
13450 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13460 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20 20 20   result;..      
13470 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
13480 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13490 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
134a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
134b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
134c0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
134d0 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
134e0 20 76 6f 69 64 20 41 70 70 54 72 61 63 65 28 0d   void AppTrace(.
134f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
13500 69 6e 67 20 6d 65 73 73 61 67 65 2c 0d 0a 20 20  ing message,..  
13510 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
13520 20 63 61 74 65 67 6f 72 79 0d 0a 20 20 20 20 20   category..     
13530 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
13540 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
13550 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 43   TraceOps.TraceC
13560 6f 72 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61  ore(String.Forma
13570 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
13580 20 20 20 20 54 72 61 63 65 46 6f 72 6d 61 74 2c      TraceFormat,
13590 20 54 72 61 63 65 4f 70 73 2e 4e 65 78 74 49 64   TraceOps.NextId
135a0 28 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  (),..           
135b0 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 69       TraceOps.Ti
135c0 6d 65 53 74 61 6d 70 28 44 61 74 65 54 69 6d 65  meStamp(DateTime
135d0 2e 55 74 63 4e 6f 77 29 2c 20 6d 65 73 73 61 67  .UtcNow), messag
135e0 65 29 2c 20 63 61 74 65 67 6f 72 79 29 3b 0d 0a  e), category);..
135f0 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
13600 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d     #endregion...
13610 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
13620 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13630 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13640 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13650 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13660 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67  ....        #reg
13670 69 6f 6e 20 47 65 6e 65 72 69 63 20 53 74 72 69  ion Generic Stri
13680 6e 67 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20  ng Handling..   
13690 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
136a0 74 69 63 20 73 74 72 69 6e 67 20 46 6f 72 44 69  tic string ForDi
136b0 73 70 6c 61 79 28 0d 0a 20 20 20 20 20 20 20 20  splay(..        
136c0 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65      object value
136d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
136e0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
136f0 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
13700 65 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  e == null)..    
13710 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
13720 72 6e 20 22 3c 6e 75 6c 6c 3e 22 3b 0d 0a 0d 0a  rn "<null>";....
13730 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
13740 6e 67 20 72 65 73 75 6c 74 3b 0d 0a 20 20 20 20  ng result;..    
13750 20 20 20 20 20 20 20 20 54 79 70 65 20 74 79 70          Type typ
13760 65 20 3d 20 76 61 6c 75 65 2e 47 65 74 54 79 70  e = value.GetTyp
13770 65 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  e();....        
13780 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20      if (type == 
13790 74 79 70 65 6f 66 28 58 6d 6c 45 6c 65 6d 65 6e  typeof(XmlElemen
137a0 74 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t))..           
137b0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
137c0 20 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74 20 65      XmlElement e
137d0 6c 65 6d 65 6e 74 20 3d 20 28 58 6d 6c 45 6c 65  lement = (XmlEle
137e0 6d 65 6e 74 29 76 61 6c 75 65 3b 0d 0a 0d 0a 20  ment)value;.... 
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13800 65 73 75 6c 74 20 3d 20 65 6c 65 6d 65 6e 74 2e  esult = element.
13810 4f 75 74 65 72 58 6d 6c 3b 0d 0a 20 20 20 20 20  OuterXml;..     
13820 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
13830 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20        else..    
13840 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
13850 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
13860 74 20 3d 20 76 61 6c 75 65 2e 54 6f 53 74 72 69  t = value.ToStri
13870 6e 67 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ng();....       
13880 20 20 20 20 20 20 20 20 20 69 66 20 28 72 65 73           if (res
13890 75 6c 74 2e 4c 65 6e 67 74 68 20 3d 3d 20 30 29  ult.Length == 0)
138a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
138b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 3c 65        return "<e
138c0 6d 70 74 79 3e 22 3b 0d 0a 0d 0a 20 20 20 20 20  mpty>";....     
138d0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
138e0 74 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  t = String.Forma
138f0 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
13900 20 20 20 20 20 20 20 20 74 79 70 65 2e 49 73 53          type.IsS
13910 75 62 63 6c 61 73 73 4f 66 28 74 79 70 65 6f 66  ubclassOf(typeof
13920 28 56 61 6c 75 65 54 79 70 65 29 29 20 3f 20 22  (ValueType)) ? "
13930 7b 30 7d 22 20 3a 20 22 5c 22 7b 30 7d 5c 22 22  {0}" : "\"{0}\""
13940 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
13950 20 20 20 20 20 20 20 72 65 73 75 6c 74 29 3b 0d         result);.
13960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
13970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
13980 74 75 72 6e 20 72 65 73 75 6c 74 3b 0d 0a 20 20  turn result;..  
13990 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
139a0 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 0d 0a 20   #endregion.... 
139b0 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
139c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
139f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
13a00 0d 0a 20 20 20 20 20 20 20 20 23 72 65 67 69 6f  ..        #regio
13a10 6e 20 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b  n .NET Framework
13a20 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20   Handling..     
13a30 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
13a40 63 20 73 74 72 69 6e 67 20 47 65 74 46 72 61 6d  c string GetFram
13a50 65 77 6f 72 6b 44 69 72 65 63 74 6f 72 79 28 0d  eworkDirectory(.
13a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67  .            Reg
13a70 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79  istryKey rootKey
13a80 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  ,..            V
13a90 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b  ersion framework
13aa0 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
13ab0 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
13ac0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
13ad0 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20  bool verbose..  
13ae0 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
13af0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
13b00 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
13b10 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d  egistryKey key =
13b20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
13b30 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 20 72 6f 6f 74 4b 65 79 2c 20 46 72 61 6d 65 77   rootKey, Framew
13b60 6f 72 6b 4b 65 79 4e 61 6d 65 2c 20 66 61 6c 73  orkKeyName, fals
13b70 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  e, whatIf, verbo
13b80 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se))..          
13b90 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
13ba0 20 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20       if (key == 
13bb0 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
13bc0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
13bd0 6e 20 6e 75 6c 6c 3b 0d 0a 0d 0a 20 20 20 20 20  n null;....     
13be0 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63             objec
13bf0 74 20 76 61 6c 75 65 20 3d 20 52 65 67 69 73 74  t value = Regist
13c00 72 79 48 65 6c 70 65 72 2e 47 65 74 56 61 6c 75  ryHelper.GetValu
13c10 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
13c20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 49 6e          key, "In
13c30 73 74 61 6c 6c 52 6f 6f 74 22 2c 20 6e 75 6c 6c  stallRoot", null
13c40 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
13c50 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
13c60 20 20 20 20 20 20 20 69 66 20 28 21 28 76 61 6c         if (!(val
13c70 75 65 20 69 73 20 73 74 72 69 6e 67 29 29 0d 0a  ue is string))..
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 3b      return null;
13ca0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
13cb0 20 20 20 20 72 65 74 75 72 6e 20 50 61 74 68 2e      return Path.
13cc0 43 6f 6d 62 69 6e 65 28 0d 0a 20 20 20 20 20 20  Combine(..      
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
13ce0 74 72 69 6e 67 29 76 61 6c 75 65 2c 20 53 74 72  tring)value, Str
13cf0 69 6e 67 2e 46 6f 72 6d 61 74 28 22 76 7b 30 7d  ing.Format("v{0}
13d00 22 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  ", frameworkVers
13d10 69 6f 6e 29 29 3b 0d 0a 20 20 20 20 20 20 20 20  ion));..        
13d20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d      }..        }
13d30 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
13d40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
13d80 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70  ///....        p
13d90 72 69 76 61 74 65 20 73 74 61 74 69 63 20 73 74  rivate static st
13da0 72 69 6e 67 20 47 65 74 53 64 6b 42 69 6e 61 72  ring GetSdkBinar
13db0 79 46 69 6c 65 4e 61 6d 65 28 0d 0a 20 20 20 20  yFileName(..    
13dc0 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
13dd0 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20  Key rootKey,..  
13de0 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
13df0 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20 20 20   fileName,..    
13e00 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61          bool wha
13e10 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
13e20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 0d 0a    bool verbose..
13e30 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20              ).. 
13e40 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
13e50 20 20 20 20 20 20 53 74 72 69 6e 67 44 69 63 74        StringDict
13e60 69 6f 6e 61 72 79 20 72 65 73 75 6c 74 73 20 3d  ionary results =
13e70 20 6e 65 77 20 53 74 72 69 6e 67 44 69 63 74 69   new StringDicti
13e80 6f 6e 61 72 79 28 29 3b 0d 0a 0d 0a 20 20 20 20  onary();....    
13e90 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b 5d          string[]
13ea0 20 6b 65 79 4e 61 6d 65 73 20 3d 20 7b 0d 0a 20   keyNames = {.. 
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
13ec0 72 61 6d 65 77 6f 72 6b 4b 65 79 4e 61 6d 65 2c  rameworkKeyName,
13ed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13ee0 20 20 46 72 61 6d 65 77 6f 72 6b 53 64 6b 4b 65    FrameworkSdkKe
13ef0 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
13f00 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77 73 53          WindowsS
13f10 64 6b 4b 65 79 4e 61 6d 65 0d 0a 20 20 20 20 20  dkKeyName..     
13f20 20 20 20 20 20 20 20 7d 3b 0d 0a 0d 0a 20 20 20         };....   
13f30 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 5b           string[
13f40 5d 20 76 61 6c 75 65 4e 61 6d 65 73 20 3d 20 7b  ] valueNames = {
13f50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
13f60 20 20 22 73 64 6b 49 6e 73 74 61 6c 6c 52 6f 6f    "sdkInstallRoo
13f70 74 76 32 2e 30 22 2c 0d 0a 20 20 20 20 20 20 20  tv2.0",..       
13f80 20 20 20 20 20 20 20 20 20 22 49 6e 73 74 61 6c           "Instal
13f90 6c 61 74 69 6f 6e 46 6f 6c 64 65 72 22 2c 0d 0a  lationFolder",..
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 22 49 6e 73 74 61 6c 6c 61 74 69 6f 6e 46 6f 6c  "InstallationFol
13fc0 64 65 72 22 0d 0a 20 20 20 20 20 20 20 20 20 20  der"..          
13fd0 20 20 7d 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20    };....        
13fe0 20 20 20 20 62 6f 6f 6c 5b 5d 20 75 73 65 53 75      bool[] useSu
13ff0 62 4b 65 79 73 20 3d 20 7b 0d 0a 20 20 20 20 20  bKeys = {..     
14000 20 20 20 20 20 20 20 20 20 20 20 66 61 6c 73 65             false
14010 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
14020 20 20 20 74 72 75 65 2c 0d 0a 20 20 20 20 20 20     true,..      
14030 20 20 20 20 20 20 20 20 20 20 74 72 75 65 0d 0a            true..
14040 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0d 0a              };..
14050 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ..            fo
14060 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d 20 30  r (int index = 0
14070 3b 20 69 6e 64 65 78 20 3c 20 6b 65 79 4e 61 6d  ; index < keyNam
14080 65 73 2e 4c 65 6e 67 74 68 3b 20 69 6e 64 65 78  es.Length; index
14090 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ++)..           
140a0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
140b0 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
140c0 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d  egistryKey key =
140d0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
140e0 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14100 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65       rootKey, ke
14110 79 4e 61 6d 65 73 5b 69 6e 64 65 78 5d 2c 20 66  yNames[index], f
14120 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65  alse, whatIf, ve
14130 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
14140 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29  if (key == null)
14170 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14180 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
14190 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
141a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 75             if (u
141b0 73 65 53 75 62 4b 65 79 73 5b 69 6e 64 65 78 5d  seSubKeys[index]
141c0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
141d0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 66 6f 72 65 61 63 68 20 28 73 74 72 69 6e    foreach (strin
14200 67 20 73 75 62 4b 65 79 4e 61 6d 65 20 69 6e 20  g subKeyName in 
14210 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 47  RegistryHelper.G
14220 65 74 53 75 62 4b 65 79 4e 61 6d 65 73 28 0d 0a  etSubKeyNames(..
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14250 6b 65 79 2c 20 77 68 61 74 49 66 2c 20 76 65 72  key, whatIf, ver
14260 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
14270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14280 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
142a0 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74  sing (MockRegist
142b0 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52  ryKey subKey = R
142c0 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70  egistryHelper.Op
142d0 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  enSubKey(..     
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 6b                 k
14300 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20  ey, subKeyName, 
14310 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76  false, whatIf, v
14320 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
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 20 69 66 20 28 73 75 62           if (sub
14370 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  Key == null)..  
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 20 20 20 20 20 20 20                  
143a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20    continue;.... 
143b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
143d0 62 6a 65 63 74 20 76 61 6c 75 65 20 3d 20 52 65  bject value = Re
143e0 67 69 73 74 72 79 48 65 6c 70 65 72 2e 47 65 74  gistryHelper.Get
143f0 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 20 20 20 20 20 20 20 20 20 20 20 20 73 75 62 4b              subK
14420 65 79 2c 20 76 61 6c 75 65 4e 61 6d 65 73 5b 69  ey, valueNames[i
14430 6e 64 65 78 5d 2c 20 6e 75 6c 6c 2c 20 77 68 61  ndex], null, wha
14440 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf,..          
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73            verbos
14470 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  e);....         
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 20 20 69 66 20 28 21 28 76 61 6c         if (!(val
144a0 75 65 20 69 73 20 73 74 72 69 6e 67 29 29 0d 0a  ue is string))..
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d      continue;...
144e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 73 74 72 69 6e 67 20 70 61 74 68 20 3d 20 28   string path = (
14510 73 74 72 69 6e 67 29 76 61 6c 75 65 3b 0d 0a 0d  string)value;...
14520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 69 66 20 28 21 44 69 72 65 63 74 6f 72 79 2e   if (!Directory.
14550 45 78 69 73 74 73 28 70 61 74 68 29 29 0d 0a 20  Exists(path)).. 
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 20 20 20 20 20 20 20 20                  
14580 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a     continue;....
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 70 61 74 68 20 3d 20 50 61 74 68 2e 43 6f 6d 62  path = Path.Comb
145c0 69 6e 65 28 70 61 74 68 2c 20 22 62 69 6e 22 29  ine(path, "bin")
145d0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 20 69 66 20 28 21 44 69 72 65 63 74       if (!Direct
14600 6f 72 79 2e 45 78 69 73 74 73 28 70 61 74 68 29  ory.Exists(path)
14610 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
14620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14630 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14640 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49      if (String.I
14670 73 4e 75 6c 6c 4f 72 45 6d 70 74 79 28 66 69 6c  sNullOrEmpty(fil
14680 65 4e 61 6d 65 29 29 0d 0a 20 20 20 20 20 20 20  eName))..       
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
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 20 20 20 20 20 20 20 20                  
146d0 72 65 73 75 6c 74 73 2e 41 64 64 28 73 75 62 4b  results.Add(subK
146e0 65 79 2e 4e 61 6d 65 2c 20 70 61 74 68 29 3b 0d  ey.Name, path);.
146f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a       continue;..
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 70 61 74 68 20 3d 20 50 61 74 68       path = Path
14770 2e 43 6f 6d 62 69 6e 65 28 70 61 74 68 2c 20 66  .Combine(path, f
14780 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  ileName);....   
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
147b0 28 46 69 6c 65 2e 45 78 69 73 74 73 28 70 61 74  (File.Exists(pat
147c0 68 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  h))..           
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147e0 20 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 73           results
147f0 2e 41 64 64 28 73 75 62 4b 65 79 2e 4e 61 6d 65  .Add(subKey.Name
14800 2c 20 70 61 74 68 29 3b 0d 0a 20 20 20 20 20 20  , path);..      
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
14850 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
14870 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20  lse..           
14880 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65      object value
148b0 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
148c0 72 2e 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20  r.GetValue(..   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 76 61           key, va
148f0 6c 75 65 4e 61 6d 65 73 5b 69 6e 64 65 78 5d 2c  lueNames[index],
14900 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66 2c 20 76   null, whatIf, v
14910 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20  erbose);....    
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 69 66 20 28 21 28 76 61 6c 75 65 20      if (!(value 
14940 69 73 20 73 74 72 69 6e 67 29 29 0d 0a 20 20 20  is string))..   
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14970 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  e;....          
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
14990 72 69 6e 67 20 70 61 74 68 20 3d 20 28 73 74 72  ring path = (str
149a0 69 6e 67 29 76 61 6c 75 65 3b 0d 0a 0d 0a 20 20  ing)value;....  
149b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149c0 20 20 20 20 20 20 69 66 20 28 21 44 69 72 65 63        if (!Direc
149d0 74 6f 72 79 2e 45 78 69 73 74 73 28 70 61 74 68  tory.Exists(path
149e0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a00 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20  continue;....   
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a20 20 20 20 20 20 70 61 74 68 20 3d 20 50 61 74 68       path = Path
14a30 2e 43 6f 6d 62 69 6e 65 28 70 61 74 68 2c 20 22  .Combine(path, "
14a40 62 69 6e 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bin");....      
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 69 66 20 28 21 44 69 72 65 63 74 6f 72 79    if (!Directory
14a70 2e 45 78 69 73 74 73 28 70 61 74 68 29 29 0d 0a  .Exists(path))..
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
14aa0 69 6e 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  inue;....       
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e 75   if (String.IsNu
14ad0 6c 6c 4f 72 45 6d 70 74 79 28 66 69 6c 65 4e 61  llOrEmpty(fileNa
14ae0 6d 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  me))..          
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
14b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
14b20 75 6c 74 73 2e 41 64 64 28 6b 65 79 2e 4e 61 6d  ults.Add(key.Nam
14b30 65 2c 20 70 61 74 68 29 3b 0d 0a 20 20 20 20 20  e, path);..     
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
14b70 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 20 70 61 74 68 20 3d 20 50 61         path = Pa
14ba0 74 68 2e 43 6f 6d 62 69 6e 65 28 70 61 74 68 2c  th.Combine(path,
14bb0 20 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a 20   fileName);.... 
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 20 20 20 20 69 66 20 28 46 69 6c 65 2e         if (File.
14be0 45 78 69 73 74 73 28 70 61 74 68 29 29 0d 0a 20  Exists(path)).. 
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
14c10 74 73 2e 41 64 64 28 6b 65 79 2e 4e 61 6d 65 2c  ts.Add(key.Name,
14c20 20 70 61 74 68 29 3b 0d 0a 20 20 20 20 20 20 20   path);..       
14c30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c50 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
14c60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
14c70 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  //..            
14c80 2f 2f 20 4e 4f 54 45 3a 20 49 66 20 77 65 20 66  // NOTE: If we f
14c90 6f 75 6e 64 20 73 6f 6d 65 20 72 65 73 75 6c 74  ound some result
14ca0 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6c 61  s, return the la
14cb0 73 74 20 28 6c 61 74 65 73 74 29 20 6f 6e 65 2e  st (latest) one.
14cc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
14cd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
14ce0 20 28 72 65 73 75 6c 74 73 2e 43 6f 75 6e 74 20   (results.Count 
14cf0 3e 20 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  > 0)..          
14d00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73        return res
14d10 75 6c 74 73 5b 6e 65 77 20 53 74 72 69 6e 67 4c  ults[new StringL
14d20 69 73 74 28 72 65 73 75 6c 74 73 2e 4b 65 79 73  ist(results.Keys
14d30 29 5b 72 65 73 75 6c 74 73 2e 43 6f 75 6e 74 20  )[results.Count 
14d40 2d 20 31 5d 5d 3b 0d 0a 0d 0a 20 20 20 20 20 20  - 1]];....      
14d50 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c        return nul
14d60 6c 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20  l;..        }.. 
14d70 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f         #endregio
14d80 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f  n....        ///
14d90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14dc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
14dd0 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ////....        
14de0 23 72 65 67 69 6f 6e 20 50 65 72 2d 46 72 61 6d  #region Per-Fram
14df0 65 77 6f 72 6b 2f 50 6c 61 74 66 6f 72 6d 20 48  ework/Platform H
14e00 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  andling..       
14e10 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
14e20 76 6f 69 64 20 49 6e 69 74 69 61 6c 69 7a 65 41  void InitializeA
14e30 6c 6c 46 72 61 6d 65 77 6f 72 6b 73 28 0d 0a 20  llFrameworks(.. 
14e40 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
14e50 67 75 72 61 74 69 6f 6e 20 63 6f 6e 66 69 67 75  guration configu
14e60 72 61 74 69 6f 6e 0d 0a 20 20 20 20 20 20 20 20  ration..        
14e70 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
14e80 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
14e90 20 28 66 72 61 6d 65 77 6f 72 6b 52 6f 6f 74 4b   (frameworkRootK
14ea0 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61               fra
14ec0 6d 65 77 6f 72 6b 52 6f 6f 74 4b 65 79 20 3d 20  meworkRootKey = 
14ed0 52 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61  Registry.LocalMa
14ee0 63 68 69 6e 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  chine;....      
14ef0 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77        if (framew
14f00 6f 72 6b 4e 61 6d 65 4c 69 73 74 20 3d 3d 20 6e  orkNameList == n
14f10 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
14f20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
14f30 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 4e 61       frameworkNa
14f40 6d 65 4c 69 73 74 20 3d 20 6e 65 77 20 53 74 72  meList = new Str
14f50 69 6e 67 4c 69 73 74 28 29 3b 0d 0a 0d 0a 20 20  ingList();....  
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
14f70 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   ((configuration
14f80 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f   == null) || !co
14f90 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 44 65  nfiguration.NoDe
14fa0 73 6b 74 6f 70 29 0d 0a 20 20 20 20 20 20 20 20  sktop)..        
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
14fc0 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 41 64  eworkNameList.Ad
14fd0 64 28 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b  d(".NETFramework
14fe0 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
14ff0 20 20 20 20 20 20 20 69 66 20 28 28 63 6f 6e 66         if ((conf
15000 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c  iguration == nul
15010 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75 72 61  l) || !configura
15020 74 69 6f 6e 2e 4e 6f 43 6f 6d 70 61 63 74 29 0d  tion.NoCompact).
15030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15040 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15050 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f 72          framewor
15060 6b 4e 61 6d 65 4c 69 73 74 2e 41 64 64 28 22 2e  kNameList.Add(".
15070 4e 45 54 43 6f 6d 70 61 63 74 46 72 61 6d 65 77  NETCompactFramew
15080 6f 72 6b 22 29 3b 0d 0a 20 20 20 20 20 20 20 20  ork");..        
15090 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
150a0 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 41 64  eworkNameList.Ad
150b0 64 28 22 2e 4e 45 54 43 6f 6d 70 61 63 74 46 72  d(".NETCompactFr
150c0 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a 20 20 20 20  amework");..    
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73  frameworkNameLis
150f0 74 2e 41 64 64 28 22 2e 4e 45 54 43 6f 6d 70 61  t.Add(".NETCompa
15100 63 74 46 72 61 6d 65 77 6f 72 6b 22 29 3b 0d 0a  ctFramework");..
15110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15120 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
15130 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
15140 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 56 65 72  if (frameworkVer
15150 73 69 6f 6e 4d 61 70 20 3d 3d 20 6e 75 6c 6c 29  sionMap == null)
15160 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15170 20 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69    frameworkVersi
15180 6f 6e 4d 61 70 20 3d 20 6e 65 77 20 56 65 72 73  onMap = new Vers
15190 69 6f 6e 4d 61 70 28 29 3b 0d 0a 0d 0a 20 20 20  ionMap();....   
151a0 20 20 20 20 20 20 20 20 20 69 66 20 28 28 63 6f           if ((co
151b0 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e  nfiguration == n
151c0 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75  ull) || !configu
151d0 72 61 74 69 6f 6e 2e 4e 6f 44 65 73 6b 74 6f 70  ration.NoDesktop
151e0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
151f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15200 20 20 56 65 72 73 69 6f 6e 4c 69 73 74 20 64 65    VersionList de
15210 73 6b 74 6f 70 56 65 72 73 69 6f 6e 4c 69 73 74  sktopVersionList
15220 20 3d 20 6e 65 77 20 56 65 72 73 69 6f 6e 4c 69   = new VersionLi
15230 73 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  st();....       
15240 20 20 20 20 20 20 20 20 20 69 66 20 28 28 63 6f           if ((co
15250 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e  nfiguration == n
15260 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75  ull) || !configu
15270 72 61 74 69 6f 6e 2e 4e 6f 4e 65 74 46 78 32 30  ration.NoNetFx20
15280 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
15290 20 20 20 20 20 20 20 64 65 73 6b 74 6f 70 56 65         desktopVe
152a0 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64 28 6e 65  rsionList.Add(ne
152b0 77 20 56 65 72 73 69 6f 6e 28 32 2c 20 30 2c 20  w Version(2, 0, 
152c0 35 30 37 32 37 29 29 3b 0d 0a 0d 0a 20 20 20 20  50727));....    
152d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
152e0 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d  (configuration =
152f0 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66  = null) || !conf
15300 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 4e 65 74 46  iguration.NoNetF
15310 78 34 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20  x40)..          
15320 20 20 20 20 20 20 20 20 20 20 64 65 73 6b 74 6f            deskto
15330 70 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64  pVersionList.Add
15340 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 34 2c 20  (new Version(4, 
15350 30 2c 20 33 30 33 31 39 29 29 3b 0d 0a 0d 0a 20  0, 30319));.... 
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
15370 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4d  rameworkVersionM
15380 61 70 2e 41 64 64 28 22 2e 4e 45 54 46 72 61 6d  ap.Add(".NETFram
15390 65 77 6f 72 6b 22 2c 20 64 65 73 6b 74 6f 70 56  ework", desktopV
153a0 65 72 73 69 6f 6e 4c 69 73 74 29 3b 0d 0a 20 20  ersionList);..  
153b0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
153c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
153d0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d  configuration ==
153e0 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69   null) || !confi
153f0 67 75 72 61 74 69 6f 6e 2e 4e 6f 43 6f 6d 70 61  guration.NoCompa
15400 63 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ct)..           
15410 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15420 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 56 65 72      frameworkVer
15430 73 69 6f 6e 4d 61 70 2e 41 64 64 28 22 2e 4e 45  sionMap.Add(".NE
15440 54 43 6f 6d 70 61 63 74 46 72 61 6d 65 77 6f 72  TCompactFramewor
15450 6b 22 2c 20 6e 65 77 20 56 65 72 73 69 6f 6e 4c  k", new VersionL
15460 69 73 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ist(..          
15470 20 20 20 20 20 20 20 20 20 20 6e 65 77 20 56 65            new Ve
15480 72 73 69 6f 6e 5b 5d 20 7b 0d 0a 20 20 20 20 20  rsion[] {..     
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
154a0 65 77 20 56 65 72 73 69 6f 6e 28 32 2c 20 30 2c  ew Version(2, 0,
154b0 20 30 2c 20 30 29 2c 20 6e 65 77 20 56 65 72 73   0, 0), new Vers
154c0 69 6f 6e 28 33 2c 20 35 2c 20 30 2c 20 30 29 0d  ion(3, 5, 0, 0).
154d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
154e0 20 7d 29 29 3b 0d 0a 20 20 20 20 20 20 20 20 20   }));..         
154f0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
15500 20 20 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d      if (platform
15510 4e 61 6d 65 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c  NameList == null
15520 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
15530 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15540 20 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69    platformNameLi
15550 73 74 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 4c  st = new StringL
15560 69 73 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  ist();....      
15570 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28 63            if ((c
15580 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20  onfiguration == 
15590 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67  null) || !config
155a0 75 72 61 74 69 6f 6e 2e 4e 6f 44 65 73 6b 74 6f  uration.NoDeskto
155b0 70 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  p)..            
155c0 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
155d0 4e 61 6d 65 4c 69 73 74 2e 41 64 64 28 6e 75 6c  NameList.Add(nul
155e0 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  l);....         
155f0 20 20 20 20 20 20 20 69 66 20 28 28 63 6f 6e 66         if ((conf
15600 69 67 75 72 61 74 69 6f 6e 20 3d 3d 20 6e 75 6c  iguration == nul
15610 6c 29 20 7c 7c 20 21 63 6f 6e 66 69 67 75 72 61  l) || !configura
15620 74 69 6f 6e 2e 4e 6f 43 6f 6d 70 61 63 74 29 0d  tion.NoCompact).
15630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15640 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15650 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
15660 4e 61 6d 65 4c 69 73 74 2e 41 64 64 28 22 50 6f  NameList.Add("Po
15670 63 6b 65 74 50 43 22 29 3b 0d 0a 20 20 20 20 20  cketPC");..     
15680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15690 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
156a0 41 64 64 28 22 53 6d 61 72 74 70 68 6f 6e 65 22  Add("Smartphone"
156b0 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
156c0 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
156d0 4e 61 6d 65 4c 69 73 74 2e 41 64 64 28 22 57 69  NameList.Add("Wi
156e0 6e 64 6f 77 73 43 45 22 29 3b 0d 0a 20 20 20 20  ndowsCE");..    
156f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
15700 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
15710 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15720 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
15730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15760 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
15770 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
15780 61 74 69 63 20 62 6f 6f 6c 20 48 61 76 65 46 72  atic bool HaveFr
15790 61 6d 65 77 6f 72 6b 28 0d 0a 20 20 20 20 20 20  amework(..      
157a0 20 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65        RegistryKe
157b0 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20  y rootKey,..    
157c0 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66          string f
157d0 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20  rameworkName,.. 
157e0 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69             Versi
157f0 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  on frameworkVers
15800 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
15810 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72    string platfor
15820 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  mName,..        
15830 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
15840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
15850 6f 6c 20 76 65 72 62 6f 73 65 0d 0a 20 20 20 20  ol verbose..    
15860 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
15870 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
15880 20 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20    string format 
15890 3d 20 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c  = !String.IsNull
158a0 4f 72 45 6d 70 74 79 28 70 6c 61 74 66 6f 72 6d  OrEmpty(platform
158b0 4e 61 6d 65 29 20 3f 0d 0a 20 20 20 20 20 20 20  Name) ?..       
158c0 20 20 20 20 20 20 20 20 20 22 53 6f 66 74 77 61           "Softwa
158d0 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b  re\\Microsoft\\{
158e0 30 7d 5c 5c 76 7b 31 7d 5c 5c 7b 32 7d 22 20 3a  0}\\v{1}\\{2}" :
158f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
15900 20 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69 63    "Software\\Mic
15910 72 6f 73 6f 66 74 5c 5c 7b 30 7d 5c 5c 76 7b 31  rosoft\\{0}\\v{1
15920 7d 22 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  }";....         
15930 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
15940 65 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  e = String.Forma
15950 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
15960 20 20 20 20 66 6f 72 6d 61 74 2c 20 66 72 61 6d      format, fram
15970 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65  eworkName, frame
15980 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61  workVersion, pla
15990 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  tformName);.... 
159a0 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
159b0 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
159c0 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79  y key = Registry
159d0 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
159e0 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
159f0 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
15a00 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c   keyName, false,
15a10 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
15a20 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
15a30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
15a40 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75     if (key == nu
15a50 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
15a60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15a70 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20  false;....      
15a80 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70 6c            if (pl
15a90 61 74 66 6f 72 6d 4e 61 6d 65 20 21 3d 20 6e 75  atformName != nu
15aa0 6c 6c 29 20 2f 2f 20 4e 4f 54 45 3a 20 53 6b 69  ll) // NOTE: Ski
15ab0 70 20 6e 6f 6e 2d 64 65 73 6b 74 6f 70 20 66 72  p non-desktop fr
15ac0 61 6d 65 77 6f 72 6b 73 2e 0d 0a 20 20 20 20 20  ameworks...     
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
15ae0 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 0d 0a 20  eturn true;.... 
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
15b00 74 72 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  tring directory 
15b10 3d 20 47 65 74 46 72 61 6d 65 77 6f 72 6b 44 69  = GetFrameworkDi
15b20 72 65 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20  rectory(..      
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
15b40 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f 72 6b  otKey, framework
15b50 56 65 72 73 69 6f 6e 2c 20 77 68 61 74 49 66 2c  Version, whatIf,
15b60 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
15b80 20 28 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f   (String.IsNullO
15b90 72 45 6d 70 74 79 28 64 69 72 65 63 74 6f 72 79  rEmpty(directory
15ba0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
15bb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
15bc0 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  alse;....       
15bd0 20 20 20 20 20 20 20 20 20 69 66 20 28 21 44 69           if (!Di
15be0 72 65 63 74 6f 72 79 2e 45 78 69 73 74 73 28 64  rectory.Exists(d
15bf0 69 72 65 63 74 6f 72 79 29 29 0d 0a 20 20 20 20  irectory))..    
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d  return false;...
15c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c30 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20   return true;.. 
15c40 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
15c50 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
15c60 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
15c70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15c80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15c90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15ca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
15cb0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
15cc0 61 74 69 63 20 62 6f 6f 6c 20 46 6f 72 45 61 63  atic bool ForEac
15cd0 68 46 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67  hFrameworkConfig
15ce0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  (..            F
15cf0 72 61 6d 65 77 6f 72 6b 43 6f 6e 66 69 67 43 61  rameworkConfigCa
15d00 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 2c  llback callback,
15d10 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
15d20 72 69 6e 67 20 69 6e 76 61 72 69 61 6e 74 2c 0d  ring invariant,.
15d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
15d40 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20 20 20 20  ing name,..     
15d50 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 64 65         string de
15d60 73 63 72 69 70 74 69 6f 6e 2c 0d 0a 20 20 20 20  scription,..    
15d70 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 74          string t
15d80 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20  ypeName,..      
15d90 20 20 20 20 20 20 41 73 73 65 6d 62 6c 79 4e 61        AssemblyNa
15da0 6d 65 20 61 73 73 65 6d 62 6c 79 4e 61 6d 65 2c  me assemblyName,
15db0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62  ..            ob
15dc0 6a 65 63 74 20 63 6c 69 65 6e 74 44 61 74 61 2c  ject clientData,
15dd0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
15de0 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
15df0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
15e00 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
15e10 20 20 20 72 65 66 20 62 6f 6f 6c 20 73 61 76 65     ref bool save
15e20 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
15e30 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72  ref string error
15e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
15e50 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
15e60 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
15e70 4b 65 79 20 72 6f 6f 74 4b 65 79 20 3d 20 66 72  Key rootKey = fr
15e80 61 6d 65 77 6f 72 6b 52 6f 6f 74 4b 65 79 3b 0d  ameworkRootKey;.
15e90 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
15ea0 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d 20 6e 75  f (rootKey == nu
15eb0 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
15ec0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
15ed0 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69 6e 76      error = "inv
15ee0 61 6c 69 64 20 72 6f 6f 74 20 6b 65 79 22 3b 0d  alid root key";.
15ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f00 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
15f10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
15f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
15f30 28 21 4f 62 6a 65 63 74 2e 52 65 66 65 72 65 6e  (!Object.Referen
15f40 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b 65 79  ceEquals(rootKey
15f50 2c 20 52 65 67 69 73 74 72 79 2e 43 75 72 72 65  , Registry.Curre
15f60 6e 74 55 73 65 72 29 20 26 26 0d 0a 20 20 20 20  ntUser) &&..    
15f70 20 20 20 20 20 20 20 20 20 20 20 20 21 4f 62 6a              !Obj
15f80 65 63 74 2e 52 65 66 65 72 65 6e 63 65 45 71 75  ect.ReferenceEqu
15f90 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20 52 65 67  als(rootKey, Reg
15fa0 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61 63 68 69  istry.LocalMachi
15fb0 6e 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ne))..          
15fc0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
15fd0 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 72 6f       error = "ro
15fe0 6f 74 20 6b 65 79 20 6d 75 73 74 20 62 65 20 70  ot key must be p
15ff0 65 72 2d 75 73 65 72 20 6f 72 20 70 65 72 2d 6d  er-user or per-m
16000 61 63 68 69 6e 65 22 3b 0d 0a 20 20 20 20 20 20  achine";..      
16010 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16020 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
16030 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
16040 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77        if (framew
16050 6f 72 6b 4e 61 6d 65 4c 69 73 74 20 3d 3d 20 6e  orkNameList == n
16060 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
16070 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
16080 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f       error = "no
16090 20 66 72 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 73   framework names
160a0 20 66 6f 75 6e 64 22 3b 0d 0a 20 20 20 20 20 20   found";..      
160b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
160c0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
160d0 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
160e0 20 20 20 20 20 20 69 66 20 28 66 72 61 6d 65 77        if (framew
160f0 6f 72 6b 56 65 72 73 69 6f 6e 4d 61 70 20 3d 3d  orkVersionMap ==
16100 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
16110 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
16120 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
16130 6e 6f 20 66 72 61 6d 65 77 6f 72 6b 20 76 65 72  no framework ver
16140 73 69 6f 6e 73 20 66 6f 75 6e 64 22 3b 0d 0a 20  sions found";.. 
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
16160 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
16170 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
16180 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
16190 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 20  latformNameList 
161a0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
161b0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
161c0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
161d0 20 22 6e 6f 20 70 6c 61 74 66 6f 72 6d 20 6e 61   "no platform na
161e0 6d 65 73 20 66 6f 75 6e 64 22 3b 0d 0a 20 20 20  mes found";..   
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
16200 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
16210 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16220 20 20 20 20 20 20 20 20 20 69 66 20 28 66 72 61           if (fra
16230 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43  meworkNameList.C
16240 6f 75 6e 74 20 21 3d 20 70 6c 61 74 66 6f 72 6d  ount != platform
16250 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 29 0d  NameList.Count).
16260 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
16290 6f 72 6d 61 74 28 22 66 72 61 6d 65 77 6f 72 6b  ormat("framework
162a0 20 6e 61 6d 65 20 63 6f 75 6e 74 20 7b 30 7d 20   name count {0} 
162b0 64 6f 65 73 20 6e 6f 74 20 22 20 2b 0d 0a 20 20  does not " +..  
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 22 6d 61 74 63 68 20 70 6c 61 74 66 6f 72    "match platfor
162e0 6d 20 6e 61 6d 65 20 63 6f 75 6e 74 20 7b 31 7d  m name count {1}
162f0 22 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  ", frameworkName
16300 4c 69 73 74 2e 43 6f 75 6e 74 2c 0d 0a 20 20 20  List.Count,..   
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73   platformNameLis
16330 74 2e 43 6f 75 6e 74 29 3b 0d 0a 0d 0a 20 20 20  t.Count);....   
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
16350 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
16360 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
16370 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e           for (in
16380 74 20 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64  t index = 0; ind
16390 65 78 20 3c 20 66 72 61 6d 65 77 6f 72 6b 4e 61  ex < frameworkNa
163a0 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 3b 20 69 6e  meList.Count; in
163b0 64 65 78 2b 2b 29 0d 0a 20 20 20 20 20 20 20 20  dex++)..        
163c0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
163d0 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
163e0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f             // NO
163f0 54 45 3a 20 47 72 61 62 20 74 68 65 20 6e 61 6d  TE: Grab the nam
16400 65 20 6f 66 20 74 68 65 20 66 72 61 6d 65 77 6f  e of the framewo
16410 72 6b 20 28 65 2e 67 2e 20 22 2e 4e 45 54 46 72  rk (e.g. ".NETFr
16420 61 6d 65 77 6f 72 6b 22 29 0d 0a 20 20 20 20 20  amework")..     
16430 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20             //   
16440 20 20 20 20 61 6e 64 20 74 68 65 20 6e 61 6d 65      and the name
16450 20 6f 66 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   of the platform
16460 20 28 65 2e 67 2e 20 22 57 69 6e 64 6f 77 73 43   (e.g. "WindowsC
16470 45 22 29 2e 0d 0a 20 20 20 20 20 20 20 20 20 20  E")...          
16480 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20        //..      
16490 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
164a0 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 20 3d   frameworkName =
164b0 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69   frameworkNameLi
164c0 73 74 5b 69 6e 64 65 78 5d 3b 0d 0a 20 20 20 20  st[index];..    
164d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
164e0 6e 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 20  ng platformName 
164f0 3d 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69  = platformNameLi
16500 73 74 5b 69 6e 64 65 78 5d 3b 0d 0a 0d 0a 20 20  st[index];....  
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
16520 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16530 20 20 2f 2f 20 4e 4f 54 45 3a 20 53 6b 69 70 20    // NOTE: Skip 
16540 61 6c 6c 20 6e 6f 6e 2d 64 65 73 6b 74 6f 70 20  all non-desktop 
16550 66 72 61 6d 65 77 6f 72 6b 73 20 28 69 2e 65 2e  frameworks (i.e.
16560 20 69 66 20 74 68 65 20 70 6c 61 74 66 6f 72 6d   if the platform
16570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16580 20 20 2f 2f 20 20 20 20 20 20 20 6e 61 6d 65 20    //       name 
16590 69 73 20 6e 6f 74 20 6e 75 6c 6c 29 2e 0d 0a 20  is not null)... 
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165b0 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
165c0 20 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d 4e     if (platformN
165d0 61 6d 65 20 21 3d 20 6e 75 6c 6c 29 0d 0a 20 20  ame != null)..  
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d 0a 20    continue;.... 
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16610 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /..             
16620 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61 62     // NOTE: Grab
16630 20 74 68 65 20 73 75 70 70 6f 72 74 65 64 20 76   the supported v
16640 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
16650 70 61 72 74 69 63 75 6c 61 72 0d 0a 20 20 20 20  particular..    
16660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 20              //  
16670 20 20 20 20 20 66 72 61 6d 65 77 6f 72 6b 2e 0d       framework..
16680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16690 20 2f 2f 0d 0a 20 20 20 20 20 20 20 20 20 20 20   //..           
166a0 20 20 20 20 20 56 65 72 73 69 6f 6e 4c 69 73 74       VersionList
166b0 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
166c0 6e 4c 69 73 74 3b 0d 0a 0d 0a 20 20 20 20 20 20  nList;....      
166d0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 66            if (!f
166e0 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4d  rameworkVersionM
166f0 61 70 2e 54 72 79 47 65 74 56 61 6c 75 65 28 0d  ap.TryGetValue(.
16700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16710 20 20 20 20 20 20 20 20 20 66 72 61 6d 65 77 6f           framewo
16720 72 6b 4e 61 6d 65 2c 20 6f 75 74 20 66 72 61 6d  rkName, out fram
16730 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74  eworkVersionList
16740 29 20 7c 7c 0d 0a 20 20 20 20 20 20 20 20 20 20  ) ||..          
16750 20 20 20 20 20 20 20 20 20 20 28 66 72 61 6d 65            (frame
16760 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73 74 20  workVersionList 
16770 3d 3d 20 6e 75 6c 6c 29 29 0d 0a 20 20 20 20 20  == null))..     
16780 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20 20    continue;..   
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
167c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
167d0 20 20 66 6f 72 65 61 63 68 20 28 56 65 72 73 69    foreach (Versi
167e0 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  on frameworkVers
167f0 69 6f 6e 20 69 6e 20 66 72 61 6d 65 77 6f 72 6b  ion in framework
16800 56 65 72 73 69 6f 6e 4c 69 73 74 29 0d 0a 20 20  VersionList)..  
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
16820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16830 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72       TraceOps.Tr
16840 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63  ace(traceCallbac
16850 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74  k, String.Format
16860 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
16870 20 20 20 20 20 20 20 20 20 20 20 22 66 72 61 6d             "fram
16880 65 77 6f 72 6b 4e 61 6d 65 20 3d 20 7b 30 7d 2c  eworkName = {0},
16890 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
168a0 6e 20 3d 20 7b 31 7d 2c 20 22 20 2b 0d 0a 20 20  n = {1}, " +..  
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 22 70 6c 61 74 66 6f 72 6d 4e        "platformN
168d0 61 6d 65 20 3d 20 7b 32 7d 22 2c 20 46 6f 72 44  ame = {2}", ForD
168e0 69 73 70 6c 61 79 28 66 72 61 6d 65 77 6f 72 6b  isplay(framework
168f0 4e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20  Name),..        
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 46 6f 72 44 69 73 70 6c 61 79 28 66 72 61 6d 65  ForDisplay(frame
16920 77 6f 72 6b 56 65 72 73 69 6f 6e 29 2c 0d 0a 20  workVersion),.. 
16930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16940 20 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61         ForDispla
16950 79 28 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 29 29  y(platformName))
16960 2c 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29  , traceCategory)
16970 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
16980 20 20 20 20 20 20 20 20 20 69 66 20 28 21 48 61           if (!Ha
16990 76 65 46 72 61 6d 65 77 6f 72 6b 28 0d 0a 20 20  veFramework(..  
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 20 72 6f 6f 74 4b 65            rootKe
169c0 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  y, frameworkName
169d0 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  , frameworkVersi
169e0 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 20 77   platformName, w
16a10 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29  hatIf, verbose))
16a20 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16a30 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
16a60 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 0d 0a  traceCallback,..
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 20 20 20 20 20 20 20 20 20 22 2e 4e 45              ".NE
16a90 54 20 46 72 61 6d 65 77 6f 72 6b 20 6e 6f 74 20  T Framework not 
16aa0 66 6f 75 6e 64 2c 20 73 6b 69 70 70 69 6e 67 2e  found, skipping.
16ab0 2e 2e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ..",..          
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 74 72 61 63 65 43 61 74 65 67 6f 72 79 29    traceCategory)
16ae0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
16b00 74 69 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20  tinue;..        
16b10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
16b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b30 20 20 20 20 20 69 66 20 28 63 61 6c 6c 62 61 63       if (callbac
16b40 6b 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  k == null)..    
16b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b60 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 0d      continue;...
16b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16b80 20 20 20 20 20 73 74 72 69 6e 67 20 64 69 72 65       string dire
16b90 63 74 6f 72 79 20 3d 20 47 65 74 46 72 61 6d 65  ctory = GetFrame
16ba0 77 6f 72 6b 44 69 72 65 63 74 6f 72 79 28 0d 0a  workDirectory(..
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
16bd0 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f   frameworkVersio
16be0 6e 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  n, whatIf, verbo
16bf0 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
16c00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
16c10 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72 45  String.IsNullOrE
16c20 6d 70 74 79 28 64 69 72 65 63 74 6f 72 79 29 29  mpty(directory))
16c30 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16c40 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
16c70 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
16c80 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ca0 20 20 20 20 20 20 20 20 20 20 20 22 2e 4e 45 54             ".NET
16cb0 20 46 72 61 6d 65 77 6f 72 6b 20 76 7b 30 7d 20   Framework v{0} 
16cc0 64 69 72 65 63 74 6f 72 79 20 69 73 20 69 6e 76  directory is inv
16cd0 61 6c 69 64 2c 20 22 20 2b 0d 0a 20 20 20 20 20  alid, " +..     
16ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cf0 20 20 20 20 20 20 20 22 73 6b 69 70 70 69 6e 67         "skipping
16d00 2e 2e 2e 22 2c 20 66 72 61 6d 65 77 6f 72 6b 56  ...", frameworkV
16d10 65 72 73 69 6f 6e 29 2c 20 74 72 61 63 65 43 61  ersion), traceCa
16d20 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
16d70 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72 65              dire
16d80 63 74 6f 72 79 20 3d 20 50 61 74 68 2e 43 6f 6d  ctory = Path.Com
16d90 62 69 6e 65 28 64 69 72 65 63 74 6f 72 79 2c 20  bine(directory, 
16da0 22 43 6f 6e 66 69 67 22 29 3b 0d 0a 0d 0a 20 20  "Config");....  
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dc0 20 20 69 66 20 28 21 44 69 72 65 63 74 6f 72 79    if (!Directory
16dd0 2e 45 78 69 73 74 73 28 64 69 72 65 63 74 6f 72  .Exists(director
16de0 79 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  y))..           
16df0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
16e20 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
16e30 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
16e40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2e                ".
16e60 4e 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76 7b  NET Framework v{
16e70 30 7d 20 64 69 72 65 63 74 6f 72 79 20 5c 22 7b  0} directory \"{
16e80 31 7d 5c 22 20 64 6f 65 73 20 6e 6f 74 20 22 20  1}\" does not " 
16e90 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +..             
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16eb0 65 78 69 73 74 2c 20 73 6b 69 70 70 69 6e 67 2e  exist, skipping.
16ec0 2e 2e 22 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65  ..", frameworkVe
16ed0 72 73 69 6f 6e 2c 20 64 69 72 65 63 74 6f 72 79  rsion, directory
16ee0 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ),..            
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
16f10 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16f20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
16f30 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
16f40 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61     string fileNa
16f70 6d 65 20 3d 20 50 61 74 68 2e 43 6f 6d 62 69 6e  me = Path.Combin
16f80 65 28 64 69 72 65 63 74 6f 72 79 2c 20 22 6d 61  e(directory, "ma
16f90 63 68 69 6e 65 2e 63 6f 6e 66 69 67 22 29 3b 0d  chine.config");.
16fa0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
16fb0 20 20 20 20 20 20 20 69 66 20 28 21 46 69 6c 65         if (!File
16fc0 2e 45 78 69 73 74 73 28 66 69 6c 65 4e 61 6d 65  .Exists(fileName
16fd0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
16fe0 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63     TraceOps.Trac
17010 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  e(traceCallback,
17020 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
17030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2e 4e               ".N
17050 45 54 20 46 72 61 6d 65 77 6f 72 6b 20 76 7b 30  ET Framework v{0
17060 7d 20 66 69 6c 65 20 5c 22 7b 31 7d 5c 22 20 64  } file \"{1}\" d
17070 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 22  oes not exist, "
17080 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   +..            
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 22 73 6b 69 70 70 69 6e 67 2e 2e 2e 22 2c 20 66  "skipping...", f
170b0 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
170c0 20 66 69 6c 65 4e 61 6d 65 29 2c 0d 0a 20 20 20   fileName),..   
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
170f0 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20  tegory);....    
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20      continue;.. 
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17140 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
17150 20 6c 6f 63 61 6c 53 61 76 65 64 20 3d 20 66 61   localSaved = fa
17160 6c 73 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  lse;....        
17170 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
17180 21 63 61 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20  !callback(..    
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 20 20 20 20 20 20 66 69 6c 65 4e 61 6d 65          fileName
171b0 2c 20 69 6e 76 61 72 69 61 6e 74 2c 20 6e 61 6d  , invariant, nam
171c0 65 2c 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 20  e, description, 
171d0 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20  typeName,..     
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79 4e         assemblyN
17200 61 6d 65 2c 20 63 6c 69 65 6e 74 44 61 74 61 2c  ame, clientData,
17210 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
17220 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
17240 65 66 20 6c 6f 63 61 6c 53 61 76 65 64 2c 20 72  ef localSaved, r
17250 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20 20 20  ef error))..    
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17270 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
17280 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
17290 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
172b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
172c0 20 20 20 20 20 65 6c 73 65 0d 0a 20 20 20 20 20       else..     
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
172e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
172f0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f            if (lo
17300 63 61 6c 53 61 76 65 64 20 26 26 20 21 73 61 76  calSaved && !sav
17310 65 64 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed)..           
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 73 61 76 65 64 20 3d 20 74 72 75 65 3b 0d 0a   saved = true;..
17340 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17350 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65            if (ve
17360 72 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20  rbose)..        
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
17390 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
173a0 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
173b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 22 6c 6f 63 61 6c 53 61 76 65 64 20 3d 20    "localSaved = 
173e0 7b 30 7d 2c 20 73 61 76 65 64 20 3d 20 7b 31 7d  {0}, saved = {1}
173f0 22 2c 20 6c 6f 63 61 6c 53 61 76 65 64 2c 0d 0a  ", localSaved,..
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 73 61 76 65 64 29 2c 20 74 72 61 63 65 43 61 74  saved), traceCat
17430 65 67 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20  egory);..       
17440 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  }..            }
17470 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17480 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
17490 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
174a0 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
174b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
174c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
174d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
174e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
174f0 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
17500 61 74 69 63 20 62 6f 6f 6c 20 46 6f 72 45 61 63  atic bool ForEac
17510 68 46 72 61 6d 65 77 6f 72 6b 52 65 67 69 73 74  hFrameworkRegist
17520 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry(..           
17530 20 46 72 61 6d 65 77 6f 72 6b 52 65 67 69 73 74   FrameworkRegist
17540 72 79 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ryCallback callb
17550 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ack,..          
17560 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e 74 44    object clientD
17570 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ata,..          
17580 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
17590 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
175a0 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
175b0 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
175c0 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
175d0 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
175e0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  {..            R
175f0 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
17600 65 79 20 3d 20 66 72 61 6d 65 77 6f 72 6b 52 6f  ey = frameworkRo
17610 6f 74 4b 65 79 3b 0d 0a 0d 0a 20 20 20 20 20 20  otKey;....      
17620 20 20 20 20 20 20 69 66 20 28 72 6f 6f 74 4b 65        if (rootKe
17630 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
17640 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
17650 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
17660 20 3d 20 22 69 6e 76 61 6c 69 64 20 72 6f 6f 74   = "invalid root
17670 20 6b 65 79 22 3b 0d 0a 20 20 20 20 20 20 20 20   key";..        
17680 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
17690 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20  alse;..         
176a0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
176b0 20 20 20 20 69 66 20 28 21 4f 62 6a 65 63 74 2e      if (!Object.
176c0 52 65 66 65 72 65 6e 63 65 45 71 75 61 6c 73 28  ReferenceEquals(
176d0 72 6f 6f 74 4b 65 79 2c 20 52 65 67 69 73 74 72  rootKey, Registr
176e0 79 2e 43 75 72 72 65 6e 74 55 73 65 72 29 20 26  y.CurrentUser) &
176f0 26 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &..             
17700 20 20 20 21 4f 62 6a 65 63 74 2e 52 65 66 65 72     !Object.Refer
17710 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74 4b  enceEquals(rootK
17720 65 79 2c 20 52 65 67 69 73 74 72 79 2e 4c 6f 63  ey, Registry.Loc
17730 61 6c 4d 61 63 68 69 6e 65 29 29 0d 0a 20 20 20  alMachine))..   
17740 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
17750 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
17760 72 20 3d 20 22 72 6f 6f 74 20 6b 65 79 20 6d 75  r = "root key mu
17770 73 74 20 62 65 20 70 65 72 2d 75 73 65 72 20 6f  st be per-user o
17780 72 20 70 65 72 2d 6d 61 63 68 69 6e 65 22 3b 0d  r per-machine";.
17790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177a0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
177b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
177c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
177d0 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 4c 69  (frameworkNameLi
177e0 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  st == null)..   
177f0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
17800 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
17810 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77 6f 72  r = "no framewor
17820 6b 20 6e 61 6d 65 73 20 66 6f 75 6e 64 22 3b 0d  k names found";.
17830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17840 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
17850 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
17860 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
17870 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
17880 6e 4d 61 70 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  nMap == null).. 
17890 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
178b0 72 6f 72 20 3d 20 22 6e 6f 20 66 72 61 6d 65 77  ror = "no framew
178c0 6f 72 6b 20 76 65 72 73 69 6f 6e 73 20 66 6f 75  ork versions fou
178d0 6e 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nd";..          
178e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
178f0 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
17900 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
17910 20 20 69 66 20 28 70 6c 61 74 66 6f 72 6d 4e 61    if (platformNa
17920 6d 65 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 0d  meList == null).
17930 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
17940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17950 65 72 72 6f 72 20 3d 20 22 6e 6f 20 70 6c 61 74  error = "no plat
17960 66 6f 72 6d 20 6e 61 6d 65 73 20 66 6f 75 6e 64  form names found
17970 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
17980 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
17990 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
179a0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
179b0 69 66 20 28 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  if (frameworkNam
179c0 65 4c 69 73 74 2e 43 6f 75 6e 74 20 21 3d 20 70  eList.Count != p
179d0 6c 61 74 66 6f 72 6d 4e 61 6d 65 4c 69 73 74 2e  latformNameList.
179e0 43 6f 75 6e 74 29 0d 0a 20 20 20 20 20 20 20 20  Count)..        
179f0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
17a00 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
17a10 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22 66 72  tring.Format("fr
17a20 61 6d 65 77 6f 72 6b 20 6e 61 6d 65 20 63 6f 75  amework name cou
17a30 6e 74 20 7b 30 7d 20 64 6f 65 73 20 6e 6f 74 20  nt {0} does not 
17a40 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  " +..           
17a50 20 20 20 20 20 20 20 20 20 22 6d 61 74 63 68 20           "match 
17a60 70 6c 61 74 66 6f 72 6d 20 6e 61 6d 65 20 63 6f  platform name co
17a70 75 6e 74 20 7b 31 7d 22 2c 20 66 72 61 6d 65 77  unt {1}", framew
17a80 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e  orkNameList.Coun
17a90 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
17aa0 20 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d          platform
17ab0 4e 61 6d 65 4c 69 73 74 2e 43 6f 75 6e 74 29 3b  NameList.Count);
17ac0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17ad0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
17ae0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
17af0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
17b00 66 6f 72 20 28 69 6e 74 20 69 6e 64 65 78 20 3d  for (int index =
17b10 20 30 3b 20 69 6e 64 65 78 20 3c 20 66 72 61 6d   0; index < fram
17b20 65 77 6f 72 6b 4e 61 6d 65 4c 69 73 74 2e 43 6f  eworkNameList.Co
17b30 75 6e 74 3b 20 69 6e 64 65 78 2b 2b 29 0d 0a 20  unt; index++).. 
17b40 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
17b60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17b70 20 20 2f 2f 20 4e 4f 54 45 3a 20 47 72 61 62 20    // NOTE: Grab 
17b80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17b90 66 72 61 6d 65 77 6f 72 6b 20 28 65 2e 67 2e 20  framework (e.g. 
17ba0 22 2e 4e 45 54 46 72 61 6d 65 77 6f 72 6b 22 29  ".NETFramework")
17bb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17bc0 20 20 2f 2f 20 20 20 20 20 20 20 61 6e 64 20 74    //       and t
17bd0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
17be0 6c 61 74 66 6f 72 6d 20 28 65 2e 67 2e 20 22 57  latform (e.g. "W
17bf0 69 6e 64 6f 77 73 43 45 22 29 2e 0d 0a 20 20 20  indowsCE")...   
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 0d               //.
17c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c20 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72   string framewor
17c30 6b 4e 61 6d 65 20 3d 20 66 72 61 6d 65 77 6f 72  kName = framewor
17c40 6b 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d  kNameList[index]
17c50 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
17c60 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f     string platfo
17c70 72 6d 4e 61 6d 65 20 3d 20 70 6c 61 74 66 6f 72  rmName = platfor
17c80 6d 4e 61 6d 65 4c 69 73 74 5b 69 6e 64 65 78 5d  mNameList[index]
17c90 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
17ca0 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20 20 20       //..       
17cb0 20 20 20 20 20 20 20 20 20 2f 2f 20 4e 4f 54 45           // NOTE
17cc0 3a 20 47 72 61 62 20 74 68 65 20 73 75 70 70 6f  : Grab the suppo
17cd0 72 74 65 64 20 76 65 72 73 69 6f 6e 73 20 6f 66  rted versions of
17ce0 20 74 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   this particular
17cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
17d00 20 20 2f 2f 20 20 20 20 20 20 20 66 72 61 6d 65    //       frame
17d10 77 6f 72 6b 2e 0d 0a 20 20 20 20 20 20 20 20 20  work...         
17d20 20 20 20 20 20 20 20 2f 2f 0d 0a 20 20 20 20 20         //..     
17d30 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69             Versi
17d40 6f 6e 4c 69 73 74 20 66 72 61 6d 65 77 6f 72 6b  onList framework
17d50 56 65 72 73 69 6f 6e 4c 69 73 74 3b 0d 0a 0d 0a  VersionList;....
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d70 69 66 20 28 21 66 72 61 6d 65 77 6f 72 6b 56 65  if (!frameworkVe
17d80 72 73 69 6f 6e 4d 61 70 2e 54 72 79 47 65 74 56  rsionMap.TryGetV
17d90 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20  alue(..         
17da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
17db0 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 6f 75  rameworkName, ou
17dc0 74 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  t frameworkVersi
17dd0 6f 6e 4c 69 73 74 29 20 7c 7c 0d 0a 20 20 20 20  onList) ||..    
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
17e00 6e 4c 69 73 74 20 3d 3d 20 6e 75 6c 6c 29 29 0d  nList == null)).
17e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
17e30 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
17e40 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
17e50 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
17e60 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
17e70 28 56 65 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f  (Version framewo
17e80 72 6b 56 65 72 73 69 6f 6e 20 69 6e 20 66 72 61  rkVersion in fra
17e90 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 4c 69 73  meworkVersionLis
17ea0 74 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t)..            
17eb0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
17ec0 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
17ed0 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
17ee0 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
17ef0 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 22 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 20   "frameworkName 
17f20 3d 20 7b 30 7d 2c 20 66 72 61 6d 65 77 6f 72 6b  = {0}, framework
17f30 56 65 72 73 69 6f 6e 20 3d 20 7b 31 7d 2c 20 22  Version = {1}, "
17f40 20 2b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   +..            
17f50 20 20 20 20 20 20 20 20 20 20 20 20 22 70 6c 61              "pla
17f60 74 66 6f 72 6d 4e 61 6d 65 20 3d 20 7b 32 7d 22  tformName = {2}"
17f70 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 66 72 61  , ForDisplay(fra
17f80 6d 65 77 6f 72 6b 4e 61 6d 65 29 2c 0d 0a 20 20  meworkName),..  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 46 6f 72 44 69 73 70 6c 61 79        ForDisplay
17fb0 28 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f  (frameworkVersio
17fc0 6e 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  n),..           
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 46 6f 72               For
17fe0 44 69 73 70 6c 61 79 28 70 6c 61 74 66 6f 72 6d  Display(platform
17ff0 4e 61 6d 65 29 29 2c 20 74 72 61 63 65 43 61 74  Name)), traceCat
18000 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18020 66 20 28 21 48 61 76 65 46 72 61 6d 65 77 6f 72  f (!HaveFramewor
18030 6b 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  k(..            
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18050 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d 65 77 6f  rootKey, framewo
18060 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65 77 6f 72  rkName, framewor
18070 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20  kVersion,..     
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e         platformN
180a0 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72  ame, whatIf, ver
180b0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
180c0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
180f0 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
18100 61 63 6b 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ack,..          
18110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18120 20 20 22 2e 4e 45 54 20 46 72 61 6d 65 77 6f 72    ".NET Framewor
18130 6b 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 6b 69  k not found, ski
18140 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a 20 20 20 20  pping...",..    
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61 74          traceCat
18170 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d 0a 20 20     continue;..  
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
181c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
181d0 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29  allback == null)
181e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
181f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
18200 75 65 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ue;....         
18210 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
18220 63 61 6c 6c 62 61 63 6b 28 0d 0a 20 20 20 20 20  callback(..     
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
18250 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66  frameworkName, f
18260 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c  rameworkVersion,
18270 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6c                pl
18290 61 74 66 6f 72 6d 4e 61 6d 65 2c 20 63 6c 69 65  atformName, clie
182a0 6e 74 44 61 74 61 2c 20 77 68 61 74 49 66 2c 20  ntData, whatIf, 
182b0 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20  verbose,..      
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 20 20 20 20 72 65 66 20 65 72 72 6f 72 29        ref error)
182e0 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
182f0 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18310 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d    return false;.
18320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18330 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
18340 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20          }..     
18350 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
18360 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74          return t
18370 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  rue;..        }.
18380 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
18390 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
183a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
183b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
183c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
183d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
183e0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
183f0 20 20 23 72 65 67 69 6f 6e 20 50 65 72 2d 56 69    #region Per-Vi
18400 73 75 61 6c 20 53 74 75 64 69 6f 20 56 65 72 73  sual Studio Vers
18410 69 6f 6e 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20  ion Handling..  
18420 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
18430 61 74 69 63 20 76 6f 69 64 20 49 6e 69 74 69 61  atic void Initia
18440 6c 69 7a 65 41 6c 6c 56 73 56 65 72 73 69 6f 6e  lizeAllVsVersion
18450 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s(..            
18460 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
18470 6e 66 69 67 75 72 61 74 69 6f 6e 0d 0a 20 20 20  nfiguration..   
18480 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
18490 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
184a0 20 20 20 69 66 20 28 76 73 52 6f 6f 74 4b 65 79     if (vsRootKey
184b0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
184c0 20 20 20 20 20 20 20 20 20 20 20 76 73 52 6f 6f             vsRoo
184d0 74 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 2e  tKey = Registry.
184e0 4c 6f 63 61 6c 4d 61 63 68 69 6e 65 3b 0d 0a 0d  LocalMachine;...
184f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18500 28 76 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c  (vsAdoNetTechnol
18510 6f 67 79 49 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  ogyId == null)..
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 76 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f  vsAdoNetTechnolo
18540 67 79 49 64 20 3d 20 6e 65 77 20 47 75 69 64 28  gyId = new Guid(
18550 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18560 20 20 20 20 20 20 22 37 37 41 42 39 41 39 44 2d        "77AB9A9D-
18570 37 38 42 39 2d 34 42 41 37 2d 39 31 41 43 2d 38  78B9-4BA7-91AC-8
18580 37 33 46 35 33 33 38 46 31 44 32 22 29 3b 0d 0a  73F5338F1D2");..
18590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
185a0 20 28 76 73 50 61 63 6b 61 67 65 49 64 20 3d 3d   (vsPackageId ==
185b0 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
185c0 20 20 20 20 20 20 20 20 76 73 50 61 63 6b 61 67          vsPackag
185d0 65 49 64 20 3d 20 6e 65 77 20 47 75 69 64 28 0d  eId = new Guid(.
185e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
185f0 20 20 20 20 20 22 44 43 42 45 36 43 38 44 2d 30       "DCBE6C8D-0
18600 45 35 37 2d 34 30 39 39 2d 41 31 38 33 2d 39 38  E57-4099-A183-98
18610 46 46 37 34 43 36 34 44 39 43 22 29 3b 0d 0a 0d  FF74C64D9C");...
18620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
18630 28 76 73 53 65 72 76 69 63 65 49 64 20 3d 3d 20  (vsServiceId == 
18640 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
18650 20 20 20 20 20 20 20 76 73 53 65 72 76 69 63 65         vsService
18660 49 64 20 3d 20 6e 65 77 20 47 75 69 64 28 0d 0a  Id = new Guid(..
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 22 44 43 42 45 36 43 38 44 2d 30 45      "DCBE6C8D-0E
18690 35 37 2d 34 30 39 39 2d 41 31 38 33 2d 39 38 46  57-4099-A183-98F
186a0 46 37 34 43 36 34 44 39 44 22 29 3b 0d 0a 0d 0a  F74C64D9D");....
186b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
186c0 76 73 44 61 74 61 53 6f 75 72 63 65 73 49 64 20  vsDataSourcesId 
186d0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
186e0 20 20 20 20 20 20 20 20 20 20 76 73 44 61 74 61            vsData
186f0 53 6f 75 72 63 65 73 49 64 20 3d 20 6e 65 77 20  SourcesId = new 
18700 47 75 69 64 28 0d 0a 20 20 20 20 20 20 20 20 20  Guid(..         
18710 20 20 20 20 20 20 20 20 20 20 20 22 30 45 42 41             "0EBA
18720 41 42 36 45 2d 43 41 38 30 2d 34 42 34 41 2d 38  AB6E-CA80-4B4A-8
18730 44 44 46 2d 43 42 45 36 42 46 30 35 38 43 37 31  DDF-CBE6BF058C71
18740 22 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ");....         
18750 20 20 20 69 66 20 28 76 73 44 61 74 61 50 72 6f     if (vsDataPro
18760 76 69 64 65 72 49 64 20 3d 3d 20 6e 75 6c 6c 29  viderId == null)
18770 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18780 20 20 76 73 44 61 74 61 50 72 6f 76 69 64 65 72    vsDataProvider
18790 49 64 20 3d 20 6e 65 77 20 47 75 69 64 28 0d 0a  Id = new Guid(..
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187b0 20 20 20 20 22 30 45 42 41 41 42 36 45 2d 43 41      "0EBAAB6E-CA
187c0 38 30 2d 34 42 34 41 2d 38 44 44 46 2d 43 42 45  80-4B4A-8DDF-CBE
187d0 36 42 46 30 35 38 43 37 30 22 29 3b 0d 0a 0d 0a  6BF058C70");....
187e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
187f0 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 20 3d 3d  vsVersionList ==
18800 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
18810 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
18820 20 20 20 20 20 20 20 76 73 56 65 72 73 69 6f 6e         vsVersion
18830 4c 69 73 74 20 3d 20 6e 65 77 20 56 65 72 73 69  List = new Versi
18840 6f 6e 4c 69 73 74 28 29 3b 0d 0a 0d 0a 20 20 20  onList();....   
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
18860 76 73 56 65 72 73 69 6f 6e 4c 69 73 74 2e 41 64  vsVersionList.Ad
18870 64 28 6e 65 77 20 56 65 72 73 69 6f 6e 28 38 2c  d(new Version(8,
18880 20 30 29 29 3b 20 2f 2f 20 56 69 73 75 61 6c 20   0)); // Visual 
18890 53 74 75 64 69 6f 20 32 30 30 35 0d 0a 0d 0a 20  Studio 2005.... 
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
188b0 66 20 28 28 63 6f 6e 66 69 67 75 72 61 74 69 6f  f ((configuratio
188c0 6e 20 3d 3d 20 6e 75 6c 6c 29 20 7c 7c 20 21 63  n == null) || !c
188d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4e 6f 56  onfiguration.NoV
188e0 73 32 30 30 38 29 0d 0a 20 20 20 20 20 20 20 20  s2008)..        
188f0 20 20 20 20 20 20 20 20 20 20 20 20 76 73 56 65              vsVe
18900 72 73 69 6f 6e 4c 69 73 74 2e 41 64 64 28 6e 65  rsionList.Add(ne
18910 77 20 56 65 72 73 69 6f 6e 28 39 2c 20 30 29 29  w Version(9, 0))
18920 3b 20 2f 2f 20 56 69 73 75 61 6c 20 53 74 75 64  ; // Visual Stud
18930 69 6f 20 32 30 30 38 0d 0a 0d 0a 20 20 20 20 20  io 2008....     
18940 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 28             if ((
18950 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 3d 3d  configuration ==
18960 20 6e 75 6c 6c 29 20 7c 7c 20 21 63 6f 6e 66 69   null) || !confi
18970 67 75 72 61 74 69 6f 6e 2e 4e 6f 56 73 32 30 31  guration.NoVs201
18980 30 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)..            
18990 20 20 20 20 20 20 20 20 76 73 56 65 72 73 69 6f          vsVersio
189a0 6e 4c 69 73 74 2e 41 64 64 28 6e 65 77 20 56 65  nList.Add(new Ve
189b0 72 73 69 6f 6e 28 31 30 2c 20 30 29 29 3b 2f 2f  rsion(10, 0));//
189c0 20 56 69 73 75 61 6c 20 53 74 75 64 69 6f 20 32   Visual Studio 2
189d0 30 31 30 0d 0a 20 20 20 20 20 20 20 20 20 20 20  010..           
189e0 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d   }..        }...
189f0 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f  .        ///////
18a00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18a10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18a20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18a30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18a40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ....        priv
18a50 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20  ate static bool 
18a60 48 61 76 65 56 73 56 65 72 73 69 6f 6e 28 0d 0a  HaveVsVersion(..
18a70 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
18a80 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
18a90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
18aa0 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c  rsion vsVersion,
18ab0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
18ac0 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
18ad0 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
18ae0 62 6f 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  bose..          
18af0 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a    )..        {..
18b00 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
18b10 6e 67 20 66 6f 72 6d 61 74 20 3d 20 22 53 6f 66  ng format = "Sof
18b20 74 77 61 72 65 5c 5c 4d 69 63 72 6f 73 6f 66 74  tware\\Microsoft
18b30 5c 5c 56 69 73 75 61 6c 53 74 75 64 69 6f 5c 5c  \\VisualStudio\\
18b40 7b 30 7d 22 3b 0d 0a 20 20 20 20 20 20 20 20 20  {0}";..         
18b50 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
18b60 65 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  e = String.Forma
18b70 74 28 66 6f 72 6d 61 74 2c 20 76 73 56 65 72 73  t(format, vsVers
18b80 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ion);....       
18b90 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
18ba0 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20  RegistryKey key 
18bb0 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
18bc0 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20  .OpenSubKey(..  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61    rootKey, keyNa
18bf0 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49  me, false, whatI
18c00 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
18c10 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18c30 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  (key == null).. 
18c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c50 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
18c60 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
18c70 20 20 20 20 6f 62 6a 65 63 74 20 76 61 6c 75 65      object value
18c80 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
18c90 72 2e 47 65 74 56 61 6c 75 65 28 0d 0a 20 20 20  r.GetValue(..   
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 6b 65 79 2c 20 22 49 6e 73 74 61 6c 6c 44 69   key, "InstallDi
18cc0 72 22 2c 20 6e 75 6c 6c 2c 20 77 68 61 74 49 66  r", null, whatIf
18cd0 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18cf0 66 20 28 21 28 76 61 6c 75 65 20 69 73 20 73 74  f (!(value is st
18d00 72 69 6e 67 29 29 0d 0a 20 20 20 20 20 20 20 20  ring))..        
18d10 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18d20 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
18d40 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 3d 20  ing directory = 
18d50 28 73 74 72 69 6e 67 29 76 61 6c 75 65 3b 0d 0a  (string)value;..
18d60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
18d70 20 20 69 66 20 28 53 74 72 69 6e 67 2e 49 73 4e    if (String.IsN
18d80 75 6c 6c 4f 72 45 6d 70 74 79 28 64 69 72 65 63  ullOrEmpty(direc
18d90 74 6f 72 79 29 29 0d 0a 20 20 20 20 20 20 20 20  tory))..        
18da0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18db0 72 6e 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20  rn false;....   
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
18dd0 28 21 44 69 72 65 63 74 6f 72 79 2e 45 78 69 73  (!Directory.Exis
18de0 74 73 28 64 69 72 65 63 74 6f 72 79 29 29 0d 0a  ts(directory))..
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
18e10 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
18e20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
18e30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
18e40 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20  ..        }.... 
18e50 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f         /////////
18e60 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18e70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18e80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
18e90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
18ea0 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ..        privat
18eb0 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 46 6f  e static bool Fo
18ec0 72 45 61 63 68 56 73 56 65 72 73 69 6f 6e 52 65  rEachVsVersionRe
18ed0 67 69 73 74 72 79 28 0d 0a 20 20 20 20 20 20 20  gistry(..       
18ee0 20 20 20 20 20 56 69 73 75 61 6c 53 74 75 64 69       VisualStudi
18ef0 6f 52 65 67 69 73 74 72 79 43 61 6c 6c 62 61 63  oRegistryCallbac
18f00 6b 20 63 61 6c 6c 62 61 63 6b 2c 0d 0a 20 20 20  k callback,..   
18f10 20 20 20 20 20 20 20 20 20 47 75 69 64 20 70 61           Guid pa
18f20 63 6b 61 67 65 49 64 2c 0d 0a 20 20 20 20 20 20  ckageId,..      
18f30 20 20 20 20 20 20 47 75 69 64 20 73 65 72 76 69        Guid servi
18f40 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  ceId,..         
18f50 20 20 20 47 75 69 64 20 64 61 74 61 53 6f 75 72     Guid dataSour
18f60 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  ceId,..         
18f70 20 20 20 47 75 69 64 20 64 61 74 61 50 72 6f 76     Guid dataProv
18f80 69 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20 20  iderId,..       
18f90 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65       object clie
18fa0 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20  ntData,..       
18fb0 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66       bool whatIf
18fc0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ,..            b
18fd0 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20  ool verbose,..  
18fe0 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74            ref st
18ff0 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20  ring error..    
19000 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20          )..     
19010 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
19020 20 20 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f    RegistryKey ro
19030 6f 74 4b 65 79 20 3d 20 76 73 52 6f 6f 74 4b 65  otKey = vsRootKe
19040 79 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  y;....          
19050 20 20 69 66 20 28 72 6f 6f 74 4b 65 79 20 3d 3d    if (rootKey ==
19060 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
19070 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
19080 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
19090 69 6e 76 61 6c 69 64 20 72 6f 6f 74 20 6b 65 79  invalid root key
190a0 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
190b0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
190c0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
190d0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
190e0 69 66 20 28 21 4f 62 6a 65 63 74 2e 52 65 66 65  if (!Object.Refe
190f0 72 65 6e 63 65 45 71 75 61 6c 73 28 72 6f 6f 74  renceEquals(root
19100 4b 65 79 2c 20 52 65 67 69 73 74 72 79 2e 43 75  Key, Registry.Cu
19110 72 72 65 6e 74 55 73 65 72 29 20 26 26 0d 0a 20  rrentUser) &&.. 
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
19130 4f 62 6a 65 63 74 2e 52 65 66 65 72 65 6e 63 65  Object.Reference
19140 45 71 75 61 6c 73 28 72 6f 6f 74 4b 65 79 2c 20  Equals(rootKey, 
19150 52 65 67 69 73 74 72 79 2e 4c 6f 63 61 6c 4d 61  Registry.LocalMa
19160 63 68 69 6e 65 29 29 0d 0a 20 20 20 20 20 20 20  chine))..       
19170 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
19180 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20          error = 
19190 22 72 6f 6f 74 20 6b 65 79 20 6d 75 73 74 20 62  "root key must b
191a0 65 20 70 65 72 2d 75 73 65 72 20 6f 72 20 70 65  e per-user or pe
191b0 72 2d 6d 61 63 68 69 6e 65 22 3b 0d 0a 20 20 20  r-machine";..   
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
191d0 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
191e0 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
191f0 20 20 20 20 20 20 20 20 20 69 66 20 28 76 73 56           if (vsV
19200 65 72 73 69 6f 6e 4c 69 73 74 20 3d 3d 20 6e 75  ersionList == nu
19210 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ll)..           
19220 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
19230 20 20 20 20 65 72 72 6f 72 20 3d 20 22 6e 6f 20      error = "no 
19240 56 53 20 76 65 72 73 69 6f 6e 73 20 66 6f 75 6e  VS versions foun
19250 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d";..           
19260 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
19270 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
19280 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
19290 20 66 6f 72 65 61 63 68 20 28 56 65 72 73 69 6f   foreach (Versio
192a0 6e 20 76 73 56 65 72 73 69 6f 6e 20 69 6e 20 76  n vsVersion in v
192b0 73 56 65 72 73 69 6f 6e 4c 69 73 74 29 0d 0a 20  sVersionList).. 
192c0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
192e0 61 63 65 4f 70 73 2e 54 72 61 63 65 28 74 72 61  aceOps.Trace(tra
192f0 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69  ceCallback, Stri
19300 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20  ng.Format(..    
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 22 76 73 56 65 72 73 69 6f 6e 20 3d 20 7b 30 7d  "vsVersion = {0}
19330 22 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 76 73  ", ForDisplay(vs
19340 56 65 72 73 69 6f 6e 29 29 2c 0d 0a 20 20 20 20  Version)),..    
19350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19360 74 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d  traceCategory);.
19370 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19380 20 20 20 69 66 20 28 21 48 61 76 65 56 73 56 65     if (!HaveVsVe
19390 72 73 69 6f 6e 28 72 6f 6f 74 4b 65 79 2c 20 76  rsion(rootKey, v
193a0 73 56 65 72 73 69 6f 6e 2c 20 77 68 61 74 49 66  sVersion, whatIf
193b0 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61      TraceOps.Tra
193f0 63 65 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b  ce(traceCallback
19400 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
19410 20 20 20 20 20 20 20 20 20 20 20 22 56 69 73 75             "Visu
19420 61 6c 20 53 74 75 64 69 6f 20 76 65 72 73 69 6f  al Studio versio
19430 6e 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 6b 69  n not found, ski
19440 70 70 69 6e 67 2e 2e 2e 22 2c 0d 0a 20 20 20 20  pping...",..    
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f 72      traceCategor
19470 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  y);....         
19480 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
19490 6e 75 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  nue;..          
194a0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
194b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
194c0 61 6c 6c 62 61 63 6b 20 3d 3d 20 6e 75 6c 6c 29  allback == null)
194d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
194e0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d        continue;.
194f0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19500 20 20 20 69 66 20 28 21 63 61 6c 6c 62 61 63 6b     if (!callback
19510 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
19520 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b             rootK
19530 65 79 2c 20 76 73 56 65 72 73 69 6f 6e 2c 20 70  ey, vsVersion, p
19540 61 63 6b 61 67 65 49 64 2c 20 73 65 72 76 69 63  ackageId, servic
19550 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  eId,..          
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
19570 74 61 53 6f 75 72 63 65 49 64 2c 20 64 61 74 61  taSourceId, data
19580 50 72 6f 76 69 64 65 72 49 64 2c 20 63 6c 69 65  ProviderId, clie
19590 6e 74 44 61 74 61 2c 20 77 68 61 74 49 66 2c 0d  ntData, whatIf,.
195a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
195b0 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65           verbose
195c0 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20  , ref error)).. 
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
195e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
195f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
19600 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
19610 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
19620 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
19630 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
19640 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20  ;..        }..  
19650 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
19660 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
19670 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19680 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19690 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
196a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
196b0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ///....        #
196c0 72 65 67 69 6f 6e 20 43 6f 6e 66 69 67 75 72 61  region Configura
196d0 74 69 6f 6e 20 46 69 6c 65 20 48 61 6e 64 6c 69  tion File Handli
196e0 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76  ng..        priv
196f0 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20  ate static bool 
19700 41 64 64 44 62 50 72 6f 76 69 64 65 72 46 61 63  AddDbProviderFac
19710 74 6f 72 79 28 0d 0a 20 20 20 20 20 20 20 20 20  tory(..         
19720 20 20 20 73 74 72 69 6e 67 20 66 69 6c 65 4e 61     string fileNa
19730 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
19740 20 73 74 72 69 6e 67 20 69 6e 76 61 72 69 61 6e   string invarian
19750 74 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t,..            
19760 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d 0a 20 20  string name,..  
19770 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
19780 20 64 65 73 63 72 69 70 74 69 6f 6e 2c 0d 0a 20   description,.. 
19790 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
197a0 67 20 74 79 70 65 4e 61 6d 65 2c 0d 0a 20 20 20  g typeName,..   
197b0 20 20 20 20 20 20 20 20 20 41 73 73 65 6d 62 6c           Assembl
197c0 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c 79 4e 61  yName assemblyNa
197d0 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  me,..           
197e0 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20   bool whatIf,.. 
197f0 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
19800 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20  verbose,..      
19810 20 20 20 20 20 20 72 65 66 20 62 6f 6f 6c 20 73        ref bool s
19820 61 76 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  aved,..         
19830 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
19840 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
19850 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
19860 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
19870 64 69 72 74 79 20 3d 20 66 61 6c 73 65 3b 0d 0a  dirty = false;..
19880 20 20 20 20 20 20 20 20 20 20 20 20 58 6d 6c 44              XmlD
19890 6f 63 75 6d 65 6e 74 20 64 6f 63 75 6d 65 6e 74  ocument document
198a0 20 3d 20 6e 65 77 20 58 6d 6c 44 6f 63 75 6d 65   = new XmlDocume
198b0 6e 74 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  nt();....       
198c0 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 50 72       document.Pr
198d0 65 73 65 72 76 65 57 68 69 74 65 73 70 61 63 65  eserveWhitespace
198e0 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20   = true;..      
198f0 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 4c        document.L
19900 6f 61 64 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a  oad(fileName);..
19910 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 58 6d  ..            Xm
19920 6c 45 6c 65 6d 65 6e 74 20 65 6c 65 6d 65 6e 74  lElement element
19930 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 53 65 6c 65   = document.Sele
19940 63 74 53 69 6e 67 6c 65 4e 6f 64 65 28 53 74 72  ctSingleNode(Str
19950 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 58 50 61               XPa
19970 74 68 46 6f 72 41 64 64 45 6c 65 6d 65 6e 74 2c  thForAddElement,
19980 20 69 6e 76 61 72 69 61 6e 74 29 29 20 61 73 20   invariant)) as 
19990 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a 0d 0a 20  XmlElement;.... 
199a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 65             if (e
199b0 6c 65 6d 65 6e 74 20 3d 3d 20 6e 75 6c 6c 29 0d  lement == null).
199c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 73 74 72 69 6e 67 5b 5d 20 65 6c 65 6d 65 6e 74  string[] element
199f0 4e 61 6d 65 73 20 3d 20 7b 0d 0a 20 20 20 20 20  Names = {..     
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 20 22 73 79 73 74 65 6d 2e 64 61 74 61 22     "system.data"
19a20 2c 20 22 44 62 50 72 6f 76 69 64 65 72 46 61 63  , "DbProviderFac
19a30 74 6f 72 69 65 73 22 0d 0a 20 20 20 20 20 20 20  tories"..       
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0d               };.
19a50 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19a60 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74 20 70 72     XmlElement pr
19a70 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74 20 3d 0d  eviousElement =.
19a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a90 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 44 6f       document.Do
19aa0 63 75 6d 65 6e 74 45 6c 65 6d 65 6e 74 3b 20 2f  cumentElement; /
19ab0 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * configuration 
19ac0 2a 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  */....          
19ad0 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 73        foreach (s
19ae0 74 72 69 6e 67 20 65 6c 65 6d 65 6e 74 4e 61 6d  tring elementNam
19af0 65 20 69 6e 20 65 6c 65 6d 65 6e 74 4e 61 6d 65  e in elementName
19b00 73 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s)..            
19b10 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
19b20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65             eleme
19b30 6e 74 20 3d 20 70 72 65 76 69 6f 75 73 45 6c 65  nt = previousEle
19b40 6d 65 6e 74 2e 53 65 6c 65 63 74 53 69 6e 67 6c  ment.SelectSingl
19b50 65 4e 6f 64 65 28 0d 0a 20 20 20 20 20 20 20 20  eNode(..        
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 65 6c 65 6d 65 6e 74 4e 61 6d 65 29 20 61 73 20  elementName) as 
19b80 58 6d 6c 45 6c 65 6d 65 6e 74 3b 0d 0a 0d 0a 20  XmlElement;.... 
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74 20 3d     if (element =
19bb0 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
19bf0 3d 20 64 6f 63 75 6d 65 6e 74 2e 43 72 65 61 74  = document.Creat
19c00 65 45 6c 65 6d 65 6e 74 28 0d 0a 20 20 20 20 20  eElement(..     
19c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 4e 61         elementNa
19c30 6d 65 2c 20 53 74 72 69 6e 67 2e 45 6d 70 74 79  me, String.Empty
19c40 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
19c60 65 76 69 6f 75 73 45 6c 65 6d 65 6e 74 2e 41 70  eviousElement.Ap
19c70 70 65 6e 64 43 68 69 6c 64 28 65 6c 65 6d 65 6e  pendChild(elemen
19c80 74 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  t);..           
19c90 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65 6e    previousElemen
19cc0 74 20 3d 20 65 6c 65 6d 65 6e 74 3b 0d 0a 20 20  t = element;..  
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
19ce0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19cf0 20 20 20 65 6c 65 6d 65 6e 74 20 3d 20 64 6f 63     element = doc
19d00 75 6d 65 6e 74 2e 43 72 65 61 74 65 45 6c 65 6d  ument.CreateElem
19d10 65 6e 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ent(..          
19d20 20 20 20 20 20 20 20 20 20 20 22 61 64 64 22 2c            "add",
19d30 20 53 74 72 69 6e 67 2e 45 6d 70 74 79 29 3b 0d   String.Empty);.
19d40 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
19d50 20 20 20 70 72 65 76 69 6f 75 73 45 6c 65 6d 65     previousEleme
19d60 6e 74 2e 41 70 70 65 6e 64 43 68 69 6c 64 28 65  nt.AppendChild(e
19d70 6c 65 6d 65 6e 74 29 3b 0d 0a 0d 0a 20 20 20 20  lement);....    
19d80 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72 74              dirt
19d90 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  y = true;..     
19da0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
19db0 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74 72          if (!Str
19dc0 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c 65 6d 65  ing.Equals(eleme
19dd0 6e 74 2e 47 65 74 41 74 74 72 69 62 75 74 65 28  nt.GetAttribute(
19de0 22 6e 61 6d 65 22 29 2c 0d 0a 20 20 20 20 20 20  "name"),..      
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
19e00 6d 65 2c 20 53 74 72 69 6e 67 43 6f 6d 70 61 72  me, StringCompar
19e10 69 73 6f 6e 2e 49 6e 76 61 72 69 61 6e 74 43 75  ison.InvariantCu
19e20 6c 74 75 72 65 29 29 0d 0a 20 20 20 20 20 20 20  lture))..       
19e30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
19e40 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e          element.
19e50 53 65 74 41 74 74 72 69 62 75 74 65 28 22 6e 61  SetAttribute("na
19e60 6d 65 22 2c 20 6e 61 6d 65 29 3b 0d 0a 20 20 20  me", name);..   
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 72               dir
19e80 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20 20 20  ty = true;..    
19e90 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
19ea0 20 20 20 20 20 20 20 20 20 69 66 20 28 21 53 74           if (!St
19eb0 72 69 6e 67 2e 45 71 75 61 6c 73 28 65 6c 65 6d  ring.Equals(elem
19ec0 65 6e 74 2e 47 65 74 41 74 74 72 69 62 75 74 65  ent.GetAttribute
19ed0 28 22 69 6e 76 61 72 69 61 6e 74 22 29 2c 0d 0a  ("invariant"),..
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ef0 20 20 20 20 69 6e 76 61 72 69 61 6e 74 2c 20 53      invariant, S
19f00 74 72 69 6e 67 43 6f 6d 70 61 72 69 73 6f 6e 2e  tringComparison.
19f10 49 6e 76 61 72 69 61 6e 74 43 75 6c 74 75 72 65  InvariantCulture
19f20 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
19f30 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
19f40 20 20 20 65 6c 65 6d 65 6e 74 2e 53 65 74 41 74     element.SetAt
19f50 74 72 69 62 75 74 65 28 22 69 6e 76 61 72 69 61  tribute("invaria
19f60 6e 74 22 2c 20 69 6e 76 61 72 69 61 6e 74 29 3b  nt", invariant);
19f70 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
19f80 20 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d    dirty = true;.
19f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
19fa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
19fb0 20 28 21 53 74 72 69 6e 67 2e 45 71 75 61 6c 73   (!String.Equals
19fc0 28 65 6c 65 6d 65 6e 74 2e 47 65 74 41 74 74 72  (element.GetAttr
19fd0 69 62 75 74 65 28 22 64 65 73 63 72 69 70 74 69  ibute("descripti
19fe0 6f 6e 22 29 2c 0d 0a 20 20 20 20 20 20 20 20 20  on"),..         
19ff0 20 20 20 20 20 20 20 20 20 20 20 64 65 73 63 72             descr
1a000 69 70 74 69 6f 6e 2c 20 53 74 72 69 6e 67 43 6f  iption, StringCo
1a010 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72 69 61  mparison.Invaria
1a020 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20 20 20  ntCulture))..   
1a030 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1a040 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1a050 65 6e 74 2e 53 65 74 41 74 74 72 69 62 75 74 65  ent.SetAttribute
1a060 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20  ("description", 
1a070 64 65 73 63 72 69 70 74 69 6f 6e 29 3b 0d 0a 20  description);.. 
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1a090 69 72 74 79 20 3d 20 74 72 75 65 3b 0d 0a 20 20  irty = true;..  
1a0a0 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
1a0b0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1a0c0 67 20 66 75 6c 6c 54 79 70 65 4e 61 6d 65 20 3d  g fullTypeName =
1a0d0 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
1a0e0 7b 30 7d 2c 20 7b 31 7d 22 2c 0d 0a 20 20 20 20  {0}, {1}",..    
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65              type
1a100 4e 61 6d 65 2c 20 61 73 73 65 6d 62 6c 79 4e 61  Name, assemblyNa
1a110 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  me);....        
1a120 20 20 20 20 69 66 20 28 21 53 74 72 69 6e 67 2e      if (!String.
1a130 45 71 75 61 6c 73 28 65 6c 65 6d 65 6e 74 2e 47  Equals(element.G
1a140 65 74 41 74 74 72 69 62 75 74 65 28 22 74 79 70  etAttribute("typ
1a150 65 22 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  e"),..          
1a160 20 20 20 20 20 20 20 20 20 20 66 75 6c 6c 54 79            fullTy
1a170 70 65 4e 61 6d 65 2c 20 53 74 72 69 6e 67 43 6f  peName, StringCo
1a180 6d 70 61 72 69 73 6f 6e 2e 49 6e 76 61 72 69 61  mparison.Invaria
1a190 6e 74 43 75 6c 74 75 72 65 29 29 0d 0a 20 20 20  ntCulture))..   
1a1a0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 65 6d              elem
1a1c0 65 6e 74 2e 53 65 74 41 74 74 72 69 62 75 74 65  ent.SetAttribute
1a1d0 28 22 74 79 70 65 22 2c 20 66 75 6c 6c 54 79 70  ("type", fullTyp
1a1e0 65 4e 61 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20  eName);..       
1a1f0 20 20 20 20 20 20 20 20 20 64 69 72 74 79 20 3d           dirty =
1a200 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
1a210 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a220 20 20 20 20 20 69 66 20 28 64 69 72 74 79 29 0d       if (dirty).
1a230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a250 69 66 20 28 76 65 72 62 6f 73 65 29 0d 0a 20 20  if (verbose)..  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65    TraceOps.Trace
1a280 28 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20  (traceCallback, 
1a290 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a  String.Format(..
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 20 20 20 20 20 22 65 6c 65 6d 65 6e 74          "element
1a2c0 20 3d 20 7b 30 7d 22 2c 20 46 6f 72 44 69 73 70   = {0}", ForDisp
1a2d0 6c 61 79 28 65 6c 65 6d 65 6e 74 29 29 2c 20 74  lay(element)), t
1a2e0 72 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a  raceCategory);..
1a2f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a300 20 20 69 66 20 28 21 77 68 61 74 49 66 29 0d 0a    if (!whatIf)..
1a310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a320 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 53 61 76      document.Sav
1a330 65 28 66 69 6c 65 4e 61 6d 65 29 3b 0d 0a 0d 0a  e(fileName);....
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 73 61 76 65 64 20 3d 20 74 72 75 65 3b 0d 0a 20  saved = true;.. 
1a360 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1a370 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1a380 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
1a390 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
1a3a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a3b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a3c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a3d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a3e0 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1a3f0 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
1a400 20 62 6f 6f 6c 20 52 65 6d 6f 76 65 44 62 50 72   bool RemoveDbPr
1a410 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d 0a  oviderFactory(..
1a420 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1a430 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20  ng fileName,..  
1a440 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
1a450 20 69 6e 76 61 72 69 61 6e 74 2c 0d 0a 20 20 20   invariant,..   
1a460 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68           bool wh
1a470 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
1a480 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c     bool verbose,
1a490 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1a4a0 66 20 62 6f 6f 6c 20 73 61 76 65 64 2c 0d 0a 20  f bool saved,.. 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
1a4c0 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
1a4d0 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
1a4e0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1a4f0 20 20 20 62 6f 6f 6c 20 64 69 72 74 79 20 3d 20     bool dirty = 
1a500 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1a510 20 20 20 20 58 6d 6c 44 6f 63 75 6d 65 6e 74 20      XmlDocument 
1a520 64 6f 63 75 6d 65 6e 74 20 3d 20 6e 65 77 20 58  document = new X
1a530 6d 6c 44 6f 63 75 6d 65 6e 74 28 29 3b 0d 0a 0d  mlDocument();...
1a540 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63  .            doc
1a550 75 6d 65 6e 74 2e 50 72 65 73 65 72 76 65 57 68  ument.PreserveWh
1a560 69 74 65 73 70 61 63 65 20 3d 20 74 72 75 65 3b  itespace = true;
1a570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 6f  ..            do
1a580 63 75 6d 65 6e 74 2e 4c 6f 61 64 28 66 69 6c 65  cument.Load(file
1a590 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
1a5a0 20 20 20 20 20 20 58 6d 6c 45 6c 65 6d 65 6e 74        XmlElement
1a5b0 20 65 6c 65 6d 65 6e 74 20 3d 20 64 6f 63 75 6d   element = docum
1a5c0 65 6e 74 2e 53 65 6c 65 63 74 53 69 6e 67 6c 65  ent.SelectSingle
1a5d0 4e 6f 64 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d  Node(String.Form
1a5e0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
1a5f0 20 20 20 20 20 58 50 61 74 68 46 6f 72 41 64 64       XPathForAdd
1a600 45 6c 65 6d 65 6e 74 2c 20 69 6e 76 61 72 69 61  Element, invaria
1a610 6e 74 29 29 20 61 73 20 58 6d 6c 45 6c 65 6d 65  nt)) as XmlEleme
1a620 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  nt;....         
1a630 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74 20 21     if (element !
1a640 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1a650 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1a660 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e          element.
1a670 50 61 72 65 6e 74 4e 6f 64 65 2e 52 65 6d 6f 76  ParentNode.Remov
1a680 65 43 68 69 6c 64 28 65 6c 65 6d 65 6e 74 29 3b  eChild(element);
1a690 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a6a0 20 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d    dirty = true;.
1a6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a6c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ..            el
1a6d0 65 6d 65 6e 74 20 3d 20 64 6f 63 75 6d 65 6e 74  ement = document
1a6e0 2e 53 65 6c 65 63 74 53 69 6e 67 6c 65 4e 6f 64  .SelectSingleNod
1a6f0 65 28 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  e(String.Format(
1a700 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a710 20 20 58 50 61 74 68 46 6f 72 52 65 6d 6f 76 65    XPathForRemove
1a720 45 6c 65 6d 65 6e 74 2c 20 69 6e 76 61 72 69 61  Element, invaria
1a730 6e 74 29 29 20 61 73 20 58 6d 6c 45 6c 65 6d 65  nt)) as XmlEleme
1a740 6e 74 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  nt;....         
1a750 20 20 20 69 66 20 28 65 6c 65 6d 65 6e 74 20 21     if (element !
1a760 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1a770 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1a780 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 2e          element.
1a790 50 61 72 65 6e 74 4e 6f 64 65 2e 52 65 6d 6f 76  ParentNode.Remov
1a7a0 65 43 68 69 6c 64 28 65 6c 65 6d 65 6e 74 29 3b  eChild(element);
1a7b0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a7c0 20 20 64 69 72 74 79 20 3d 20 74 72 75 65 3b 0d    dirty = true;.
1a7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1a7e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
1a7f0 20 28 64 69 72 74 79 29 0d 0a 20 20 20 20 20 20   (dirty)..      
1a800 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1a810 20 20 20 20 20 20 20 20 20 69 66 20 28 76 65 72           if (ver
1a820 62 6f 73 65 29 0d 0a 20 20 20 20 20 20 20 20 20  bose)..         
1a830 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
1a840 4f 70 73 2e 54 72 61 63 65 28 74 72 61 63 65 43  Ops.Trace(traceC
1a850 61 6c 6c 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e  allback, String.
1a860 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 22 65 6c 65 6d 65 6e 74 20 3d 20 7b 30 7d 22   "element = {0}"
1a890 2c 20 46 6f 72 44 69 73 70 6c 61 79 28 65 6c 65  , ForDisplay(ele
1a8a0 6d 65 6e 74 29 29 2c 20 74 72 61 63 65 43 61 74  ment)), traceCat
1a8b0 65 67 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20  egory);....     
1a8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
1a8d0 77 68 61 74 49 66 29 0d 0a 20 20 20 20 20 20 20  whatIf)..       
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63               doc
1a8f0 75 6d 65 6e 74 2e 53 61 76 65 28 66 69 6c 65 4e  ument.Save(fileN
1a900 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
1a910 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1a920 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20 20 20   true;..        
1a930 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1a940 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75 65       return true
1a950 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a  ;..        }....
1a960 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f          ////////
1a970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a980 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a9a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
1a9b0 0a 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  ...        priva
1a9c0 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50  te static bool P
1a9d0 72 6f 63 65 73 73 44 62 50 72 6f 76 69 64 65 72  rocessDbProvider
1a9e0 46 61 63 74 6f 72 79 28 0d 0a 20 20 20 20 20 20  Factory(..      
1a9f0 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 69 6c        string fil
1aa00 65 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  eName,..        
1aa10 20 20 20 20 73 74 72 69 6e 67 20 69 6e 76 61 72      string invar
1aa20 69 61 6e 74 2c 0d 0a 20 20 20 20 20 20 20 20 20  iant,..         
1aa30 20 20 20 73 74 72 69 6e 67 20 6e 61 6d 65 2c 0d     string name,.
1aa40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
1aa50 69 6e 67 20 64 65 73 63 72 69 70 74 69 6f 6e 2c  ing description,
1aa60 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ..            st
1aa70 72 69 6e 67 20 74 79 70 65 4e 61 6d 65 2c 0d 0a  ring typeName,..
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 41 73 73 65              Asse
1aa90 6d 62 6c 79 4e 61 6d 65 20 61 73 73 65 6d 62 6c  mblyName assembl
1aaa0 79 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  yName,..        
1aab0 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69 65 6e      object clien
1aac0 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20 20 20  tData,..        
1aad0 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
1aae0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1aaf0 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
1ab00 20 20 20 20 20 20 20 20 20 72 65 66 20 62 6f 6f           ref boo
1ab10 6c 20 73 61 76 65 64 2c 0d 0a 20 20 20 20 20 20  l saved,..      
1ab20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67        ref string
1ab30 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20   error..        
1ab40 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b      )..        {
1ab50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 6e  ..            An
1ab60 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f  yPair<string, bo
1ab70 6f 6c 3e 20 70 61 69 72 20 3d 20 63 6c 69 65 6e  ol> pair = clien
1ab80 74 44 61 74 61 20 61 73 20 41 6e 79 50 61 69 72  tData as AnyPair
1ab90 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d  <string, bool>;.
1aba0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ...            i
1abb0 66 20 28 70 61 69 72 20 3d 3d 20 6e 75 6c 6c 29  f (pair == null)
1abc0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1abd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1abe0 20 65 72 72 6f 72 20 3d 20 22 69 6e 76 61 6c 69   error = "invali
1abf0 64 20 66 72 61 6d 65 77 6f 72 6b 20 63 6f 6e 66  d framework conf
1ac00 69 67 20 63 61 6c 6c 62 61 63 6b 20 64 61 74 61  ig callback data
1ac10 22 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ";..            
1ac20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1ac30 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1ac40 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1ac50 69 66 20 28 70 61 69 72 2e 59 29 0d 0a 20 20 20  if (pair.Y)..   
1ac60 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1ac70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1ac80 72 6e 20 52 65 6d 6f 76 65 44 62 50 72 6f 76 69  rn RemoveDbProvi
1ac90 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20 20 20  derFactory(..   
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 76 61 72   fileName, invar
1acc0 69 61 6e 74 2c 20 77 68 61 74 49 66 2c 20 76 65  iant, whatIf, ve
1acd0 72 62 6f 73 65 2c 20 72 65 66 20 73 61 76 65 64  rbose, ref saved
1ace0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1acf0 20 20 20 20 20 20 20 72 65 66 20 65 72 72 6f 72         ref error
1ad00 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20 20 20  ) &&..          
1ad10 20 20 20 20 20 20 41 64 64 44 62 50 72 6f 76 69        AddDbProvi
1ad20 64 65 72 46 61 63 74 6f 72 79 28 0d 0a 20 20 20  derFactory(..   
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e 76 61 72   fileName, invar
1ad50 69 61 6e 74 2c 20 6e 61 6d 65 2c 20 64 65 73 63  iant, name, desc
1ad60 72 69 70 74 69 6f 6e 2c 20 74 79 70 65 4e 61 6d  ription, typeNam
1ad70 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1ad80 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 79          assembly
1ad90 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65  Name, whatIf, ve
1ada0 72 62 6f 73 65 2c 20 72 65 66 20 73 61 76 65 64  rbose, ref saved
1adb0 2c 20 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a 20  , ref error);.. 
1adc0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1add0 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a            else..
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ae00 65 74 75 72 6e 20 52 65 6d 6f 76 65 44 62 50 72  eturn RemoveDbPr
1ae10 6f 76 69 64 65 72 46 61 63 74 6f 72 79 28 0d 0a  oviderFactory(..
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 69 6e      fileName, in
1ae40 76 61 72 69 61 6e 74 2c 20 77 68 61 74 49 66 2c  variant, whatIf,
1ae50 20 76 65 72 62 6f 73 65 2c 20 72 65 66 20 73 61   verbose, ref sa
1ae60 76 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ved,..          
1ae70 20 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72            ref er
1ae80 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ror);..         
1ae90 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d     }..        }.
1aea0 0a 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67  .        #endreg
1aeb0 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f  ion....        /
1aec0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aed0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aee0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1aef0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1af00 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
1af10 20 20 23 72 65 67 69 6f 6e 20 41 73 73 65 6d 62    #region Assemb
1af20 6c 79 20 46 6f 6c 64 65 72 73 20 48 61 6e 64 6c  ly Folders Handl
1af30 69 6e 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69  ing..        pri
1af40 76 61 74 65 20 73 74 61 74 69 63 20 73 74 72 69  vate static stri
1af50 6e 67 20 47 65 74 41 73 73 65 6d 62 6c 79 46 6f  ng GetAssemblyFo
1af60 6c 64 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a 20  ldersKeyName(.. 
1af70 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1af80 67 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c  g frameworkName,
1af90 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
1afa0 72 73 69 6f 6e 20 66 72 61 6d 65 77 6f 72 6b 56  rsion frameworkV
1afb0 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20  ersion,..       
1afc0 20 20 20 20 20 73 74 72 69 6e 67 20 70 6c 61 74       string plat
1afd0 66 6f 72 6d 4e 61 6d 65 0d 0a 20 20 20 20 20 20  formName..      
1afe0 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1aff0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b000 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 20 3d 20  string format = 
1b010 21 53 74 72 69 6e 67 2e 49 73 4e 75 6c 6c 4f 72  !String.IsNullOr
1b020 45 6d 70 74 79 28 70 6c 61 74 66 6f 72 6d 4e 61  Empty(platformNa
1b030 6d 65 29 20 3f 0d 0a 20 20 20 20 20 20 20 20 20  me) ?..         
1b040 20 20 20 20 20 20 20 22 53 6f 66 74 77 61 72 65         "Software
1b050 5c 5c 4d 69 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d  \\Microsoft\\{0}
1b060 5c 5c 76 7b 31 7d 5c 5c 7b 32 7d 5c 5c 41 73 73  \\v{1}\\{2}\\Ass
1b070 65 6d 62 6c 79 46 6f 6c 64 65 72 73 45 78 22 20  emblyFoldersEx" 
1b080 3a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  :..             
1b090 20 20 20 22 53 6f 66 74 77 61 72 65 5c 5c 4d 69     "Software\\Mi
1b0a0 63 72 6f 73 6f 66 74 5c 5c 7b 30 7d 5c 5c 76 7b  crosoft\\{0}\\v{
1b0b0 31 7d 5c 5c 41 73 73 65 6d 62 6c 79 46 6f 6c 64  1}\\AssemblyFold
1b0c0 65 72 73 45 78 22 3b 0d 0a 0d 0a 20 20 20 20 20  ersEx";....     
1b0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 74         return St
1b0e0 72 69 6e 67 2e 46 6f 72 6d 61 74 28 66 6f 72 6d  ring.Format(form
1b0f0 61 74 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d  at, frameworkNam
1b100 65 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73  e, frameworkVers
1b110 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1b120 20 20 20 20 20 20 70 6c 61 74 66 6f 72 6d 4e 61        platformNa
1b130 6d 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 7d 0d  me);..        }.
1b140 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f  ...        /////
1b150 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b190 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 70 72  //....        pr
1b1a0 69 76 61 74 65 20 73 74 61 74 69 63 20 62 6f 6f  ivate static boo
1b1b0 6c 20 41 64 64 54 6f 41 73 73 65 6d 62 6c 79 46  l AddToAssemblyF
1b1c0 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20 20 20 20  olders(..       
1b1d0 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79       RegistryKey
1b1e0 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20   rootKey,..     
1b1f0 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 72         string fr
1b200 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20  ameworkName,..  
1b210 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f            Versio
1b220 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  n frameworkVersi
1b230 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
1b240 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d   string platform
1b250 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1b260 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
1b270 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1b280 20 20 20 73 74 72 69 6e 67 20 64 69 72 65 63 74     string direct
1b290 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
1b2a0 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a    bool whatIf,..
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c              bool
1b2c0 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20   verbose,..     
1b2d0 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69 6e         ref strin
1b2e0 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20  g error..       
1b2f0 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1b300 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  {..            s
1b310 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20  tring keyName = 
1b320 47 65 74 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65  GetAssemblyFolde
1b330 72 73 4b 65 79 4e 61 6d 65 28 0d 0a 20 20 20 20  rsKeyName(..    
1b340 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61 6d              fram
1b350 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65  eworkName, frame
1b360 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61  workVersion, pla
1b370 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  tformName);.... 
1b380 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
1b390 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
1b3a0 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79  y key = Registry
1b3b0 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65  Helper.OpenSubKe
1b3c0 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
1b3d0 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
1b3e0 20 6b 65 79 4e 61 6d 65 2c 20 74 72 75 65 2c 20   keyName, true, 
1b3f0 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1b400 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1b410 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b420 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
1b430 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1b440 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1b450 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1b460 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
1b470 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1b480 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
1b490 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73  d not open regis
1b4a0 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31  try key: {0}\\{1
1b4b0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1b4d0 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d  tKey, keyName);.
1b4e0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1b4f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
1b500 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
1b510 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1b520 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
1b530 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
1b540 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73  y subKey = Regis
1b550 74 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65  tryHelper.Create
1b560 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 6b 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65   key, subKeyName
1b590 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1b5a0 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
1b5b0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1b5d0 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  subKey == null).
1b5e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b5f0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
1b620 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63      "could not c
1b650 72 65 61 74 65 20 72 65 67 69 73 74 72 79 20 6b  reate registry k
1b660 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a  ey: {0}\\{1}",..
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c              key,
1b690 20 73 75 62 4b 65 79 4e 61 6d 65 29 3b 0d 0a 0d   subKeyName);...
1b6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b6b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b6c0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1b6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b6f0 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
1b700 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20  per.SetValue(.. 
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 6e         subKey, n
1b730 75 6c 6c 2c 20 64 69 72 65 63 74 6f 72 79 2c 20  ull, directory, 
1b740 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1b750 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1b760 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b770 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1b780 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
1b790 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1b7a0 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1b7b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b7c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b7d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b7e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1b7f0 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
1b800 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d   static bool Rem
1b810 6f 76 65 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46  oveFromAssemblyF
1b820 6f 6c 64 65 72 73 28 0d 0a 20 20 20 20 20 20 20  olders(..       
1b830 20 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79       RegistryKey
1b840 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20   rootKey,..     
1b850 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 66 72         string fr
1b860 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 0d 0a 20 20  ameworkName,..  
1b870 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69 6f            Versio
1b880 6e 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  n frameworkVersi
1b890 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
1b8a0 20 73 74 72 69 6e 67 20 70 6c 61 74 66 6f 72 6d   string platform
1b8b0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1b8c0 20 20 20 73 74 72 69 6e 67 20 73 75 62 4b 65 79     string subKey
1b8d0 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  Name,..         
1b8e0 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d     bool whatIf,.
1b8f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1b900 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20  l verbose,..    
1b910 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72 69          ref stri
1b920 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20 20  ng error..      
1b930 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20        )..       
1b940 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1b950 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d  string keyName =
1b960 20 47 65 74 41 73 73 65 6d 62 6c 79 46 6f 6c 64   GetAssemblyFold
1b970 65 72 73 4b 65 79 4e 61 6d 65 28 0d 0a 20 20 20  ersKeyName(..   
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 61               fra
1b990 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d  meworkName, fram
1b9a0 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70 6c  eworkVersion, pl
1b9b0 61 74 66 6f 72 6d 4e 61 6d 65 29 3b 0d 0a 0d 0a  atformName);....
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
1b9d0 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
1b9e0 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72  ey key = Registr
1b9f0 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
1ba00 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
1ba10 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
1ba20 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65  , keyName, false
1ba30 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1ba40 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
1ba50 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1ba60 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
1ba70 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1ba80 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1baa0 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
1bab0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1bad0 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
1bae0 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
1baf0 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1bb10 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29  ootKey, keyName)
1bb20 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1bb30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1bb40 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1bb50 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
1bb70 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c 65  istryHelper.Dele
1bb80 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20  teSubKey(..     
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
1bba0 65 79 2c 20 73 75 62 4b 65 79 4e 61 6d 65 2c 20  ey, subKeyName, 
1bbb0 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1bbc0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1bbd0 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1bbe0 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20  return true;..  
1bbf0 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1bc00 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f     /////////////
1bc10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1bc40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20  //////////....  
1bc50 20 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74        private st
1bc60 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73  atic bool Proces
1bc70 73 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72 73  sAssemblyFolders
1bc80 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  (..            R
1bc90 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
1bca0 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
1bcb0 20 73 74 72 69 6e 67 20 66 72 61 6d 65 77 6f 72   string framewor
1bcc0 6b 4e 61 6d 65 2c 0d 0a 20 20 20 20 20 20 20 20  kName,..        
1bcd0 20 20 20 20 56 65 72 73 69 6f 6e 20 66 72 61 6d      Version fram
1bce0 65 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 0d 0a 20  eworkVersion,.. 
1bcf0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1bd00 67 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d  g platformName,.
1bd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 62 6a  .            obj
1bd20 65 63 74 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d  ect clientData,.
1bd30 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f  .            boo
1bd40 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  l whatIf,..     
1bd50 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62         bool verb
1bd60 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ose,..          
1bd70 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72 72    ref string err
1bd80 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  or..            
1bd90 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20  )..        {..  
1bda0 20 20 20 20 20 20 20 20 20 20 41 6e 79 50 61 69            AnyPai
1bdb0 72 3c 73 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20  r<string, bool> 
1bdc0 70 61 69 72 20 3d 20 63 6c 69 65 6e 74 44 61 74  pair = clientDat
1bdd0 61 20 61 73 20 41 6e 79 50 61 69 72 3c 73 74 72  a as AnyPair<str
1bde0 69 6e 67 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20  ing, bool>;.... 
1bdf0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
1be00 61 69 72 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  air == null)..  
1be10 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1be30 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 66 72  or = "invalid fr
1be40 61 6d 65 77 6f 72 6b 20 63 61 6c 6c 62 61 63 6b  amework callback
1be50 20 64 61 74 61 22 3b 0d 0a 20 20 20 20 20 20 20   data";..       
1be60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1be70 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1be80 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1be90 20 20 20 20 20 69 66 20 28 70 61 69 72 2e 59 29       if (pair.Y)
1bea0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
1beb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bec0 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65 46 72   return RemoveFr
1bed0 6f 6d 41 73 73 65 6d 62 6c 79 46 6f 6c 64 65 72  omAssemblyFolder
1bee0 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  s(..            
1bef0 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c          rootKey,
1bf00 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65 2c 20   frameworkName, 
1bf10 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69 6f 6e  frameworkVersion
1bf20 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65 2c 0d  , platformName,.
1bf30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bf40 20 20 20 20 20 4c 65 67 61 63 79 50 72 6f 6a 65       LegacyProje
1bf50 63 74 4e 61 6d 65 2c 20 77 68 61 74 49 66 2c 20  ctName, whatIf, 
1bf60 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72  verbose, ref err
1bf70 6f 72 29 20 26 26 0d 0a 20 20 20 20 20 20 20 20  or) &&..        
1bf80 20 20 20 20 20 20 20 20 41 64 64 54 6f 41 73 73          AddToAss
1bf90 65 6d 62 6c 79 46 6f 6c 64 65 72 73 28 0d 0a 20  emblyFolders(.. 
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfb0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 66 72 61 6d     rootKey, fram
1bfc0 65 77 6f 72 6b 4e 61 6d 65 2c 20 66 72 61 6d 65  eworkName, frame
1bfd0 77 6f 72 6b 56 65 72 73 69 6f 6e 2c 20 70 6c 61  workVersion, pla
1bfe0 74 66 6f 72 6d 4e 61 6d 65 2c 0d 0a 20 20 20 20  tformName,..    
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 50 72 6f 6a 65 63 74 4e 61 6d 65 2c 20 70 61 69  ProjectName, pai
1c010 72 2e 58 2c 20 77 68 61 74 49 66 2c 20 76 65 72  r.X, whatIf, ver
1c020 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29  bose, ref error)
1c030 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  ;..            }
1c040 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ..            el
1c050 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  se..            
1c060 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c070 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f 76 65     return Remove
1c080 46 72 6f 6d 41 73 73 65 6d 62 6c 79 46 6f 6c 64  FromAssemblyFold
1c090 65 72 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20  ers(..          
1c0a0 20 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65            rootKe
1c0b0 79 2c 20 66 72 61 6d 65 77 6f 72 6b 4e 61 6d 65  y, frameworkName
1c0c0 2c 20 66 72 61 6d 65 77 6f 72 6b 56 65 72 73 69  , frameworkVersi
1c0d0 6f 6e 2c 20 70 6c 61 74 66 6f 72 6d 4e 61 6d 65  on, platformName
1c0e0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1c0f0 20 20 20 20 20 20 20 50 72 6f 6a 65 63 74 4e 61         ProjectNa
1c100 6d 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62  me, whatIf, verb
1c110 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29 3b  ose, ref error);
1c120 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d  ..            }.
1c130 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20  .        }..    
1c140 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
1c150 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f  ..        //////
1c160 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c170 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c180 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c190 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c1a0 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23 72 65  /....        #re
1c1b0 67 69 6f 6e 20 56 69 73 75 61 6c 20 53 74 75 64  gion Visual Stud
1c1c0 69 6f 20 48 61 6e 64 6c 69 6e 67 0d 0a 20 20 20  io Handling..   
1c1d0 20 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61       private sta
1c1e0 74 69 63 20 73 74 72 69 6e 67 20 47 65 74 56 73  tic string GetVs
1c1f0 4b 65 79 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20  KeyName(..      
1c200 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73        Version vs
1c210 56 65 72 73 69 6f 6e 0d 0a 20 20 20 20 20 20 20  Version..       
1c220 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20       )..        
1c230 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  {..            r
1c240 65 74 75 72 6e 20 53 74 72 69 6e 67 2e 46 6f 72  eturn String.For
1c250 6d 61 74 28 22 53 6f 66 74 77 61 72 65 5c 5c 4d  mat("Software\\M
1c260 69 63 72 6f 73 6f 66 74 5c 5c 56 69 73 75 61 6c  icrosoft\\Visual
1c270 53 74 75 64 69 6f 5c 5c 7b 30 7d 22 2c 0d 0a 20  Studio\\{0}",.. 
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
1c290 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 20 20 20 20  sVersion);..    
1c2a0 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1c2b0 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1c2c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c2d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c2e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c2f0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1c300 20 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73 75      #region Visu
1c310 61 6c 20 53 74 75 64 69 6f 20 44 61 74 61 20 53  al Studio Data S
1c320 6f 75 72 63 65 20 48 61 6e 64 6c 69 6e 67 0d 0a  ource Handling..
1c330 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
1c340 73 74 61 74 69 63 20 62 6f 6f 6c 20 41 64 64 56  static bool AddV
1c350 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a 20 20  sDataSource(..  
1c360 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1c370 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a  ryKey rootKey,..
1c380 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73              Vers
1c390 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d 0a  ion vsVersion,..
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
1c3b0 20 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a   dataSourceId,..
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
1c3d0 20 64 61 74 61 50 72 6f 76 69 64 65 72 49 64 2c   dataProviderId,
1c3e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1c3f0 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
1c400 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
1c410 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
1c420 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
1c430 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
1c440 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
1c450 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e             strin
1c460 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65 74 56  g keyName = GetV
1c470 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72 73 69  sKeyName(vsVersi
1c480 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  on);....        
1c490 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52      using (MockR
1c4a0 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79 20 3d  egistryKey key =
1c4b0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1c4c0 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d   rootKey, keyNam
1c4f0 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74 49 66  e, false, whatIf
1c500 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20  , verbose))..   
1c510 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
1c520 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
1c530 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  key == null)..  
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c560 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72       error = Str
1c570 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
1c5a0 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65  open registry ke
1c5b0 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20  y: {0}\\{1}",.. 
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
1c5e0 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20  keyName);....   
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
1c630 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b       using (Mock
1c640 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b  RegistryKey subK
1c650 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
1c660 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d  per.OpenSubKey(.
1c670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c680 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22 44           key, "D
1c690 61 74 61 53 6f 75 72 63 65 73 22 2c 20 74 72 75  ataSources", tru
1c6a0 65 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  e, whatIf, verbo
1c6b0 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se))..          
1c6c0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1c6e0 28 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29  (subKey == null)
1c6f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c700 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e   error = String.
1c730 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20       "could not 
1c760 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65  open registry ke
1c770 79 3a 20 7b 30 7d 5c 5c 44 61 74 61 53 6f 75 72  y: {0}\\DataSour
1c780 63 65 73 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ces",..         
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20     key);....    
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1c7d0 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1c7e0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
1c810 74 72 79 4b 65 79 20 64 61 74 61 53 6f 75 72 63  tryKey dataSourc
1c820 65 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48  eKey = RegistryH
1c830 65 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b  elper.CreateSubK
1c840 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 73 75 62 4b 65 79 2c 20 64 61 74 61 53 6f 75   subKey, dataSou
1c870 72 63 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  rceId.ToString(V
1c880 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74  sIdFormat), what
1c890 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8d0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1c8e0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
1c8f0 61 74 61 53 6f 75 72 63 65 4b 65 79 20 3d 3d 20  ataSourceKey == 
1c900 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1c920 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
1c940 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
1c950 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74        "could not
1c980 20 63 72 65 61 74 65 20 72 65 67 69 73 74 72 79   create registry
1c990 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c   key: {0}\\{1}",
1c9a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 6b 65 79 2c 20 64 61 74 61 53 6f 75 72 63    key, dataSourc
1c9d0 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49  eId.ToString(VsI
1c9e0 64 46 6f 72 6d 61 74 29 29 3b 0d 0a 0d 0a 20 20  dFormat));....  
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ca10 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1ca50 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74  gistryHelper.Set
1ca60 56 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20  Value(..        
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 20 20 20 64 61 74 61 53 6f 75 72 63 65 4b 65      dataSourceKe
1ca90 79 2c 20 6e 75 6c 6c 2c 20 53 74 72 69 6e 67 2e  y, null, String.
1caa0 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cac0 20 20 20 20 20 22 7b 30 7d 20 44 61 74 61 62 61       "{0} Databa
1cad0 73 65 20 46 69 6c 65 22 2c 20 50 72 6f 6a 65 63  se File", Projec
1cae0 74 4e 61 6d 65 29 2c 20 77 68 61 74 49 66 2c 0d  tName), whatIf,.
1caf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
1cb10 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bose);....      
1cb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb30 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
1cb40 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64 61  .CreateSubKey(da
1cb50 74 61 53 6f 75 72 63 65 4b 65 79 2c 0d 0a 20 20  taSourceKey,..  
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb70 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
1cb80 2e 46 6f 72 6d 61 74 28 22 53 75 70 70 6f 72 74  .Format("Support
1cb90 69 6e 67 50 72 6f 76 69 64 65 72 73 5c 5c 7b 30  ingProviders\\{0
1cba0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 64 61 74 61 50 72 6f 76 69 64 65 72 49 64 2e   dataProviderId.
1cbd0 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72  ToString(VsIdFor
1cbe0 6d 61 74 29 29 2c 20 77 68 61 74 49 66 2c 0d 0a  mat)), whatIf,..
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72 62              verb
1cc10 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ose);..         
1cc20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1cc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1cc50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1cc60 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20  turn true;..    
1cc70 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1cc80 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1cc90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1cca0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ccb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ccc0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1ccd0 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1cce0 69 63 20 62 6f 6f 6c 20 52 65 6d 6f 76 65 56 73  ic bool RemoveVs
1ccf0 44 61 74 61 53 6f 75 72 63 65 28 0d 0a 20 20 20  DataSource(..   
1cd00 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72           Registr
1cd10 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a 20  yKey rootKey,.. 
1cd20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73 69             Versi
1cd30 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d 0a 20  on vsVersion,.. 
1cd40 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20             Guid 
1cd50 64 61 74 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20  dataSourceId,.. 
1cd60 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20             bool 
1cd70 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  whatIf,..       
1cd80 20 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73       bool verbos
1cd90 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e,..            
1cda0 72 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72  ref string error
1cdb0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d  ..            ).
1cdc0 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20  .        {..    
1cdd0 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b          string k
1cde0 65 79 4e 61 6d 65 20 3d 20 47 65 74 56 73 4b 65  eyName = GetVsKe
1cdf0 79 4e 61 6d 65 28 76 73 56 65 72 73 69 6f 6e 29  yName(vsVersion)
1ce00 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1ce10 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69   using (MockRegi
1ce20 73 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65  stryKey key = Re
1ce30 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65  gistryHelper.Ope
1ce40 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20  nSubKey(..      
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1ce60 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20  otKey, keyName, 
1ce70 66 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76  false, whatIf, v
1ce80 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20  erbose))..      
1ce90 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1cea0 20 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79           if (key
1ceb0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1cec0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67    error = String
1cef0 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20  .Format(..      
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65    "could not ope
1cf20 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20  n registry key: 
1cf30 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20  {0}\\{1}",..    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79      rootKey, key
1cf60 4e 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  Name);....      
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1cf80 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1cfa0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1cfb0 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
1cfc0 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20  istryKey subKey 
1cfd0 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  = RegistryHelper
1cfe0 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20  .OpenSubKey(..  
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d000 20 20 20 20 20 20 6b 65 79 2c 20 22 44 61 74 61        key, "Data
1d010 53 6f 75 72 63 65 73 22 2c 20 74 72 75 65 2c 20  Sources", true, 
1d020 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1d030 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1d040 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d050 20 20 20 20 20 20 20 20 20 20 69 66 20 28 73 75            if (su
1d060 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20  bKey == null).. 
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
1d0a0 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72  ror = String.For
1d0b0 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65    "could not ope
1d0e0 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20  n registry key: 
1d0f0 7b 30 7d 5c 5c 44 61 74 61 53 6f 75 72 63 65 73  {0}\\DataSources
1d100 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 6b 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  key);....       
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a   return false;..
1d150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d160 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
1d180 69 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c 65  istryHelper.Dele
1d190 74 65 53 75 62 4b 65 79 54 72 65 65 28 0d 0a 20  teSubKeyTree(.. 
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 64         subKey, d
1d1c0 61 74 61 53 6f 75 72 63 65 49 64 2e 54 6f 53 74  ataSourceId.ToSt
1d1d0 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29  ring(VsIdFormat)
1d1e0 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20  , whatIf,..     
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d200 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20     verbose);..  
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
1d220 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
1d230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ..            re
1d240 74 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20  turn true;..    
1d250 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20      }....       
1d260 20 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 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d290 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d2a0 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
1d2b0 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
1d2c0 69 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73 56  ic bool ProcessV
1d2d0 73 44 61 74 61 53 6f 75 72 63 65 28 0d 0a 20 20  sDataSource(..  
1d2e0 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1d2f0 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d 0a  ryKey rootKey,..
1d300 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72 73              Vers
1d310 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d 0a  ion vsVersion,..
1d320 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64              Guid
1d330 20 70 61 63 6b 61 67 65 49 64 2c 20 2f 2a 20 4e   packageId, /* N
1d340 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20  OT USED */..    
1d350 20 20 20 20 20 20 20 20 47 75 69 64 20 73 65 72          Guid ser
1d360 76 69 63 65 49 64 2c 20 2f 2a 20 4e 4f 54 20 55  viceId, /* NOT U
1d370 53 45 44 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20  SED */..        
1d380 20 20 20 20 47 75 69 64 20 64 61 74 61 53 6f 75      Guid dataSou
1d390 72 63 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  rceId,..        
1d3a0 20 20 20 20 47 75 69 64 20 64 61 74 61 50 72 6f      Guid dataPro
1d3b0 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20  viderId,..      
1d3c0 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c 69        object cli
1d3d0 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20 20  entData,..      
1d3e0 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49        bool whatI
1d3f0 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
1d400 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  bool verbose,.. 
1d410 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20 73             ref s
1d420 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20  tring error..   
1d430 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20           )..    
1d440 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1d450 20 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e     AnyPair<strin
1d460 67 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d 20  g, bool> pair = 
1d470 63 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41 6e  clientData as An
1d480 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62 6f  yPair<string, bo
1d490 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ol>;....        
1d4a0 20 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d 20      if (pair == 
1d4b0 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
1d4c0 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
1d4d0 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22 69        error = "i
1d4e0 6e 76 61 6c 69 64 20 56 53 20 63 61 6c 6c 62 61  nvalid VS callba
1d4f0 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20 20 20  ck data";..     
1d500 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d510 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20  n false;..      
1d520 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1d530 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72 2e         if (pair.
1d540 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
1d550 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1d560 20 20 20 72 65 74 75 72 6e 20 41 64 64 56 73 44     return AddVsD
1d570 61 74 61 53 6f 75 72 63 65 28 0d 0a 20 20 20 20  ataSource(..    
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69  rootKey, vsVersi
1d5a0 6f 6e 2c 20 64 61 74 61 53 6f 75 72 63 65 49 64  on, dataSourceId
1d5b0 2c 20 64 61 74 61 50 72 6f 76 69 64 65 72 49 64  , dataProviderId
1d5c0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1d5d0 20 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76         whatIf, v
1d5e0 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f  erbose, ref erro
1d5f0 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r);..           
1d600 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
1d610 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20 20  else..          
1d620 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1d630 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d 6f       return Remo
1d640 76 65 56 73 44 61 74 61 53 6f 75 72 63 65 28 0d  veVsDataSource(.
1d650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d660 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73       rootKey, vs
1d670 56 65 72 73 69 6f 6e 2c 20 64 61 74 61 53 6f 75  Version, dataSou
1d680 72 63 65 49 64 2c 20 77 68 61 74 49 66 2c 20 76  rceId, whatIf, v
1d690 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66               ref
1d6b0 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20 20 20 20   error);..      
1d6c0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
1d6d0 20 7d 0d 0a 20 20 20 20 20 20 20 20 23 65 6e 64   }..        #end
1d6e0 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
1d6f0 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
1d700 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d710 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1d730 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
1d740 20 20 20 20 20 23 72 65 67 69 6f 6e 20 56 69 73       #region Vis
1d750 75 61 6c 20 53 74 75 64 69 6f 20 44 61 74 61 20  ual Studio Data 
1d760 50 72 6f 76 69 64 65 72 20 48 61 6e 64 6c 69 6e  Provider Handlin
1d770 67 0d 0a 20 20 20 20 20 20 20 20 70 72 69 76 61  g..        priva
1d780 74 65 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 41  te static bool A
1d790 64 64 56 73 44 61 74 61 50 72 6f 76 69 64 65 72  ddVsDataProvider
1d7a0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 52  (..            R
1d7b0 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b  egistryKey rootK
1d7c0 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey,..           
1d7d0 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73 69   Version vsVersi
1d7e0 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  on,..           
1d7f0 20 47 75 69 64 20 73 65 72 76 69 63 65 49 64 2c   Guid serviceId,
1d800 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75  ..            Gu
1d810 69 64 20 64 61 74 61 50 72 6f 76 69 64 65 72 49  id dataProviderI
1d820 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
1d830 73 74 72 69 6e 67 20 66 69 6c 65 4e 61 6d 65 2c  string fileName,
1d840 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1d850 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ol whatIf,..    
1d860 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76 65 72          bool ver
1d870 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20  bose,..         
1d880 20 20 20 72 65 66 20 73 74 72 69 6e 67 20 65 72     ref string er
1d890 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ror..           
1d8a0 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d 0a 20   )..        {.. 
1d8b0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
1d8c0 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f 67  sAdoNetTechnolog
1d8d0 79 49 64 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20  yId == null)..  
1d8e0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1d900 6f 72 20 3d 20 22 69 6e 76 61 6c 69 64 20 41 44  or = "invalid AD
1d910 4f 2e 4e 45 54 20 74 65 63 68 6e 6f 6c 6f 67 79  O.NET technology
1d920 20 49 64 22 3b 0d 0a 20 20 20 20 20 20 20 20 20   Id";..         
1d930 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
1d940 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
1d950 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1d960 20 20 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d     string keyNam
1d970 65 20 3d 20 47 65 74 56 73 4b 65 79 4e 61 6d 65  e = GetVsKeyName
1d980 28 76 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a  (vsVersion);....
1d990 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
1d9a0 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
1d9b0 65 79 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72  ey key = Registr
1d9c0 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b  yHelper.OpenSubK
1d9d0 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ey(..           
1d9e0 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
1d9f0 2c 20 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65  , keyName, false
1da00 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
1da10 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
1da20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1da30 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e      if (key == n
1da40 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1da50 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
1da70 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d  or = String.Form
1da80 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1daa0 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
1dab0 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
1dac0 7b 31 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  {1}",..         
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1dae0 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29  ootKey, keyName)
1daf0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1db00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1db10 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
1db20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
1db30 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
1db40 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
1db50 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67  Key subKey = Reg
1db60 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
1db70 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 6b 65 79 2c 20 22 44 61 74 61 50 72 6f 76 69   key, "DataProvi
1dba0 64 65 72 73 22 2c 20 74 72 75 65 2c 20 77 68 61  ders", true, wha
1dbb0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a  tIf, verbose))..
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1dbe0 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65         if (subKe
1dbf0 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20  y == null)..    
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1dc20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1dc30 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
1dc40 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1dc60 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72  could not open r
1dc70 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d  egistry key: {0}
1dc80 5c 5c 44 61 74 61 50 72 6f 76 69 64 65 72 73 22  \\DataProviders"
1dc90 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
1dcb0 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ey);....        
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e              usin
1dd10 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b  g (MockRegistryK
1dd20 65 79 20 64 61 74 61 50 72 6f 76 69 64 65 72 4b  ey dataProviderK
1dd30 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c  ey = RegistryHel
1dd40 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79  per.CreateSubKey
1dd50 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1dd70 75 62 4b 65 79 2c 20 64 61 74 61 50 72 6f 76 69  ubKey, dataProvi
1dd80 64 65 72 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  derId.ToString(V
1dd90 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74  sIdFormat), what
1dda0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1ddf0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64             if (d
1de00 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 20 3d  ataProviderKey =
1de10 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20  = null)..       
1de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de30 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
1de60 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e          "could n
1de90 6f 74 20 63 72 65 61 74 65 20 72 65 67 69 73 74  ot create regist
1dea0 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d  ry key: {0}\\{1}
1deb0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 6b 65 79 2c 20 64 61 74 61 50 72 6f      key, dataPro
1dee0 76 69 64 65 72 49 64 2e 54 6f 53 74 72 69 6e 67  viderId.ToString
1def0 28 56 73 49 64 46 6f 72 6d 61 74 29 29 3b 0d 0a  (VsIdFormat));..
1df00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1df20 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20       }....      
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
1df70 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20  .SetValue(..    
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 64 61 74 61 50 72 6f 76          dataProv
1dfa0 69 64 65 72 4b 65 79 2c 20 6e 75 6c 6c 2c 20 44  iderKey, null, D
1dfb0 65 73 63 72 69 70 74 69 6f 6e 2c 20 77 68 61 74  escription, what
1dfc0 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1e010 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a  lper.SetValue(..
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e030 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
1e040 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22 49 6e  ProviderKey, "In
1e050 76 61 72 69 61 6e 74 4e 61 6d 65 22 2c 20 49 6e  variantName", In
1e060 76 61 72 69 61 6e 74 4e 61 6d 65 2c 0d 0a 20 20  variantName,..  
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66            whatIf
1e090 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20  , verbose);.... 
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48         RegistryH
1e0c0 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d  elper.SetValue(.
1e0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
1e0f0 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22 54  aProviderKey, "T
1e100 65 63 68 6e 6f 6c 6f 67 79 22 2c 0d 0a 20 20 20  echnology",..   
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 20 20 20 20 20 20 28 28 47 75 69 64 29           ((Guid)
1e130 76 73 41 64 6f 4e 65 74 54 65 63 68 6e 6f 6c 6f  vsAdoNetTechnolo
1e140 67 79 49 64 29 2e 54 6f 53 74 72 69 6e 67 28 56  gyId).ToString(V
1e150 73 49 64 46 6f 72 6d 61 74 29 2c 0d 0a 20 20 20  sIdFormat),..   
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e170 20 20 20 20 20 20 20 20 20 77 68 61 74 49 66 2c           whatIf,
1e180 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1e1b0 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a  lper.SetValue(..
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
1e1e0 50 72 6f 76 69 64 65 72 4b 65 79 2c 20 22 43 6f  ProviderKey, "Co
1e1f0 64 65 42 61 73 65 22 2c 20 66 69 6c 65 4e 61 6d  deBase", fileNam
1e200 65 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  e, whatIf,..    
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
1e230 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
1e250 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56  istryHelper.SetV
1e260 61 6c 75 65 28 0d 0a 20 20 20 20 20 20 20 20 20  alue(..         
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e280 20 20 20 64 61 74 61 50 72 6f 76 69 64 65 72 4b     dataProviderK
1e290 65 79 2c 20 22 46 61 63 74 6f 72 79 53 65 72 76  ey, "FactoryServ
1e2a0 69 63 65 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ice",..         
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 20 73 65 72 76 69 63 65 49 64 2e 54 6f 53     serviceId.ToS
1e2d0 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74  tring(VsIdFormat
1e2e0 29 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  ), whatIf, verbo
1e2f0 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  se);....        
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43  RegistryHelper.C
1e320 72 65 61 74 65 53 75 62 4b 65 79 28 64 61 74 61  reateSubKey(data
1e330 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a 20 20  ProviderKey,..  
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 20 20 20 20 20 20 20 20 22 53 75 70 70 6f            "Suppo
1e360 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44 61 74  rtedObjects\\Dat
1e370 61 43 6f 6e 6e 65 63 74 69 6f 6e 55 49 43 6f 6e  aConnectionUICon
1e380 74 72 6f 6c 22 2c 0d 0a 20 20 20 20 20 20 20 20  trol",..        
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 20 20 20 77 68 61 74 49 66 2c 20 76 65 72 62      whatIf, verb
1e3b0 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ose);....       
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1e3e0 43 72 65 61 74 65 53 75 62 4b 65 79 28 64 61 74  CreateSubKey(dat
1e3f0 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a 20  aProviderKey,.. 
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 20 20 20 20 20 20 20 20 20 20 20 22 53 75 70 70             "Supp
1e420 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44 61  ortedObjects\\Da
1e430 74 61 43 6f 6e 6e 65 63 74 69 6f 6e 50 72 6f 70  taConnectionProp
1e440 65 72 74 69 65 73 22 2c 0d 0a 20 20 20 20 20 20  erties",..      
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65        whatIf, ve
1e470 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
1e4a0 72 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64  r.CreateSubKey(d
1e4b0 61 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d  ataProviderKey,.
1e4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 75               "Su
1e4e0 70 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c  pportedObjects\\
1e4f0 44 61 74 61 43 6f 6e 6e 65 63 74 69 6f 6e 53 75  DataConnectionSu
1e500 70 70 6f 72 74 22 2c 20 77 68 61 74 49 66 2c 0d  pport", whatIf,.
1e510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
1e530 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  bose);....      
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
1e560 2e 43 72 65 61 74 65 53 75 62 4b 65 79 28 64 61  .CreateSubKey(da
1e570 74 61 50 72 6f 76 69 64 65 72 4b 65 79 2c 0d 0a  taProviderKey,..
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 20 20 20 20 20 20 20 20 22 53 75 70              "Sup
1e5a0 70 6f 72 74 65 64 4f 62 6a 65 63 74 73 5c 5c 44  portedObjects\\D
1e5b0 61 74 61 4f 62 6a 65 63 74 53 75 70 70 6f 72 74  ataObjectSupport
1e5c0 22 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  ", whatIf,..    
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
1e5f0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
1e610 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72 65 61  istryHelper.Crea
1e620 74 65 53 75 62 4b 65 79 28 64 61 74 61 50 72 6f  teSubKey(dataPro
1e630 76 69 64 65 72 4b 65 79 2c 0d 0a 20 20 20 20 20  viderKey,..     
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 22 53 75 70 70 6f 72 74 65         "Supporte
1e660 64 4f 62 6a 65 63 74 73 5c 5c 44 61 74 61 56 69  dObjects\\DataVi
1e670 65 77 53 75 70 70 6f 72 74 22 2c 20 77 68 61 74  ewSupport", what
1e680 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20   verbose);..    
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6c0 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
1e6d0 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
1e6e0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
1e6f0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
1e700 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
1e710 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
1e720 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e730 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e740 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1e750 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
1e760 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
1e770 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 52 65 6d   static bool Rem
1e780 6f 76 65 56 73 44 61 74 61 50 72 6f 76 69 64 65  oveVsDataProvide
1e790 72 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  r(..            
1e7a0 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
1e7b0 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
1e7c0 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
1e7d0 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1e7e0 20 20 47 75 69 64 20 64 61 74 61 50 72 6f 76 69    Guid dataProvi
1e7f0 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20 20 20  derId,..        
1e800 20 20 20 20 62 6f 6f 6c 20 77 68 61 74 49 66 2c      bool whatIf,
1e810 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f  ..            bo
1e820 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a 20 20 20  ol verbose,..   
1e830 20 20 20 20 20 20 20 20 20 72 65 66 20 73 74 72           ref str
1e840 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20 20 20 20  ing error..     
1e850 20 20 20 20 20 20 20 29 0d 0a 20 20 20 20 20 20         )..      
1e860 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1e870 20 73 74 72 69 6e 67 20 6b 65 79 4e 61 6d 65 20   string keyName 
1e880 3d 20 47 65 74 56 73 4b 65 79 4e 61 6d 65 28 76  = GetVsKeyName(v
1e890 73 56 65 72 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20  sVersion);....  
1e8a0 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
1e8b0 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
1e8c0 20 6b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48   key = RegistryH
1e8d0 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
1e8e0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1e8f0 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79 2c 20         rootKey, 
1e900 6b 65 79 4e 61 6d 65 2c 20 66 61 6c 73 65 2c 20  keyName, false, 
1e910 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1e920 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
1e930 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1e940 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 6e 75 6c    if (key == nul
1e950 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1e960 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1e970 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1e980 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
1e990 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1e9a0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c             "coul
1e9b0 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73  d not open regis
1e9c0 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31  try key: {0}\\{1
1e9d0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1e9f0 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d  tKey, keyName);.
1ea00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
1ea10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
1ea20 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  lse;..          
1ea30 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20        }....     
1ea40 20 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67             using
1ea50 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65   (MockRegistryKe
1ea60 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67 69 73  y subKey = Regis
1ea70 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e 53 75  tryHelper.OpenSu
1ea80 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20 20  bKey(..         
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
1eaa0 65 79 2c 20 22 44 61 74 61 50 72 6f 76 69 64 65  ey, "DataProvide
1eab0 72 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74 49  rs", true, whatI
1eac0 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1eae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eaf0 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79 20       if (subKey 
1eb00 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1eb20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb30 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
1eb40 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
1eb50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
1eb70 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
1eb80 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
1eb90 44 61 74 61 50 72 6f 76 69 64 65 72 73 22 2c 0d  DataProviders",.
1eba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6b 65 79               key
1ebc0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1ebe0 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20  turn false;..   
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
1ec10 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1ec20 72 79 48 65 6c 70 65 72 2e 44 65 6c 65 74 65 53  ryHelper.DeleteS
1ec30 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20 20 20  ubKeyTree(..    
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 73 75 62 4b 65 79 2c 20 64 61 74 61      subKey, data
1ec60 50 72 6f 76 69 64 65 72 49 64 2e 54 6f 53 74 72  ProviderId.ToStr
1ec70 69 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c  ing(VsIdFormat),
1ec80 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20   whatIf,..      
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20    verbose);..   
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1ecd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1ece0 75 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20  urn true;..     
1ecf0 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
1ed00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ed10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ed20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ed30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ed40 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
1ed50 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
1ed60 63 20 62 6f 6f 6c 20 50 72 6f 63 65 73 73 56 73  c bool ProcessVs
1ed70 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d 0a 20  DataProvider(.. 
1ed80 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73             Regis
1ed90 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c 0d  tryKey rootKey,.
1eda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65 72  .            Ver
1edb0 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c 0d  sion vsVersion,.
1edc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75 69  .            Gui
1edd0 64 20 70 61 63 6b 61 67 65 49 64 2c 20 2f 2a 20  d packageId, /* 
1ede0 4e 4f 54 20 55 53 45 44 20 2a 2f 0d 0a 20 20 20  NOT USED */..   
1edf0 20 20 20 20 20 20 20 20 20 47 75 69 64 20 73 65           Guid se
1ee00 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20 20 20  rviceId,..      
1ee10 20 20 20 20 20 20 47 75 69 64 20 64 61 74 61 53        Guid dataS
1ee20 6f 75 72 63 65 49 64 2c 20 2f 2a 20 4e 4f 54 20  ourceId, /* NOT 
1ee30 55 53 45 44 20 2a 2f 0d 0a 20 20 20 20 20 20 20  USED */..       
1ee40 20 20 20 20 20 47 75 69 64 20 64 61 74 61 50 72       Guid dataPr
1ee50 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20 20  oviderId,..     
1ee60 20 20 20 20 20 20 20 6f 62 6a 65 63 74 20 63 6c         object cl
1ee70 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20 20 20 20  ientData,..     
1ee80 20 20 20 20 20 20 20 62 6f 6f 6c 20 77 68 61 74         bool what
1ee90 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1eea0 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65 2c 0d 0a   bool verbose,..
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 20              ref 
1eec0 73 74 72 69 6e 67 20 65 72 72 6f 72 0d 0a 20 20  string error..  
1eed0 20 20 20 20 20 20 20 20 20 20 29 0d 0a 20 20 20            )..   
1eee0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1eef0 20 20 20 20 41 6e 79 50 61 69 72 3c 73 74 72 69      AnyPair<stri
1ef00 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69 72 20 3d  ng, bool> pair =
1ef10 20 63 6c 69 65 6e 74 44 61 74 61 20 61 73 20 41   clientData as A
1ef20 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62  nyPair<string, b
1ef30 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ool>;....       
1ef40 20 20 20 20 20 69 66 20 28 70 61 69 72 20 3d 3d       if (pair ==
1ef50 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20   null)..        
1ef60 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
1ef70 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 22         error = "
1ef80 69 6e 76 61 6c 69 64 20 56 53 20 63 61 6c 6c 62  invalid VS callb
1ef90 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20 20 20 20  ack data";..    
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1efb0 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20  rn false;..     
1efc0 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
1efd0 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72          if (pair
1efe0 2e 59 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  .Y)..           
1eff0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
1f000 20 20 20 20 72 65 74 75 72 6e 20 41 64 64 56 73      return AddVs
1f010 44 61 74 61 50 72 6f 76 69 64 65 72 28 0d 0a 20  DataProvider(.. 
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65     rootKey, vsVe
1f040 72 73 69 6f 6e 2c 20 73 65 72 76 69 63 65 49 64  rsion, serviceId
1f050 2c 20 64 61 74 61 50 72 6f 76 69 64 65 72 49 64  , dataProviderId
1f060 2c 20 70 61 69 72 2e 58 2c 0d 0a 20 20 20 20 20  , pair.X,..     
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1f080 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 20  hatIf, verbose, 
1f090 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a 20 20 20  ref error);..   
1f0a0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
1f0b0 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20 20          else..  
1f0c0 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1f0e0 75 72 6e 20 52 65 6d 6f 76 65 56 73 44 61 74 61  urn RemoveVsData
1f0f0 50 72 6f 76 69 64 65 72 28 0d 0a 20 20 20 20 20  Provider(..     
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1f110 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73 69 6f  ootKey, vsVersio
1f120 6e 2c 20 64 61 74 61 50 72 6f 76 69 64 65 72 49  n, dataProviderI
1f130 64 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  d, whatIf, verbo
1f140 73 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se,..           
1f150 20 20 20 20 20 20 20 20 20 72 65 66 20 65 72 72           ref err
1f160 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
1f170 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a    }..        }..
1f180 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
1f190 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f  on....        //
1f1a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 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 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
1f1f0 20 23 72 65 67 69 6f 6e 20 56 69 73 75 61 6c 20   #region Visual 
1f200 53 74 75 64 69 6f 20 50 61 63 6b 61 67 65 20 48  Studio Package H
1f210 61 6e 64 6c 69 6e 67 0d 0a 20 20 20 20 20 20 20  andling..       
1f220 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20   private static 
1f230 62 6f 6f 6c 20 41 64 64 56 73 50 61 63 6b 61 67  bool AddVsPackag
1f240 65 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e(..            
1f250 52 65 67 69 73 74 72 79 4b 65 79 20 72 6f 6f 74  RegistryKey root
1f260 4b 65 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  Key,..          
1f270 20 20 56 65 72 73 69 6f 6e 20 76 73 56 65 72 73    Version vsVers
1f280 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ion,..          
1f290 20 20 47 75 69 64 20 70 61 63 6b 61 67 65 49 64    Guid packageId
1f2a0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ,..            G
1f2b0 75 69 64 20 73 65 72 76 69 63 65 49 64 2c 0d 0a  uid serviceId,..
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 69              stri
1f2d0 6e 67 20 66 69 6c 65 4e 61 6d 65 2c 0d 0a 20 20  ng fileName,..  
1f2e0 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77            bool w
1f2f0 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
1f300 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
1f310 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
1f320 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
1f330 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
1f340 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
1f350 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 6b 65         string ke
1f360 79 4e 61 6d 65 20 3d 20 47 65 74 56 73 4b 65 79  yName = GetVsKey
1f370 4e 61 6d 65 28 76 73 56 65 72 73 69 6f 6e 29 3b  Name(vsVersion);
1f380 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
1f390 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
1f3a0 74 72 79 4b 65 79 20 6b 65 79 20 3d 20 52 65 67  tryKey key = Reg
1f3b0 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
1f3c0 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f               roo
1f3e0 74 4b 65 79 2c 20 6b 65 79 4e 61 6d 65 2c 20 66  tKey, keyName, f
1f3f0 61 6c 73 65 2c 20 77 68 61 74 49 66 2c 20 76 65  alse, whatIf, ve
1f400 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20  rbose))..       
1f410 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
1f420 20 20 20 20 20 20 20 20 69 66 20 28 6b 65 79 20          if (key 
1f430 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
1f440 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e   error = String.
1f470 46 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20  Format(..       
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e   "could not open
1f4a0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
1f4b0 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  0}\\{1}",..     
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e     rootKey, keyN
1f4e0 61 6d 65 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ame);....       
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1f500 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20  urn false;..    
1f510 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
1f520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f530 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69   using (MockRegi
1f540 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d  stryKey subKey =
1f550 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
1f560 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20  OpenSubKey(..   
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f580 20 20 20 20 20 6b 65 79 2c 20 22 50 61 63 6b 61       key, "Packa
1f590 67 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74  ges", true, what
1f5a0 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20  If, verbose)).. 
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1f5c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f5d0 20 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79        if (subKey
1f5e0 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1f600 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f610 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
1f620 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  = String.Format(
1f630 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1f650 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65  ould not open re
1f660 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c  gistry key: {0}\
1f670 5c 50 61 63 6b 61 67 65 73 22 2c 0d 0a 20 20 20  \Packages",..   
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a           key);..
1f6a0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f6b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f6c0 20 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20   false;..       
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
1f6e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f6f0 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
1f700 6b 52 65 67 69 73 74 72 79 4b 65 79 20 70 61 63  kRegistryKey pac
1f710 6b 61 67 65 4b 65 79 20 3d 20 52 65 67 69 73 74  kageKey = Regist
1f720 72 79 48 65 6c 70 65 72 2e 43 72 65 61 74 65 53  ryHelper.CreateS
1f730 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20 20  ubKey(..        
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 20 20 20 73 75 62 4b 65 79 2c 20 70 61 63 6b      subKey, pack
1f760 61 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56  ageId.ToString(V
1f770 73 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74  sIdFormat), what
1f780 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  If,..           
1f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7a0 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20   verbose))..    
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
1f7d0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
1f7e0 61 63 6b 61 67 65 4b 65 79 20 3d 3d 20 6e 75 6c  ackageKey == nul
1f7f0 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  l)..            
1f800 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72             error
1f830 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74   = String.Format
1f840 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72     "could not cr
1f870 65 61 74 65 20 72 65 67 69 73 74 72 79 20 6b 65  eate registry ke
1f880 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20  y: {0}\\{1}",.. 
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
1f8b0 65 79 2c 20 70 61 63 6b 61 67 65 49 64 2e 54 6f  ey, packageId.To
1f8c0 53 74 72 69 6e 67 28 56 73 49 64 46 6f 72 6d 61  String(VsIdForma
1f8d0 74 29 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  t));....        
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
1f900 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1f910 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
1f940 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
1f950 70 61 63 6b 61 67 65 4b 65 79 2c 20 6e 75 6c 6c  packageKey, null
1f960 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28  , String.Format(
1f970 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 7b                "{
1f990 30 7d 20 44 65 73 69 67 6e 65 72 20 50 61 63 6b  0} Designer Pack
1f9a0 61 67 65 22 2c 20 50 72 6f 6a 65 63 74 4e 61 6d  age", ProjectNam
1f9b0 65 29 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20  e), whatIf,..   
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65           verbose
1f9e0 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1fa00 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74  gistryHelper.Set
1fa10 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79  Value(packageKey
1fa20 2c 20 22 43 6c 61 73 73 22 2c 0d 0a 20 20 20 20  , "Class",..    
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 20 20 20 20 20 20 22 53 51 4c 69 74 65 2e          "SQLite.
1fa50 44 65 73 69 67 6e 65 72 2e 53 51 4c 69 74 65 50  Designer.SQLiteP
1fa60 61 63 6b 61 67 65 22 2c 20 77 68 61 74 49 66 2c  ackage", whatIf,
1fa70 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20   verbose);....  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
1faa0 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70 61  lper.SetValue(pa
1fab0 63 6b 61 67 65 4b 65 79 2c 20 22 43 6f 64 65 42  ckageKey, "CodeB
1fac0 61 73 65 22 2c 0d 0a 20 20 20 20 20 20 20 20 20  ase",..         
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 20 20 66 69 6c 65 4e 61 6d 65 2c 20 77 68 61     fileName, wha
1faf0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
1fb00 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb10 20 20 20 20 20 20 20 20 20 20 52 65 67 69 73 74            Regist
1fb20 72 79 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75  ryHelper.SetValu
1fb30 65 28 70 61 63 6b 61 67 65 4b 65 79 2c 20 22 49  e(packageKey, "I
1fb40 44 22 2c 20 34 30 30 2c 20 77 68 61 74 49 66 2c  D", 400, whatIf,
1fb50 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
1fb70 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
1fba0 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61  r.SetValue(packa
1fbb0 67 65 4b 65 79 2c 20 22 49 6e 70 72 6f 63 53 65  geKey, "InprocSe
1fbc0 72 76 65 72 33 32 22 2c 0d 0a 20 20 20 20 20 20  rver32",..      
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 50 61 74 68 2e 43 6f 6d 62 69        Path.Combi
1fbf0 6e 65 28 45 6e 76 69 72 6f 6e 6d 65 6e 74 2e 53  ne(Environment.S
1fc00 79 73 74 65 6d 44 69 72 65 63 74 6f 72 79 2c 0d  ystemDirectory,.
1fc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 22 6d 73 63 6f 72 65 65 2e 64 6c 6c 22 29 2c   "mscoree.dll"),
1fc40 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65   whatIf, verbose
1fc50 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  );....          
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
1fc70 67 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74  gistryHelper.Set
1fc80 56 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79  Value(packageKey
1fc90 2c 20 22 43 6f 6d 70 61 6e 79 4e 61 6d 65 22 2c  , "CompanyName",
1fca0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 68                "h
1fcc0 74 74 70 3a 2f 2f 73 79 73 74 65 6d 2e 64 61 74  ttp://system.dat
1fcd0 61 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 22 2c 20  a.sqlite.org/", 
1fce0 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29  whatIf, verbose)
1fcf0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67               Reg
1fd10 69 73 74 72 79 48 65 6c 70 65 72 2e 53 65 74 56  istryHelper.SetV
1fd20 61 6c 75 65 28 70 61 63 6b 61 67 65 4b 65 79 2c  alue(packageKey,
1fd30 20 22 4d 69 6e 45 64 69 74 69 6f 6e 22 2c 0d 0a   "MinEdition",..
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 22 73 74 61              "sta
1fd60 6e 64 61 72 64 22 2c 20 77 68 61 74 49 66 2c 20  ndard", whatIf, 
1fd70 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20  verbose);....   
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
1fda0 70 65 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63  per.SetValue(pac
1fdb0 6b 61 67 65 4b 65 79 2c 20 22 50 72 6f 64 75 63  kageKey, "Produc
1fdc0 74 4e 61 6d 65 22 2c 0d 0a 20 20 20 20 20 20 20  tName",..       
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 20 20 53 74 72 69 6e 67 2e 46 6f 72 6d       String.Form
1fdf0 61 74 28 22 7b 30 7d 20 44 65 73 69 67 6e 65 72  at("{0} Designer
1fe00 20 50 61 63 6b 61 67 65 22 2c 20 50 72 6f 6a 65   Package", Proje
1fe10 63 74 4e 61 6d 65 29 2c 0d 0a 20 20 20 20 20 20  ctName),..      
1fe20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe30 20 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65        whatIf, ve
1fe40 72 62 6f 73 65 29 3b 0d 0a 0d 0a 20 20 20 20 20  rbose);....     
1fe50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe60 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65     RegistryHelpe
1fe70 72 2e 53 65 74 56 61 6c 75 65 28 70 61 63 6b 61  r.SetValue(packa
1fe80 67 65 4b 65 79 2c 20 22 50 72 6f 64 75 63 74 56  geKey, "ProductV
1fe90 65 72 73 69 6f 6e 22 2c 0d 0a 20 20 20 20 20 20  ersion",..      
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 20 20 20 20 22 31 2e 30 22 2c 20 77 68 61        "1.0", wha
1fec0 74 49 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a  tIf, verbose);..
1fed0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1fee0 20 20 20 20 20 20 20 20 20 20 75 73 69 6e 67 20            using 
1fef0 28 4d 6f 63 6b 52 65 67 69 73 74 72 79 4b 65 79  (MockRegistryKey
1ff00 20 74 6f 6f 6c 62 6f 78 4b 65 79 20 3d 20 52 65   toolboxKey = Re
1ff10 67 69 73 74 72 79 48 65 6c 70 65 72 2e 43 72 65  gistryHelper.Cre
1ff20 61 74 65 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  ateSubKey(..    
1ff30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b              pack
1ff50 61 67 65 4b 65 79 2c 20 22 54 6f 6f 6c 62 6f 78  ageKey, "Toolbox
1ff60 22 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f  ", whatIf, verbo
1ff70 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20  se))..          
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
1ff90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
1ffb0 28 74 6f 6f 6c 62 6f 78 4b 65 79 20 3d 3d 20 6e  (toolboxKey == n
1ffc0 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20 20  ull)..          
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20    {..           
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74 72       error = Str
20010 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20 20  ing.Format(..   
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20040 20 22 63 6f 75 6c 64 20 6e 6f 74 20 63 72 65 61   "could not crea
20050 74 65 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a  te registry key:
20060 20 7b 30 7d 5c 5c 54 6f 6f 6c 62 6f 78 22 2c 0d   {0}\\Toolbox",.
20070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 20 70 61 63 6b 61 67 65 4b 65 79 29       packageKey)
200a0 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ;....           
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
200d0 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }....           
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20110 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e   RegistryHelper.
20120 53 65 74 56 61 6c 75 65 28 0d 0a 20 20 20 20 20  SetValue(..     
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 20 20 20 20 20 20 20 20 20 20 20 74 6f 6f 6c 62             toolb
20150 6f 78 4b 65 79 2c 20 22 44 65 66 61 75 6c 74 20  oxKey, "Default 
20160 49 74 65 6d 73 22 2c 20 33 2c 20 77 68 61 74 49  Items", 3, whatI
20170 66 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  f,..            
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 20 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20      verbose);.. 
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
201d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
201e0 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20   }....          
201f0 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
20200 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75 62  kRegistryKey sub
20210 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  Key = RegistryHe
20220 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28  lper.OpenSubKey(
20230 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20240 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20 22            key, "
20250 4d 65 6e 75 73 22 2c 20 74 72 75 65 2c 20 77 68  Menus", true, wh
20260 61 74 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d  atIf, verbose)).
20270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20280 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
20290 20 20 20 20 20 20 20 20 69 66 20 28 73 75 62 4b          if (subK
202a0 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20  ey == null)..   
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20   {..            
202d0 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6f              erro
202e0 72 20 3d 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61  r = String.Forma
202f0 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t(..            
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 22 63 6f 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20  "could not open 
20320 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b 30  registry key: {0
20330 7d 5c 5c 4d 65 6e 75 73 22 2c 0d 0a 20 20 20 20  }\\Menus",..    
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d          key);...
20360 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20370 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
20380 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
20390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
203a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
203b0 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
203c0 70 65 72 2e 53 65 74 56 61 6c 75 65 28 0d 0a 20  per.SetValue(.. 
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 70         subKey, p
203f0 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
20400 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 22  g(VsIdFormat), "
20410 2c 20 31 30 30 30 2c 20 33 22 2c 0d 0a 20 20 20  , 1000, 3",..   
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 20 20 77 68 61 74 49 66 2c 20 76 65 72       whatIf, ver
20440 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20 20 20 20  bose);..        
20450 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20          }....   
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 69               usi
20470 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73 74 72 79  ng (MockRegistry
20480 4b 65 79 20 73 75 62 4b 65 79 20 3d 20 52 65 67  Key subKey = Reg
20490 69 73 74 72 79 48 65 6c 70 65 72 2e 4f 70 65 6e  istryHelper.Open
204a0 53 75 62 4b 65 79 28 0d 0a 20 20 20 20 20 20 20  SubKey(..       
204b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204c0 20 6b 65 79 2c 20 22 53 65 72 76 69 63 65 73 22   key, "Services"
204d0 2c 20 74 72 75 65 2c 20 77 68 61 74 49 66 2c 20  , true, whatIf, 
204e0 76 65 72 62 6f 73 65 29 29 0d 0a 20 20 20 20 20  verbose))..     
204f0 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
20500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20510 20 20 69 66 20 28 73 75 62 4b 65 79 20 3d 3d 20    if (subKey == 
20520 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20 20 20 20  null)..         
20530 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53 74        error = St
20560 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20 20  ring.Format(..  
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 20 20 20 20 20 20 20 22 63 6f 75 6c 64            "could
20590 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67 69 73 74   not open regist
205a0 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c 53 65 72  ry key: {0}\\Ser
205b0 76 69 63 65 73 22 2c 0d 0a 20 20 20 20 20 20 20  vices",..       
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205d0 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20       key);....  
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
20600 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
20610 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67    using (MockReg
20640 69 73 74 72 79 4b 65 79 20 73 65 72 76 69 63 65  istryKey service
20650 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48 65  Key = RegistryHe
20660 6c 70 65 72 2e 43 72 65 61 74 65 53 75 62 4b 65  lper.CreateSubKe
20670 79 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y(..            
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 73 75 62 4b 65 79 2c 20 73 65 72 76 69 63 65 49  subKey, serviceI
206a0 64 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46  d.ToString(VsIdF
206b0 6f 72 6d 61 74 29 2c 20 77 68 61 74 49 66 2c 0d  ormat), whatIf,.
206c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65 72               ver
206e0 62 6f 73 65 29 29 0d 0a 20 20 20 20 20 20 20 20  bose))..        
206f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20710 20 20 20 20 20 20 20 69 66 20 28 73 65 72 76 69         if (servi
20720 63 65 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a  ceKey == null)..
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
20750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20760 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
20770 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
207a0 63 6f 75 6c 64 20 6e 6f 74 20 63 72 65 61 74 65  could not create
207b0 20 72 65 67 69 73 74 72 79 20 6b 65 79 3a 20 7b   registry key: {
207c0 30 7d 5c 5c 7b 31 7d 22 2c 0d 0a 20 20 20 20 20  0}\\{1}",..     
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20             key, 
207f0 73 65 72 76 69 63 65 49 64 2e 54 6f 53 74 72 69  serviceId.ToStri
20800 6e 67 28 56 73 49 64 46 6f 72 6d 61 74 29 29 3b  ng(VsIdFormat));
20810 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ....            
20820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20830 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20         }....    
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c 70      RegistryHelp
20880 65 72 2e 53 65 74 56 61 6c 75 65 28 73 65 72 76  er.SetValue(serv
20890 69 63 65 4b 65 79 2c 20 6e 75 6c 6c 2c 0d 0a 20  iceKey, null,.. 
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 70 61 63 6b 61             packa
208c0 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73  geId.ToString(Vs
208d0 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74 49  IdFormat), whatI
208e0 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 0d 0a  f, verbose);....
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20900 20 20 20 20 20 20 20 20 52 65 67 69 73 74 72 79          Registry
20910 48 65 6c 70 65 72 2e 53 65 74 56 61 6c 75 65 28  Helper.SetValue(
20920 73 65 72 76 69 63 65 4b 65 79 2c 20 22 4e 61 6d  serviceKey, "Nam
20930 65 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e",..           
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 22   String.Format("
20960 7b 30 7d 20 44 65 73 69 67 6e 65 72 20 53 65 72  {0} Designer Ser
20970 76 69 63 65 22 2c 20 50 72 6f 6a 65 63 74 4e 61  vice", ProjectNa
20980 6d 65 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  me),..          
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73    whatIf, verbos
209b0 65 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e);..           
209c0 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20           }..    
209d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
209e0 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
209f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
20a00 72 6e 20 74 72 75 65 3b 0d 0a 20 20 20 20 20 20  rn true;..      
20a10 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f    }....        /
20a20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20a30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20a40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20a50 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20a60 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20  //////....      
20a70 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
20a80 20 62 6f 6f 6c 20 52 65 6d 6f 76 65 56 73 50 61   bool RemoveVsPa
20a90 63 6b 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20  ckage(..        
20aa0 20 20 20 20 52 65 67 69 73 74 72 79 4b 65 79 20      RegistryKey 
20ab0 72 6f 6f 74 4b 65 79 2c 0d 0a 20 20 20 20 20 20  rootKey,..      
20ac0 20 20 20 20 20 20 56 65 72 73 69 6f 6e 20 76 73        Version vs
20ad0 56 65 72 73 69 6f 6e 2c 0d 0a 20 20 20 20 20 20  Version,..      
20ae0 20 20 20 20 20 20 47 75 69 64 20 70 61 63 6b 61        Guid packa
20af0 67 65 49 64 2c 0d 0a 20 20 20 20 20 20 20 20 20  geId,..         
20b00 20 20 20 47 75 69 64 20 73 65 72 76 69 63 65 49     Guid serviceI
20b10 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
20b20 62 6f 6f 6c 20 77 68 61 74 49 66 2c 0d 0a 20 20  bool whatIf,..  
20b30 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 76            bool v
20b40 65 72 62 6f 73 65 2c 0d 0a 20 20 20 20 20 20 20  erbose,..       
20b50 20 20 20 20 20 72 65 66 20 73 74 72 69 6e 67 20       ref string 
20b60 65 72 72 6f 72 0d 0a 20 20 20 20 20 20 20 20 20  error..         
20b70 20 20 20 29 0d 0a 20 20 20 20 20 20 20 20 7b 0d     )..        {.
20b80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
20b90 69 6e 67 20 6b 65 79 4e 61 6d 65 20 3d 20 47 65  ing keyName = Ge
20ba0 74 56 73 4b 65 79 4e 61 6d 65 28 76 73 56 65 72  tVsKeyName(vsVer
20bb0 73 69 6f 6e 29 3b 0d 0a 0d 0a 20 20 20 20 20 20  sion);....      
20bc0 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f 63        using (Moc
20bd0 6b 52 65 67 69 73 74 72 79 4b 65 79 20 6b 65 79  kRegistryKey key
20be0 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
20bf0 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20  r.OpenSubKey(.. 
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 20 72 6f 6f 74 4b 65 79 2c 20 6b 65 79 4e     rootKey, keyN
20c20 61 6d 65 2c 20 66 61 6c 73 65 2c 20 77 68 61 74  ame, false, what
20c30 49 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20  If, verbose)).. 
20c40 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20             {..  
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
20c60 20 28 6b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d 0a   (key == null)..
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
20c90 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 53         error = S
20ca0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f         "could no
20cd0 74 20 6f 70 65 6e 20 72 65 67 69 73 74 72 79 20  t open registry 
20ce0 6b 65 79 3a 20 7b 30 7d 5c 5c 7b 31 7d 22 2c 0d  key: {0}\\{1}",.
20cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20d00 20 20 20 20 20 20 20 20 20 72 6f 6f 74 4b 65 79           rootKey
20d10 2c 20 6b 65 79 4e 61 6d 65 29 3b 0d 0a 0d 0a 20  , keyName);.... 
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
20d40 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
20d50 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
20d60 20 20 20 20 20 20 20 75 73 69 6e 67 20 28 4d 6f         using (Mo
20d70 63 6b 52 65 67 69 73 74 72 79 4b 65 79 20 73 75  ckRegistryKey su
20d80 62 4b 65 79 20 3d 20 52 65 67 69 73 74 72 79 48  bKey = RegistryH
20d90 65 6c 70 65 72 2e 4f 70 65 6e 53 75 62 4b 65 79  elper.OpenSubKey
20da0 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
20db0 20 20 20 20 20 20 20 20 20 20 20 6b 65 79 2c 20             key, 
20dc0 22 50 61 63 6b 61 67 65 73 22 2c 20 74 72 75 65  "Packages", true
20dd0 2c 20 77 68 61 74 49 66 2c 20 76 65 72 62 6f 73  , whatIf, verbos
20de0 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  e))..           
20df0 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20e00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
20e10 73 75 62 4b 65 79 20 3d 3d 20 6e 75 6c 6c 29 0d  subKey == null).
20e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e30 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 65 72 72 6f 72 20 3d 20 53 74 72 69 6e 67 2e 46  error = String.F
20e60 6f 72 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20  ormat(..        
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 20 22 63 6f 75 6c 64 20 6e 6f 74 20 6f      "could not o
20e90 70 65 6e 20 72 65 67 69 73 74 72 79 20 6b 65 79  pen registry key
20ea0 3a 20 7b 30 7d 5c 5c 50 61 63 6b 61 67 65 73 22  : {0}\\Packages"
20eb0 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
20ed0 65 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ey);....        
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20  return false;.. 
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20     }....        
20f20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
20f30 73 74 72 79 48 65 6c 70 65 72 2e 44 65 6c 65 74  stryHelper.Delet
20f40 65 53 75 62 4b 65 79 54 72 65 65 28 0d 0a 20 20  eSubKeyTree(..  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 6b 65 79 2c 20 70 61 63 6b 61        key, packa
20f70 67 65 49 64 2e 54 6f 53 74 72 69 6e 67 28 56 73  geId.ToString(Vs
20f80 49 64 46 6f 72 6d 61 74 29 2c 20 77 68 61 74 49  IdFormat), whatI
20f90 66 2c 20 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20  f, verbose);..  
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
20fb0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
20fc0 20 20 20 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65     using (MockRe
20fd0 67 69 73 74 72 79 4b 65 79 20 73 75 62 4b 65 79  gistryKey subKey
20fe0 20 3d 20 52 65 67 69 73 74 72 79 48 65 6c 70 65   = RegistryHelpe
20ff0 72 2e 4f 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20  r.OpenSubKey(.. 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 6b 65 79 2c 20 22 4d 65 6e         key, "Men
21020 75 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74 49  us", true, whatI
21030 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
21050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21060 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79 20       if (subKey 
21070 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
21090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210a0 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
210b0 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
210c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210d0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
210e0 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
210f0 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
21100 4d 65 6e 75 73 22 2c 0d 0a 20 20 20 20 20 20 20  Menus",..       
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d 0a 20 20       key);....  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c        return fal
21150 73 65 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20  se;..           
21160 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20           }....  
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72    RegistryHelper
21190 2e 44 65 6c 65 74 65 56 61 6c 75 65 28 0d 0a 20  .DeleteValue(.. 
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 20 20 20 20 20 20 73 75 62 4b 65 79 2c 20 70         subKey, p
211c0 61 63 6b 61 67 65 49 64 2e 54 6f 53 74 72 69 6e  ackageId.ToStrin
211d0 67 28 56 73 49 64 46 6f 72 6d 61 74 29 2c 20 77  g(VsIdFormat), w
211e0 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21200 76 65 72 62 6f 73 65 29 3b 0d 0a 20 20 20 20 20  verbose);..     
21210 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a             }....
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 75 73 69 6e 67 20 28 4d 6f 63 6b 52 65 67 69 73  using (MockRegis
21240 74 72 79 4b 65 79 20 73 75 62 4b 65 79 20 3d 20  tryKey subKey = 
21250 52 65 67 69 73 74 72 79 48 65 6c 70 65 72 2e 4f  RegistryHelper.O
21260 70 65 6e 53 75 62 4b 65 79 28 0d 0a 20 20 20 20  penSubKey(..    
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 20 6b 65 79 2c 20 22 53 65 72 76 69 63      key, "Servic
21290 65 73 22 2c 20 74 72 75 65 2c 20 77 68 61 74 49  es", true, whatI
212a0 66 2c 20 76 65 72 62 6f 73 65 29 29 0d 0a 20 20  f, verbose))..  
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
212c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
212d0 20 20 20 20 20 69 66 20 28 73 75 62 4b 65 79 20       if (subKey 
212e0 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20 20  == null)..      
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
21300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21310 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20 3d           error =
21320 20 53 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d   String.Format(.
21330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
21350 75 6c 64 20 6e 6f 74 20 6f 70 65 6e 20 72 65 67  uld not open reg
21360 69 73 74 72 79 20 6b 65 79 3a 20 7b 30 7d 5c 5c  istry key: {0}\\
21370 53 65 72 76 69 63 65 73 22 2c 0d 0a 20 20 20 20  Services",..    
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 20 20 20 20 20 20 20 20 6b 65 79 29 3b 0d 0a 0d          key);...
213a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
213b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
213c0 66 61 6c 73 65 3b 0d 0a 20 20 20 20 20 20 20 20  false;..        
213d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d              }...
213e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
213f0 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
21400 70 65 72 2e 44 65 6c 65 74 65 53 75 62 4b 65 79  per.DeleteSubKey
21410 54 72 65 65 28 0d 0a 20 20 20 20 20 20 20 20 20  Tree(..         
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21430 75 62 4b 65 79 2c 20 73 65 72 76 69 63 65 49 64  ubKey, serviceId
21440 2e 54 6f 53 74 72 69 6e 67 28 56 73 49 64 46 6f  .ToString(VsIdFo
21450 72 6d 61 74 29 2c 20 77 68 61 74 49 66 2c 0d 0a  rmat), whatIf,..
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 29          verbose)
21480 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
21490 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
214a0 20 20 7d 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20    }....         
214b0 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0d     return true;.
214c0 0a 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20 20  .        }....  
214d0 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
214e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
214f0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21500 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21510 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d  /////////////...
21520 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65  .        private
21530 20 73 74 61 74 69 63 20 62 6f 6f 6c 20 50 72 6f   static bool Pro
21540 63 65 73 73 56 73 50 61 63 6b 61 67 65 28 0d 0a  cessVsPackage(..
21550 20 20 20 20 20 20 20 20 20 20 20 20 52 65 67 69              Regi
21560 73 74 72 79 4b 65 79 20 72 6f 6f 74 4b 65 79 2c  stryKey rootKey,
21570 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 65  ..            Ve
21580 72 73 69 6f 6e 20 76 73 56 65 72 73 69 6f 6e 2c  rsion vsVersion,
21590 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 47 75  ..            Gu
215a0 69 64 20 70 61 63 6b 61 67 65 49 64 2c 0d 0a 20  id packageId,.. 
215b0 20 20 20 20 20 20 20 20 20 20 20 47 75 69 64 20             Guid 
215c0 73 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20  serviceId,..    
215d0 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74          Guid dat
215e0 61 53 6f 75 72 63 65 49 64 2c 0d 0a 20 20 20 20  aSourceId,..    
215f0 20 20 20 20 20 20 20 20 47 75 69 64 20 64 61 74          Guid dat
21600 61 50 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20  aProviderId,..  
21610 20 20 20 20 20 20 20 20 20 20 6f 62 6a 65 63 74            object
21620 20 63 6c 69 65 6e 74 44 61 74 61 2c 0d 0a 20 20   clientData,..  
21630 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 20 77            bool w
21640 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
21650 20 20 20 20 62 6f 6f 6c 20 76 65 72 62 6f 73 65      bool verbose
21660 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ,..            r
21670 65 66 20 73 74 72 69 6e 67 20 65 72 72 6f 72 0d  ef string error.
21680 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 0d 0a  .            )..
21690 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
216a0 20 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73         AnyPair<s
216b0 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 70 61 69  tring, bool> pai
216c0 72 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 20 61  r = clientData a
216d0 73 20 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67  s AnyPair<string
216e0 2c 20 62 6f 6f 6c 3e 3b 0d 0a 0d 0a 20 20 20 20  , bool>;....    
216f0 20 20 20 20 20 20 20 20 69 66 20 28 70 61 69 72          if (pair
21700 20 3d 3d 20 6e 75 6c 6c 29 0d 0a 20 20 20 20 20   == null)..     
21710 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20         {..      
21720 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 20            error 
21730 3d 20 22 69 6e 76 61 6c 69 64 20 56 53 20 63 61  = "invalid VS ca
21740 6c 6c 62 61 63 6b 20 64 61 74 61 22 3b 0d 0a 20  llback data";.. 
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
21760 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 20 20  eturn false;..  
21770 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21780 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 70             if (p
21790 61 69 72 2e 59 29 0d 0a 20 20 20 20 20 20 20 20  air.Y)..        
217a0 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
217b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 41 64         return Ad
217c0 64 56 73 50 61 63 6b 61 67 65 28 0d 0a 20 20 20  dVsPackage(..   
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65 72 73   rootKey, vsVers
217f0 69 6f 6e 2c 20 70 61 63 6b 61 67 65 49 64 2c 20  ion, packageId, 
21800 73 65 72 76 69 63 65 49 64 2c 20 70 61 69 72 2e  serviceId, pair.
21810 58 2c 20 77 68 61 74 49 66 2c 0d 0a 20 20 20 20  X, whatIf,..    
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 76 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72  verbose, ref err
21840 6f 72 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  or);..          
21850 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
21860 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20 20   else..         
21870 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
21880 20 20 20 20 20 20 72 65 74 75 72 6e 20 52 65 6d        return Rem
21890 6f 76 65 56 73 50 61 63 6b 61 67 65 28 0d 0a 20  oveVsPackage(.. 
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 72 6f 6f 74 4b 65 79 2c 20 76 73 56 65     rootKey, vsVe
218c0 72 73 69 6f 6e 2c 20 70 61 63 6b 61 67 65 49 64  rsion, packageId
218d0 2c 20 73 65 72 76 69 63 65 49 64 2c 20 77 68 61  , serviceId, wha
218e0 74 49 66 2c 20 76 65 72 62 6f 73 65 2c 0d 0a 20  tIf, verbose,.. 
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 72 65 66 20 65 72 72 6f 72 29 3b 0d 0a     ref error);..
21910 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
21920 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21930 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a 20 20    #endregion..  
21940 20 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e        #endregion
21950 0d 0a 0d 0a 20 20 20 20 20 20 20 20 2f 2f 2f 2f  ....        ////
21960 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21980 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21990 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
219a0 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 23  ///....        #
219b0 72 65 67 69 6f 6e 20 41 70 70 6c 69 63 61 74 69  region Applicati
219c0 6f 6e 20 45 6e 74 72 79 20 50 6f 69 6e 74 0d 0a  on Entry Point..
219d0 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
219e0 73 74 61 74 69 63 20 69 6e 74 20 4d 61 69 6e 28  static int Main(
219f0 73 74 72 69 6e 67 5b 5d 20 61 72 67 73 29 0d 0a  string[] args)..
21a00 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20          {..     
21a10 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72 61         Configura
21a20 74 69 6f 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  tion configurati
21a30 6f 6e 20 3d 20 6e 75 6c 6c 3b 0d 0a 20 20 20 20  on = null;..    
21a40 20 20 20 20 20 20 20 20 73 74 72 69 6e 67 20 65          string e
21a50 72 72 6f 72 20 3d 20 6e 75 6c 6c 3b 0d 0a 0d 0a  rror = null;....
21a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f              ////
21a70 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21a80 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21a90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21aa0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d  ///////////////.
21ab0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  ...            #
21ac0 72 65 67 69 6f 6e 20 43 6f 6d 6d 61 6e 64 20 4c  region Command L
21ad0 69 6e 65 20 50 72 6f 63 65 73 73 69 6e 67 0d 0a  ine Processing..
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
21af0 21 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 46  !Configuration.F
21b00 72 6f 6d 41 72 67 73 28 0d 0a 20 20 20 20 20 20  romArgs(..      
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72                ar
21b20 67 73 2c 20 74 72 75 65 2c 20 72 65 66 20 63 6f  gs, true, ref co
21b30 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20 72 65 66  nfiguration, ref
21b40 20 65 72 72 6f 72 29 20 7c 7c 0d 0a 20 20 20 20   error) ||..    
21b50 20 20 20 20 20 20 20 20 20 20 20 20 21 43 6f 6e              !Con
21b60 66 69 67 75 72 61 74 69 6f 6e 2e 50 72 6f 63 65  figuration.Proce
21b70 73 73 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ss(..           
21b80 20 20 20 20 20 20 20 20 20 61 72 67 73 2c 20 63           args, c
21b90 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2c 20 74 72  onfiguration, tr
21ba0 75 65 2c 20 72 65 66 20 65 72 72 6f 72 29 29 0d  ue, ref error)).
21bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a  .            {..
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 54 72 61 63 65 4f 70 73 2e 53 68 6f 77 4d 65 73  TraceOps.ShowMes
21be0 73 61 67 65 28 0d 0a 20 20 20 20 20 20 20 20 20  sage(..         
21bf0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
21c00 43 61 6c 6c 62 61 63 6b 2c 20 74 68 69 73 41 73  Callback, thisAs
21c10 73 65 6d 62 6c 79 2c 20 65 72 72 6f 72 2c 20 74  sembly, error, t
21c20 72 61 63 65 43 61 74 65 67 6f 72 79 2c 0d 0a 20  raceCategory,.. 
21c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c40 20 20 20 4d 65 73 73 61 67 65 42 6f 78 42 75 74     MessageBoxBut
21c50 74 6f 6e 73 2e 4f 4b 2c 20 4d 65 73 73 61 67 65  tons.OK, Message
21c60 42 6f 78 49 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d  BoxIcon.Error);.
21c70 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ...             
21c80 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
21c90 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 0d 0a 20            }.... 
21ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 2f 2f 2f             /////
21cb0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21cc0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21cd0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21ce0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a  //////////////..
21cf0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  ..            In
21d00 69 74 69 61 6c 69 7a 65 41 6c 6c 46 72 61 6d 65  itializeAllFrame
21d10 77 6f 72 6b 73 28 63 6f 6e 66 69 67 75 72 61 74  works(configurat
21d20 69 6f 6e 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ion);..         
21d30 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 41 6c 6c     InitializeAll
21d40 56 73 56 65 72 73 69 6f 6e 73 28 63 6f 6e 66 69  VsVersions(confi
21d50 67 75 72 61 74 69 6f 6e 29 3b 0d 0a 20 20 20 20  guration);..    
21d60 20 20 20 20 20 20 20 20 23 65 6e 64 72 65 67 69          #endregi
21d70 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  on....          
21d80 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f    //////////////
21d90 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21da0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21db0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21dc0 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20  /////....       
21dd0 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73 74 72       AnyPair<str
21de0 69 6e 67 2c 20 62 6f 6f 6c 3e 20 64 69 72 65 63  ing, bool> direc
21df0 74 6f 72 79 50 61 69 72 20 3d 20 6e 65 77 20 41  toryPair = new A
21e00 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20 62  nyPair<string, b
21e10 6f 6f 6c 3e 28 0d 0a 20 20 20 20 20 20 20 20 20  ool>(..         
21e20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 61         configura
21e30 74 69 6f 6e 2e 44 69 72 65 63 74 6f 72 79 2c 20  tion.Directory, 
21e40 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 49 6e  configuration.In
21e50 73 74 61 6c 6c 29 3b 0d 0a 0d 0a 20 20 20 20 20  stall);....     
21e60 20 20 20 20 20 20 20 41 6e 79 50 61 69 72 3c 73         AnyPair<s
21e70 74 72 69 6e 67 2c 20 62 6f 6f 6c 3e 20 66 69 6c  tring, bool> fil
21e80 65 4e 61 6d 65 50 61 69 72 20 3d 20 6e 65 77 20  eNamePair = new 
21e90 41 6e 79 50 61 69 72 3c 73 74 72 69 6e 67 2c 20  AnyPair<string, 
21ea0 62 6f 6f 6c 3e 28 0d 0a 20 20 20 20 20 20 20 20  bool>(..        
21eb0 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72          configur
21ec0 61 74 69 6f 6e 2e 44 65 73 69 67 6e 65 72 46 69  ation.DesignerFi
21ed0 6c 65 4e 61 6d 65 2c 20 63 6f 6e 66 69 67 75 72  leName, configur
21ee0 61 74 69 6f 6e 2e 49 6e 73 74 61 6c 6c 29 3b 0d  ation.Install);.
21ef0 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
21f00 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21f10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21f20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21f30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
21f40 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
21f50 20 20 23 72 65 67 69 6f 6e 20 2e 4e 45 54 20 47    #region .NET G
21f60 41 43 20 49 6e 73 74 61 6c 6c 2f 52 65 6d 6f 76  AC Install/Remov
21f70 65 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e..            i
21f80 66 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  f (configuration
21f90 2e 48 61 73 46 6c 61 67 73 28 49 6e 73 74 61 6c  .HasFlags(Instal
21fa0 6c 46 6c 61 67 73 2e 47 41 43 2c 20 74 72 75 65  lFlags.GAC, true
21fb0 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
21fc0 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
21fd0 20 20 20 50 75 62 6c 69 73 68 20 70 75 62 6c 69     Publish publi
21fe0 73 68 20 3d 20 6e 65 77 20 50 75 62 6c 69 73 68  sh = new Publish
21ff0 28 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  ();....         
22000 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 66 69         if (confi
22010 67 75 72 61 74 69 6f 6e 2e 49 6e 73 74 61 6c 6c  guration.Install
22020 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
22030 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
22040 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 63            if (!c
22050 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68 61  onfiguration.Wha
22060 74 49 66 29 0d 0a 20 20 20 20 20 20 20 20 20 20  tIf)..          
22070 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 70 75 62 6c 69 73 68 2e 47 61 63       publish.Gac
220a0 49 6e 73 74 61 6c 6c 28 63 6f 6e 66 69 67 75 72  Install(configur
220b0 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e 61  ation.CoreFileNa
220c0 6d 65 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f  me); /* throw */
220d0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
220e0 20 20 20 20 20 20 20 20 20 20 70 75 62 6c 69 73            publis
220f0 68 2e 47 61 63 49 6e 73 74 61 6c 6c 28 63 6f 6e  h.GacInstall(con
22100 66 69 67 75 72 61 74 69 6f 6e 2e 4c 69 6e 71 46  figuration.LinqF
22110 69 6c 65 4e 61 6d 65 29 3b 20 2f 2a 20 74 68 72  ileName); /* thr
22120 6f 77 20 2a 2f 0d 0a 20 20 20 20 20 20 20 20 20  ow */..         
22130 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 65 6c 73 65 0d 0a 20 20 20 20 20 20 20 20    else..        
22160 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20              {.. 
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
22190 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
221a0 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
221b0 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 22 47 61 63 49 6e 73 74 61 6c 6c 3a 20 61 73   "GacInstall: as
221e0 73 65 6d 62 6c 79 50 61 74 68 20 3d 20 7b 30 7d  semblyPath = {0}
221f0 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ",..            
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 43 6f  configuration.Co
22220 72 65 46 69 6c 65 4e 61 6d 65 29 2c 20 74 72 61  reFileName), tra
22230 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 0d 0a  ceCategory);....
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73          TraceOps
22260 2e 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c  .Trace(traceCall
22270 62 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72  back, String.For
22280 6d 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20  mat(..          
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 22 47 61 63 49 6e 73 74 61 6c 6c 3a 20 61    "GacInstall: a
222b0 73 73 65 6d 62 6c 79 50 61 74 68 20 3d 20 7b 30  ssemblyPath = {0
222c0 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  }",..           
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 4c   configuration.L
222f0 69 6e 71 46 69 6c 65 4e 61 6d 65 29 2c 20 74 72  inqFileName), tr
22300 61 63 65 43 61 74 65 67 6f 72 79 29 3b 0d 0a 20  aceCategory);.. 
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20 20 20     }..          
22330 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22340 20 20 20 20 20 20 20 20 20 65 6c 73 65 0d 0a 20           else.. 
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
22360 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22370 20 20 20 20 20 20 69 66 20 28 21 63 6f 6e 66 69        if (!confi
22380 67 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 29  guration.WhatIf)
22390 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
223a0 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 70 75 62 6c 69 73 68 2e 47 61 63 52 65 6d 6f   publish.GacRemo
223d0 76 65 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ve(configuration
223e0 2e 4c 69 6e 71 46 69 6c 65 4e 61 6d 65 29 3b 20  .LinqFileName); 
223f0 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d 0a 20 20 20  /* throw */..   
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22410 20 20 20 20 20 70 75 62 6c 69 73 68 2e 47 61 63       publish.Gac
22420 52 65 6d 6f 76 65 28 63 6f 6e 66 69 67 75 72 61  Remove(configura
22430 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e 61 6d  tion.CoreFileNam
22440 65 29 3b 20 2f 2a 20 74 68 72 6f 77 20 2a 2f 0d  e); /* throw */.
22450 0a 20 20 20 20 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 20 20 20 20 20 20 20 20 65 6c 73 65              else
22480 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22490 20 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20        {..       
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
224c0 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
224d0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224f0 20 20 20 20 20 20 20 20 20 20 20 22 47 61 63 52             "GacR
22500 65 6d 6f 76 65 3a 20 61 73 73 65 6d 62 6c 79 50  emove: assemblyP
22510 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20  ath = {0}",..   
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
22540 72 61 74 69 6f 6e 2e 4c 69 6e 71 46 69 6c 65 4e  ration.LinqFileN
22550 61 6d 65 29 2c 20 74 72 61 63 65 43 61 74 65 67  ame), traceCateg
22560 6f 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20  ory);....       
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 54 72 61 63 65 4f 70 73 2e 54 72 61 63 65 28   TraceOps.Trace(
22590 74 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 53  traceCallback, S
225a0 74 72 69 6e 67 2e 46 6f 72 6d 61 74 28 0d 0a 20  tring.Format(.. 
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 20 20 20 20 20 20 20 20 22 47 61 63 52             "GacR
225d0 65 6d 6f 76 65 3a 20 61 73 73 65 6d 62 6c 79 50  emove: assemblyP
225e0 61 74 68 20 3d 20 7b 30 7d 22 2c 0d 0a 20 20 20  ath = {0}",..   
225f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22600 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
22610 72 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c 65 4e  ration.CoreFileN
22620 61 6d 65 29 2c 20 74 72 61 63 65 43 61 74 65 67  ame), traceCateg
22630 6f 72 79 29 3b 0d 0a 20 20 20 20 20 20 20 20 20  ory);..         
22640 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
22660 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
22670 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
22680 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
22690 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
226a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
226b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
226c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
226d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
226e0 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e           #region
226f0 20 2e 4e 45 54 20 41 73 73 65 6d 62 6c 79 46 6f   .NET AssemblyFo
22700 6c 64 65 72 73 0d 0a 20 20 20 20 20 20 20 20 20  lders..         
22710 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61     if (configura
22720 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49 6e  tion.HasFlags(In
22730 73 74 61 6c 6c 46 6c 61 67 73 2e 41 73 73 65 6d  stallFlags.Assem
22740 62 6c 79 46 6f 6c 64 65 72 73 2c 20 74 72 75 65  blyFolders, true
22750 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
22760 7b 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {..             
22770 20 20 20 69 66 20 28 21 46 6f 72 45 61 63 68 46     if (!ForEachF
22780 72 61 6d 65 77 6f 72 6b 52 65 67 69 73 74 72 79  rameworkRegistry
22790 28 50 72 6f 63 65 73 73 41 73 73 65 6d 62 6c 79  (ProcessAssembly
227a0 46 6f 6c 64 65 72 73 2c 0d 0a 20 20 20 20 20 20  Folders,..      
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 64 69 72 65 63 74 6f 72 79 50 61 69 72 2c    directoryPair,
227d0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57   configuration.W
227e0 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20  hatIf,..        
227f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22800 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 56 65  configuration.Ve
22810 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72  rbose, ref error
22820 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))..            
22830 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20      {..         
22840 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65             Trace
22850 4f 70 73 2e 53 68 6f 77 4d 65 73 73 61 67 65 28  Ops.ShowMessage(
22860 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
22870 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43            traceC
22880 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 65  allback, null, e
22890 72 72 6f 72 2c 20 74 72 61 63 65 43 61 74 65 67  rror, traceCateg
228a0 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  ory,..          
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 65                Me
228c0 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e  ssageBoxButtons.
228d0 4f 4b 2c 20 4d 65 73 73 61 67 65 42 6f 78 49 63  OK, MessageBoxIc
228e0 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20  on.Error);....  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20    return 1;..   
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a               }..
22920 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
22930 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72             #endr
22940 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20  egion....       
22950 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f       ///////////
22960 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22970 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22980 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22990 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20  ////////....    
229a0 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e 20          #region 
229b0 2e 4e 45 54 20 44 62 50 72 6f 76 69 64 65 72 46  .NET DbProviderF
229c0 61 63 74 6f 72 79 0d 0a 20 20 20 20 20 20 20 20  actory..        
229d0 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72      if (configur
229e0 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49  ation.HasFlags(I
229f0 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 44 62 50 72  nstallFlags.DbPr
22a00 6f 76 69 64 65 72 46 61 63 74 6f 72 79 2c 20 74  oviderFactory, t
22a10 72 75 65 29 29 0d 0a 20 20 20 20 20 20 20 20 20  rue))..         
22a20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
22a30 20 20 20 20 20 20 62 6f 6f 6c 20 73 61 76 65 64        bool saved
22a40 20 3d 20 66 61 6c 73 65 3b 0d 0a 0d 0a 20 20 20   = false;....   
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
22a60 28 21 46 6f 72 45 61 63 68 46 72 61 6d 65 77 6f  (!ForEachFramewo
22a70 72 6b 43 6f 6e 66 69 67 28 50 72 6f 63 65 73 73  rkConfig(Process
22a80 44 62 50 72 6f 76 69 64 65 72 46 61 63 74 6f 72  DbProviderFactor
22a90 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  y,..            
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 76 61              Inva
22ab0 72 69 61 6e 74 4e 61 6d 65 2c 20 50 72 6f 76 69  riantName, Provi
22ac0 64 65 72 4e 61 6d 65 2c 20 44 65 73 63 72 69 70  derName, Descrip
22ad0 74 69 6f 6e 2c 0d 0a 20 20 20 20 20 20 20 20 20  tion,..         
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
22af0 61 63 74 6f 72 79 54 79 70 65 4e 61 6d 65 2c 20  actoryTypeName, 
22b00 41 73 73 65 6d 62 6c 79 4e 61 6d 65 2e 47 65 74  AssemblyName.Get
22b10 41 73 73 65 6d 62 6c 79 4e 61 6d 65 28 0d 0a 20  AssemblyName(.. 
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69             confi
22b40 67 75 72 61 74 69 6f 6e 2e 43 6f 72 65 46 69 6c  guration.CoreFil
22b50 65 4e 61 6d 65 29 2c 20 64 69 72 65 63 74 6f 72  eName), director
22b60 79 50 61 69 72 2c 0d 0a 20 20 20 20 20 20 20 20  yPair,..        
22b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b80 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68  configuration.Wh
22b90 61 74 49 66 2c 20 63 6f 6e 66 69 67 75 72 61 74  atIf, configurat
22ba0 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 0d 0a 20 20  ion.Verbose,..  
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bc0 20 20 20 20 20 20 72 65 66 20 73 61 76 65 64 2c        ref saved,
22bd0 20 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20   ref error))..  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d                {.
22bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c00 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68       TraceOps.Sh
22c10 6f 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20  owMessage(..    
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63      traceCallbac
22c40 6b 2c 20 6e 75 6c 6c 2c 20 65 72 72 6f 72 2c 20  k, null, error, 
22c50 74 72 61 63 65 43 61 74 65 67 6f 72 79 2c 0d 0a  traceCategory,..
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42          MessageB
22c80 6f 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 20 4d 65  oxButtons.OK, Me
22c90 73 73 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72 72  ssageBoxIcon.Err
22ca0 6f 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  or);....        
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
22cc0 72 6e 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20  rn 1;..         
22cd0 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
22ce0 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
22cf0 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
22d00 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ...            /
22d10 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d30 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d40 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
22d50 2f 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20  //....          
22d60 20 20 23 72 65 67 69 6f 6e 20 56 53 20 50 61 63    #region VS Pac
22d70 6b 61 67 65 0d 0a 20 20 20 20 20 20 20 20 20 20  kage..          
22d80 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72 61 74    if (configurat
22d90 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49 6e 73  ion.HasFlags(Ins
22da0 74 61 6c 6c 46 6c 61 67 73 2e 56 73 50 61 63 6b  tallFlags.VsPack
22db0 61 67 65 2c 20 74 72 75 65 29 29 0d 0a 20 20 20  age, true))..   
22dc0 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20 20           {..    
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
22de0 21 46 6f 72 45 61 63 68 56 73 56 65 72 73 69 6f  !ForEachVsVersio
22df0 6e 52 65 67 69 73 74 72 79 28 50 72 6f 63 65 73  nRegistry(Proces
22e00 73 56 73 50 61 63 6b 61 67 65 2c 0d 0a 20 20 20  sVsPackage,..   
22e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e20 20 20 20 20 20 28 47 75 69 64 29 76 73 50 61 63       (Guid)vsPac
22e30 6b 61 67 65 49 64 2c 20 28 47 75 69 64 29 76 73  kageId, (Guid)vs
22e40 53 65 72 76 69 63 65 49 64 2c 0d 0a 20 20 20 20  ServiceId,..    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 20 20 28 47 75 69 64 29 76 73 44 61 74 61      (Guid)vsData
22e70 53 6f 75 72 63 65 73 49 64 2c 20 28 47 75 69 64  SourcesId, (Guid
22e80 29 76 73 44 61 74 61 50 72 6f 76 69 64 65 72 49  )vsDataProviderI
22e90 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
22eb0 4e 61 6d 65 50 61 69 72 2c 20 63 6f 6e 66 69 67  NamePair, config
22ec0 75 72 61 74 69 6f 6e 2e 57 68 61 74 49 66 2c 0d  uration.WhatIf,.
22ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ee0 20 20 20 20 20 20 20 20 20 63 6f 6e 66 69 67 75           configu
22ef0 72 61 74 69 6f 6e 2e 56 65 72 62 6f 73 65 2c 20  ration.Verbose, 
22f00 72 65 66 20 65 72 72 6f 72 29 29 0d 0a 20 20 20  ref error))..   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d 0a               {..
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 54 72 61 63 65 4f 70 73 2e 53 68 6f      TraceOps.Sho
22f40 77 4d 65 73 73 61 67 65 28 0d 0a 20 20 20 20 20  wMessage(..     
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 74 72 61 63 65 43 61 6c 6c 62 61 63 6b     traceCallback
22f70 2c 20 6e 75 6c 6c 2c 20 65 72 72 6f 72 2c 20 74  , null, error, t
22f80 72 61 63 65 43 61 74 65 67 6f 72 79 2c 0d 0a 20  raceCategory,.. 
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 20 20 4d 65 73 73 61 67 65 42 6f         MessageBo
22fb0 78 42 75 74 74 6f 6e 73 2e 4f 4b 2c 20 4d 65 73  xButtons.OK, Mes
22fc0 73 61 67 65 42 6f 78 49 63 6f 6e 2e 45 72 72 6f  sageBoxIcon.Erro
22fd0 72 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20  r);....         
22fe0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22ff0 6e 20 31 3b 0d 0a 20 20 20 20 20 20 20 20 20 20  n 1;..          
23000 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20        }..       
23010 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 20 20       }..        
23020 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d 0a      #endregion..
23030 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
23040 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23050 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23060 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23070 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23080 2f 0d 0a 0d 0a 20 20 20 20 20 20 20 20 20 20 20  /....           
23090 20 23 72 65 67 69 6f 6e 20 56 53 20 44 61 74 61   #region VS Data
230a0 53 6f 75 72 63 65 0d 0a 20 20 20 20 20 20 20 20  Source..        
230b0 20 20 20 20 69 66 20 28 63 6f 6e 66 69 67 75 72      if (configur
230c0 61 74 69 6f 6e 2e 48 61 73 46 6c 61 67 73 28 49  ation.HasFlags(I
230d0 6e 73 74 61 6c 6c 46 6c 61 67 73 2e 56 73 44 61  nstallFlags.VsDa
230e0 74 61 53 6f 75 72 63 65 2c 20 74 72 75 65 29 29  taSource, true))
230f0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 0d  ..            {.
23100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23110 20 69 66 20 28 21 46 6f 72 45 61 63 68 56 73 56   if (!ForEachVsV
23120 65 72 73 69 6f 6e 52 65 67 69 73 74 72 79 28 50  ersionRegistry(P
23130 72 6f 63 65 73 73 56 73 44 61 74 61 53 6f 75 72  rocessVsDataSour
23140 63 65 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ce,..           
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 28 47 75               (Gu
23160 69 64 29 76 73 50 61 63 6b 61 67 65 49 64 2c 20  id)vsPackageId, 
23170 28 47 75 69 64 29 76 73 53 65 72 76 69 63 65 49  (Guid)vsServiceI
23180 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,..            
23190 20 20 20 20 20 20 20 20 20 20 20 20 28 47 75 69              (Gui
231a0 64 29 76 73 44 61 74 61 53 6f 75 72 63 65 73 49  d)vsDataSourcesI
231b0 64 2c 20 28 47 75 69 64 29 76 73 44 61 74 61 50  d, (Guid)vsDataP
231c0 72 6f 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20  roviderId,..    
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231e0 20 20 20 20 66 69 6c 65 4e 61 6d 65 50 61 69 72      fileNamePair
231f0 2c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  , configuration.
23200 57 68 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20  WhatIf,..       
23210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23220 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 56   configuration.V
23230 65 72 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f  erbose, ref erro
23240 72 29 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20  r))..           
23250 20 20 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20       {..        
23260 20 20 20 20 20 20 20 20 20 20 20 20 54 72 61 63              Trac
23270 65 4f 70 73 2e 53 68 6f 77 4d 65 73 73 61 67 65  eOps.ShowMessage
23280 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  (..             
23290 20 20 20 20 20 20 20 20 20 20 20 74 72 61 63 65             trace
232a0 43 61 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20  Callback, null, 
232b0 65 72 72 6f 72 2c 20 74 72 61 63 65 43 61 74 65  error, traceCate
232c0 67 6f 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20  gory,..         
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d                 M
232e0 65 73 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73  essageBoxButtons
232f0 2e 4f 4b 2c 20 4d 65 73 73 61 67 65 42 6f 78 49  .OK, MessageBoxI
23300 63 6f 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20  con.Error);.... 
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20     return 1;..  
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d                }.
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a  .            }..
23350 20 20 20 20 20 20 20 20 20 20 20 20 23 65 6e 64              #end
23360 72 65 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20  region....      
23370 20 20 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f        //////////
23380 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23390 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
233a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
233b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20  /////////....   
233c0 20 20 20 20 20 20 20 20 20 23 72 65 67 69 6f 6e           #region
233d0 20 56 53 20 44 61 74 61 50 72 6f 76 69 64 65 72   VS DataProvider
233e0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ..            if
233f0 20 28 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e   (configuration.
23400 48 61 73 46 6c 61 67 73 28 49 6e 73 74 61 6c 6c  HasFlags(Install
23410 46 6c 61 67 73 2e 56 73 44 61 74 61 50 72 6f 76  Flags.VsDataProv
23420 69 64 65 72 2c 20 74 72 75 65 29 29 0d 0a 20 20  ider, true))..  
23430 20 20 20 20 20 20 20 20 20 20 7b 0d 0a 20 20 20            {..   
23440 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
23450 28 21 46 6f 72 45 61 63 68 56 73 56 65 72 73 69  (!ForEachVsVersi
23460 6f 6e 52 65 67 69 73 74 72 79 28 50 72 6f 63 65  onRegistry(Proce
23470 73 73 56 73 44 61 74 61 50 72 6f 76 69 64 65 72  ssVsDataProvider
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 28 47 75 69 64             (Guid
234a0 29 76 73 50 61 63 6b 61 67 65 49 64 2c 20 28 47  )vsPackageId, (G
234b0 75 69 64 29 76 73 53 65 72 76 69 63 65 49 64 2c  uid)vsServiceId,
234c0 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
234d0 20 20 20 20 20 20 20 20 20 20 28 47 75 69 64 29            (Guid)
234e0 76 73 44 61 74 61 53 6f 75 72 63 65 73 49 64 2c  vsDataSourcesId,
234f0 20 28 47 75 69 64 29 76 73 44 61 74 61 50 72 6f   (Guid)vsDataPro
23500 76 69 64 65 72 49 64 2c 0d 0a 20 20 20 20 20 20  viderId,..      
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 20 20 66 69 6c 65 4e 61 6d 65 50 61 69 72 2c 20    fileNamePair, 
23530 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 57 68  configuration.Wh
23540 61 74 49 66 2c 0d 0a 20 20 20 20 20 20 20 20 20  atIf,..         
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
23560 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 56 65 72  onfiguration.Ver
23570 62 6f 73 65 2c 20 72 65 66 20 65 72 72 6f 72 29  bose, ref error)
23580 29 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
23590 20 20 20 7b 0d 0a 20 20 20 20 20 20 20 20 20 20     {..          
235a0 20 20 20 20 20 20 20 20 20 20 54 72 61 63 65 4f            TraceO
235b0 70 73 2e 53 68 6f 77 4d 65 73 73 61 67 65 28 0d  ps.ShowMessage(.
235c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235d0 20 20 20 20 20 20 20 20 20 74 72 61 63 65 43 61           traceCa
235e0 6c 6c 62 61 63 6b 2c 20 6e 75 6c 6c 2c 20 65 72  llback, null, er
235f0 72 6f 72 2c 20 74 72 61 63 65 43 61 74 65 67 6f  ror, traceCatego
23600 72 79 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ry,..           
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 65 73               Mes
23620 73 61 67 65 42 6f 78 42 75 74 74 6f 6e 73 2e 4f  sageBoxButtons.O
23630 4b 2c 20 4d 65 73 73 61 67 65 42 6f 78 49 63 6f  K, MessageBoxIco
23640 6e 2e 45 72 72 6f 72 29 3b 0d 0a 0d 0a 20 20 20  n.Error);....   
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 20 72 65 74 75 72 6e 20 31 3b 0d 0a 20 20 20 20   return 1;..    
23670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20              }.. 
23680 20 20 20 20 20 20 20 20 20 20 20 7d 0d 0a 20 20             }..  
23690 20 20 20 20 20 20 20 20 20 20 23 65 6e 64 72 65            #endre
236a0 67 69 6f 6e 0d 0a 0d 0a 20 20 20 20 20 20 20 20  gion....        
236b0 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
236c0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
236d0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
236e0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
236f0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
23700 20 20 20 20 20 20 20 54 72 61 63 65 4f 70 73 2e         TraceOps.
23710 54 72 61 63 65 28 74 72 61 63 65 43 61 6c 6c 62  Trace(traceCallb
23720 61 63 6b 2c 20 53 74 72 69 6e 67 2e 46 6f 72 6d  ack, String.Form
23730 61 74 28 0d 0a 20 20 20 20 20 20 20 20 20 20 20  at(..           
23740 20 20 20 20 20 22 73 75 62 4b 65 79 73 43 72 65       "subKeysCre
23750 61 74 65 64 20 3d 20 7b 30 7d 2c 20 73 75 62 4b  ated = {0}, subK
23760 65 79 73 44 65 6c 65 74 65 64 20 3d 20 7b 31 7d  eysDeleted = {1}
23770 2c 20 22 20 2b 0d 0a 20 20 20 20 20 20 20 20 20  , " +..         
23780 20 20 20 20 20 20 20 22 6b 65 79 56 61 6c 75 65         "keyValue
23790 73 53 65 74 20 3d 20 7b 32 7d 2c 20 6b 65 79 56  sSet = {2}, keyV
237a0 61 6c 75 65 73 44 65 6c 65 74 65 64 20 3d 20 7b  aluesDeleted = {
237b0 33 7d 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  3}",..          
237c0 20 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65        RegistryHe
237d0 6c 70 65 72 2e 53 75 62 4b 65 79 73 43 72 65 61  lper.SubKeysCrea
237e0 74 65 64 2c 20 52 65 67 69 73 74 72 79 48 65 6c  ted, RegistryHel
237f0 70 65 72 2e 53 75 62 4b 65 79 73 44 65 6c 65 74  per.SubKeysDelet
23800 65 64 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  ed,..           
23810 20 20 20 20 20 52 65 67 69 73 74 72 79 48 65 6c       RegistryHel
23820 70 65 72 2e 4b 65 79 56 61 6c 75 65 73 53 65 74  per.KeyValuesSet
23830 2c 20 52 65 67 69 73 74 72 79 48 65 6c 70 65 72  , RegistryHelper
23840 2e 4b 65 79 56 61 6c 75 65 73 44 65 6c 65 74 65  .KeyValuesDelete
23850 64 29 2c 0d 0a 20 20 20 20 20 20 20 20 20 20 20  d),..           
23860 20 20 20 20 20 74 72 61 63 65 43 61 74 65 67 6f       traceCatego
23870 72 79 29 3b 0d 0a 0d 0a 20 20 20 20 20 20 20 20  ry);....        
23880 20 20 20 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f      ////////////
23890 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
238a0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
238b0 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
238c0 2f 2f 2f 2f 2f 2f 2f 0d 0a 0d 0a 20 20 20 20 20  ///////....     
238d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
238e0 0d 0a 20 20 20 20 20 20 20 20 7d 0d 0a 20 20 20  ..        }..   
238f0 20 20 20 20 20 23 65 6e 64 72 65 67 69 6f 6e 0d       #endregion.
23900 0a 20 20 20 20 7d 0d 0a 20 20 20 20 23 65 6e 64  .    }..    #end
23910 72 65 67 69 6f 6e 0d 0a 7d 0d 0a                 region..}..