Index: SQLite.NET.2008.MSBuild.sln ================================================================== --- SQLite.NET.2008.MSBuild.sln +++ SQLite.NET.2008.MSBuild.sln @@ -20,10 +20,12 @@ {AC139952-261A-4463-B6FA-AEBC25284A66} = {AC139952-261A-4463-B6FA-AEBC25284A66} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Data.SQLite.Linq.2008", "System.Data.SQLite.Linq\System.Data.SQLite.Linq.2008.csproj", "{E6BF9F74-58E2-413B-A7CE-EA653ECB728D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLite.Designer.2008", "SQLite.Designer\SQLite.Designer.2008.csproj", "{9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "testlinq.2008", "testlinq\testlinq.2008.csproj", "{9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}" ProjectSection(ProjectDependencies) = postProject {AC139952-261A-4463-B6FA-AEBC25283A66} = {AC139952-261A-4463-B6FA-AEBC25283A66} {E6BF9F74-58E2-413B-A7CE-EA653ECB728D} = {E6BF9F74-58E2-413B-A7CE-EA653ECB728D} EndProjectSection @@ -303,10 +305,56 @@ {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Any CPU.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Mixed Platforms.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Win32.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Win32.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|x64.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Any CPU.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Mixed Platforms.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Win32.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|x64.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Any CPU.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Win32.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|x64.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Any CPU.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Mixed Platforms.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Win32.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|x64.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|x64.ActiveCfg = Release|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Any CPU Index: SQLite.NET.2010.MSBuild.sln ================================================================== --- SQLite.NET.2010.MSBuild.sln +++ SQLite.NET.2010.MSBuild.sln @@ -20,10 +20,12 @@ {AC139952-261A-4463-B6FA-AEBC25284A66} = {AC139952-261A-4463-B6FA-AEBC25284A66} EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Data.SQLite.Linq.2010", "System.Data.SQLite.Linq\System.Data.SQLite.Linq.2010.csproj", "{E6BF9F74-58E2-413B-A7CE-EA653ECB728D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SQLite.Designer.2010", "SQLite.Designer\SQLite.Designer.2010.csproj", "{9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}" +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "testlinq.2010", "testlinq\testlinq.2010.csproj", "{9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}" ProjectSection(ProjectDependencies) = postProject {AC139952-261A-4463-B6FA-AEBC25283A66} = {AC139952-261A-4463-B6FA-AEBC25283A66} {E6BF9F74-58E2-413B-A7CE-EA653ECB728D} = {E6BF9F74-58E2-413B-A7CE-EA653ECB728D} EndProjectSection @@ -261,10 +263,50 @@ {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseManagedOnly|x64.Build.0 = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Any CPU.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Mixed Platforms.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|Win32.ActiveCfg = Release|Any CPU {E6BF9F74-58E2-413B-A7CE-EA653ECB728D}.ReleaseNativeOnly|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|Win32.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Debug|x64.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Any CPU.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Mixed Platforms.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|Win32.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugManagedOnly|x64.Build.0 = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Any CPU.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Mixed Platforms.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|Win32.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.DebugNativeOnly|x64.ActiveCfg = Debug|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Any CPU.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|Win32.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.Release|x64.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Any CPU.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Mixed Platforms.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|Win32.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|x64.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseManagedOnly|x64.Build.0 = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Any CPU.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Mixed Platforms.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|Win32.ActiveCfg = Release|Any CPU + {9B4A5CF6-5BE5-4926-ACC7-B729A8C05198}.ReleaseNativeOnly|x64.ActiveCfg = Release|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU {9D3CF7A6-092A-4B05-B0E4-BEF6944525B3}.Debug|Win32.ActiveCfg = Debug|Any CPU Index: Setup/SQLite.iss ================================================================== --- Setup/SQLite.iss +++ Setup/SQLite.iss @@ -7,13 +7,15 @@ #define BaseConfiguration StringChange(AppConfiguration, "NativeOnly", "") #define GacProcessor StringChange(AppProcessor, "x64", "amd64") #if Pos("NativeOnly", AppConfiguration) == 0 +#define InstallerCondition "Application\Core\MSIL and Application\Designer and Application\Designer\Installer" #define AppVersion GetStringFileInfo("..\bin\" + Year + "\" + AppPlatform + "\" + AppConfiguration + "\System.Data.SQLite.dll", PRODUCT_VERSION) #define OutputConfiguration StringChange(StringChange(AppConfiguration, "Debug", "setup"), "Release", "setup") + "-bundle" #else +#define InstallerCondition "Application\Core\MSIL and Application\Core\" + AppProcessor + " and Application\Designer and Application\Designer\Installer" #define AppVersion GetStringFileInfo("..\bin\" + Year + "\" + BaseConfiguration + "\bin\System.Data.SQLite.dll", PRODUCT_VERSION) #define OutputConfiguration StringChange(StringChange(BaseConfiguration, "Debug", "setup"), "Release", "setup") #endif [Setup] @@ -54,16 +56,20 @@ Name: Application; Description: System.Data.SQLite components.; Types: custom compact full Name: Application\Core; Description: Core components.; Types: custom compact full Name: Application\Core\MSIL; Description: Core managed components.; Types: custom compact full Name: Application\Core\{#AppProcessor}; Description: Core native components.; Types: custom compact full Name: Application\LINQ; Description: LINQ support components.; Types: custom compact full +Name: Application\Designer; Description: Visual Studio designer components.; Types: custom full +Name: Application\Designer\Installer; Description: Visual Studio designer installer components.; Types: custom full Name: Application\Symbols; Description: Debugging symbol components.; Types: custom compact full Name: Application\Documentation; Description: Documentation components.; Types: custom compact full Name: Application\Test; Description: Test components.; Types: custom compact full [Tasks] Components: Application\Core\MSIL Or Application\LINQ; Name: ngen; Description: Generate native images for the assemblies and install the images in the native image cache.; Check: CheckIsNetFx2Setup() or CheckIsNetFx4Setup() +Components: {#InstallerCondition}; Name: vs2008; Description: Install the designer components for Visual Studio 2008.; Check: CheckIsNetFx2Setup() +Components: {#InstallerCondition}; Name: vs2010; Description: Install the designer components for Visual Studio 2010.; Check: CheckIsNetFx4Setup() #if Pos("NativeOnly", AppConfiguration) == 0 Components: Application\Core\MSIL Or Application\LINQ; Name: gac; Description: Install the assemblies into the global assembly cache.; Flags: unchecked; Check: CheckIsNetFx2Setup() or CheckIsNetFx4Setup() #endif @@ -70,12 +76,16 @@ [Run] Components: Application\Core\MSIL; Tasks: ngen; Filename: {code:GetNetFx2InstallRoot|Ngen.exe}; Parameters: "install ""{app}\bin\System.Data.SQLite.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() Components: Application\Core\MSIL; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "install ""{app}\bin\System.Data.SQLite.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() Components: Application\LINQ; Tasks: ngen; Filename: {code:GetNetFx2InstallRoot|Ngen.exe}; Parameters: "install ""{app}\bin\System.Data.SQLite.Linq.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() and CheckForNetFx35(1) Components: Application\LINQ; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "install ""{app}\bin\System.Data.SQLite.Linq.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() +Components: {#InstallerCondition}; Tasks: vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install true -installFlags AllExceptGAC -noCompact true -noNetFx40 true -noVs2010 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() +Components: {#InstallerCondition}; Tasks: vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install true -installFlags AllExceptGAC -noCompact true -noNetFx20 true -noVs2008 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() [UninstallRun] +Components: {#InstallerCondition}; Tasks: vs2010; Filename: {app}\bin\Installer.exe; Parameters: "-install false -installFlags AllExceptGAC -noCompact true -noNetFx20 true -noVs2008 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() +Components: {#InstallerCondition}; Tasks: vs2008; Filename: {app}\bin\Installer.exe; Parameters: "-install false -installFlags AllExceptGAC -noCompact true -noNetFx40 true -noVs2010 true -whatIf false -confirm true"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() Components: Application\LINQ; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "uninstall ""{app}\bin\System.Data.SQLite.Linq.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() Components: Application\LINQ; Tasks: ngen; Filename: {code:GetNetFx2InstallRoot|Ngen.exe}; Parameters: "uninstall ""{app}\bin\System.Data.SQLite.Linq.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() and CheckForNetFx35(1) Components: Application\Core\MSIL; Tasks: ngen; Filename: {code:GetNetFx4InstallRoot|Ngen.exe}; Parameters: "uninstall ""{app}\bin\System.Data.SQLite.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx4Setup() Components: Application\Core\MSIL; Tasks: ngen; Filename: {code:GetNetFx2InstallRoot|Ngen.exe}; Parameters: "uninstall ""{app}\bin\System.Data.SQLite.dll"" /nologo"; Flags: skipifdoesntexist; Check: CheckIsNetFx2Setup() @@ -111,10 +121,14 @@ Components: Application\Core\{#AppProcessor}; Source: ..\bin\{#Year}\{#AppPlatform}\{#AppConfiguration}\SQLite.Interop.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Core\{#AppProcessor} and Application\Symbols; Source: ..\bin\{#Year}\{#AppPlatform}\{#AppConfiguration}\SQLite.Interop.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete #endif Components: Application\Documentation; Source: ..\doc\SQLite.NET.chm; DestDir: {app}\doc; Flags: restartreplace uninsrestartdelete +Components: Application\Designer; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\SQLite.Designer.dll; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete +Components: Application\Designer and Application\Symbols; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\SQLite.Designer.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete +Components: Application\Designer\Installer; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\Installer.exe; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete +Components: Application\Designer\Installer and Application\Symbols; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\Installer.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Test; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\test.exe; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Test and Application\Symbols; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\test.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Test; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\test.exe.config; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Test and Application\LINQ; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\testlinq.exe; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete Components: Application\Test and Application\LINQ and Application\Symbols; Source: ..\bin\{#Year}\{#BaseConfiguration}\bin\testlinq.pdb; DestDir: {app}\bin; Flags: restartreplace uninsrestartdelete ADDED Setup/set_default.bat Index: Setup/set_default.bat ================================================================== --- /dev/null +++ Setup/set_default.bat @@ -0,0 +1,38 @@ +@ECHO OFF + +:: +:: set_default.bat -- +:: +:: Written by Joe Mistachkin. +:: Released to the public domain, use at your own risk! +:: + +IF NOT DEFINED ISNETFX2 ( + SET ISNETFX2=True +) + +IF NOT DEFINED VCRUNTIME ( + SET VCRUNTIME=2008_SP1 +) + +IF NOT DEFINED CONFIGURATION ( + SET CONFIGURATION=Release +) + +IF NOT DEFINED PLATFORM ( + SET PLATFORM=Win32 +) + +IF NOT DEFINED PROCESSOR ( + SET PROCESSOR=x86 +) + +IF NOT DEFINED YEAR ( + SET YEAR=2008 +) + +IF NOT DEFINED FRAMEWORK ( + SET FRAMEWORK=netFx35 +) + +:end_of_file Index: Setup/set_x64_2010.bat ================================================================== --- Setup/set_x64_2010.bat +++ Setup/set_x64_2010.bat @@ -5,10 +5,10 @@ :: :: Written by Joe Mistachkin. :: Released to the public domain, use at your own risk! :: -SET ISNETFX2=True +SET ISNETFX2=False SET VCRUNTIME=2010_SP1 SET PLATFORM=x64 SET PROCESSOR=x64 SET YEAR=2010 Index: Setup/set_x86_2010.bat ================================================================== --- Setup/set_x86_2010.bat +++ Setup/set_x86_2010.bat @@ -5,10 +5,10 @@ :: :: Written by Joe Mistachkin. :: Released to the public domain, use at your own risk! :: -SET ISNETFX2=True +SET ISNETFX2=False SET VCRUNTIME=2010_SP1 SET PLATFORM=Win32 SET PROCESSOR=x86 SET YEAR=2010 Index: Tests/Installer_Test_Vs2008.log ================================================================== --- Tests/Installer_Test_Vs2008.log +++ Tests/Installer_Test_Vs2008.log @@ -2,11 +2,11 @@ Installer.exe: #2: Installer.Main: GacInstall: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.dll]]" Installer.exe: #3: Installer.Main: GacInstall: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.Linq.dll]]" Installer.exe: #4: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727", writable = False Installer.exe: #5: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #6: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = -Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", writable = False +Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", writable = True Installer.exe: #8: RegistryHelper.DeleteSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", subKeyName = "SQLite" Installer.exe: #9: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", writable = True Installer.exe: #10: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", subKeyName = "System.Data.SQLite" Installer.exe: #11: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\System.Data.SQLite", name = , value = "[file nativename [getBuildDirectory]]" Installer.exe: #12: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727", writable = False Index: Tests/Installer_Test_Vs2010.log ================================================================== --- Tests/Installer_Test_Vs2010.log +++ Tests/Installer_Test_Vs2010.log @@ -2,11 +2,11 @@ Installer.exe: #2: Installer.Main: GacInstall: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.dll]]" Installer.exe: #3: Installer.Main: GacInstall: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.Linq.dll]]" Installer.exe: #4: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319", writable = False Installer.exe: #5: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #6: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = -Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", writable = False +Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", writable = True Installer.exe: #8: RegistryHelper.DeleteSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", subKeyName = "SQLite" Installer.exe: #9: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", writable = True Installer.exe: #10: RegistryHelper.CreateSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", subKeyName = "System.Data.SQLite" Installer.exe: #11: RegistryHelper.SetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\System.Data.SQLite", name = , value = "[file nativename [getBuildDirectory]]" Installer.exe: #12: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319", writable = False Index: Tests/Uninstaller_Test_Vs2008.log ================================================================== --- Tests/Uninstaller_Test_Vs2008.log +++ Tests/Uninstaller_Test_Vs2008.log @@ -2,11 +2,11 @@ Installer.exe: #2: Installer.Main: GacRemove: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.Linq.dll]]" Installer.exe: #3: Installer.Main: GacRemove: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.dll]]" Installer.exe: #4: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727", writable = False Installer.exe: #5: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #6: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = -Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", writable = False +Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", writable = True Installer.exe: #8: RegistryHelper.DeleteSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx", subKeyName = "System.Data.SQLite" Installer.exe: #9: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v2.0.50727", writable = False Installer.exe: #10: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #11: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = Installer.exe: #12: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Index: Tests/Uninstaller_Test_Vs2010.log ================================================================== --- Tests/Uninstaller_Test_Vs2010.log +++ Tests/Uninstaller_Test_Vs2010.log @@ -2,11 +2,11 @@ Installer.exe: #2: Installer.Main: GacRemove: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.Linq.dll]]" Installer.exe: #3: Installer.Main: GacRemove: assemblyPath = "[file nativename [file join [getBuildDirectory] System.Data.SQLite.dll]]" Installer.exe: #4: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319", writable = False Installer.exe: #5: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #6: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = -Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", writable = False +Installer.exe: #7: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", writable = True Installer.exe: #8: RegistryHelper.DeleteSubKey: rootKey = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx", subKeyName = "System.Data.SQLite" Installer.exe: #9: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework\v4.0.30319", writable = False Installer.exe: #10: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Installer.exe: #11: RegistryHelper.GetValue: key = "HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework", name = "InstallRoot", defaultValue = Installer.exe: #12: RegistryHelper.OpenSubKey: rootKey = "HKEY_LOCAL_MACHINE", subKeyName = "Software\Microsoft\.NETFramework", writable = False Index: exclude_bin.txt ================================================================== --- exclude_bin.txt +++ exclude_bin.txt @@ -1,6 +1,5 @@ *.exp *.lib *.map -*Installer.* *EnvDTE.* *Microsoft.* Index: tools/install/Installer.cs ================================================================== --- tools/install/Installer.cs +++ tools/install/Installer.cs @@ -32,36 +32,39 @@ string name, string description, string typeName, AssemblyName assemblyName, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref bool saved, ref string error ); /////////////////////////////////////////////////////////////////////////// internal delegate bool FrameworkRegistryCallback( - RegistryKey rootKey, + Installer.MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ); /////////////////////////////////////////////////////////////////////////// internal delegate bool VisualStudioRegistryCallback( - RegistryKey rootKey, + Installer.MockRegistryKey rootKey, Version vsVersion, Installer.Package package, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ); #endregion @@ -80,11 +83,11 @@ VsDataSource = 0x10, VsDataProvider = 0x20, Framework = GAC | AssemblyFolders | DbProviderFactory, Vs = VsPackage | VsDataSource | VsDataProvider, All = Framework | Vs, - AllNoGAC = All & ~GAC, + AllExceptGAC = All & ~GAC, Default = All } /////////////////////////////////////////////////////////////////////////// @@ -97,12 +100,11 @@ Low = 0x4, Medium = 0x8, High = 0x10, Higher = 0x20, Highest = 0x40, - Debug = Medium, /* NOTE: Default for debug messages. */ - Trace = Medium /* NOTE: Default for trace messages. */ + Default = Medium } #endregion /////////////////////////////////////////////////////////////////////////// @@ -178,12 +180,12 @@ #region Private Static Data private static object syncRoot = new object(); private static long nextDebugId; private static long nextTraceId; - private static TracePriority debugPriority = TracePriority.Debug; - private static TracePriority tracePriority = TracePriority.Trace; + private static TracePriority debugPriority = TracePriority.Default; + private static TracePriority tracePriority = TracePriority.Default; private static string debugFormat = DefaultDebugFormat; private static string traceFormat = DefaultTraceFormat; #endregion /////////////////////////////////////////////////////////////////// @@ -535,12 +537,371 @@ } #endregion /////////////////////////////////////////////////////////////////////// + #region MockRegistry Class + private sealed class MockRegistry : IDisposable + { + #region Public Constructors + public MockRegistry() + { + whatIf = true; + readOnly = true; + safe = true; + } + + /////////////////////////////////////////////////////////////////// + + public MockRegistry( + bool whatIf + ) + : this() + { + this.whatIf = whatIf; + } + + /////////////////////////////////////////////////////////////////// + + public MockRegistry( + bool whatIf, + bool readOnly + ) + : this(whatIf) + { + this.readOnly = readOnly; + } + + /////////////////////////////////////////////////////////////////// + + public MockRegistry( + bool whatIf, + bool readOnly, + bool safe + ) + : this(whatIf, readOnly) + { + this.safe = safe; + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region Public Properties + private bool whatIf; + public bool WhatIf + { + get { CheckDisposed(); return whatIf; } + set { CheckDisposed(); whatIf = value; } + } + + /////////////////////////////////////////////////////////////////// + + private bool readOnly; + public bool ReadOnly + { + get { CheckDisposed(); return readOnly; } + set { CheckDisposed(); readOnly = value; } + } + + /////////////////////////////////////////////////////////////////// + + private bool safe; + public bool Safe + { + get { CheckDisposed(); return safe; } + set { CheckDisposed(); safe = value; } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey classesRoot; + public MockRegistryKey ClassesRoot + { + get + { + CheckDisposed(); + + if (classesRoot == null) + classesRoot = new MockRegistryKey( + Registry.ClassesRoot, whatIf, readOnly, safe); + + return classesRoot; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey currentConfig; + public MockRegistryKey CurrentConfig + { + get + { + CheckDisposed(); + + if (currentConfig == null) + currentConfig = new MockRegistryKey( + Registry.CurrentConfig, whatIf, readOnly, safe); + + return currentConfig; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey currentUser; + public MockRegistryKey CurrentUser + { + get + { + CheckDisposed(); + + if (currentUser == null) + currentUser = new MockRegistryKey( + Registry.CurrentUser, whatIf, readOnly, safe); + + return currentUser; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey dynData; + public MockRegistryKey DynData + { + get + { + CheckDisposed(); + + if (dynData == null) + dynData = new MockRegistryKey( + Registry.DynData, whatIf, readOnly, safe); + + return dynData; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey localMachine; + public MockRegistryKey LocalMachine + { + get + { + CheckDisposed(); + + if (localMachine == null) + localMachine = new MockRegistryKey( + Registry.LocalMachine, whatIf, readOnly, safe); + + return localMachine; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey performanceData; + public MockRegistryKey PerformanceData + { + get + { + CheckDisposed(); + + if (performanceData == null) + performanceData = new MockRegistryKey( + Registry.PerformanceData, whatIf, readOnly, safe); + + return performanceData; + } + } + + /////////////////////////////////////////////////////////////////// + + private MockRegistryKey users; + public MockRegistryKey Users + { + get + { + CheckDisposed(); + + if (users == null) + users = new MockRegistryKey( + Registry.Users, whatIf, readOnly, safe); + + return users; + } + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region Public "Registry" Methods + public object GetValue( + string keyName, + string valueName, + object defaultValue + ) + { + CheckDisposed(); + + return Registry.GetValue(keyName, valueName, defaultValue); + } + + /////////////////////////////////////////////////////////////////// + + public void SetValue( + string keyName, + string valueName, + object value + ) + { + CheckDisposed(); + CheckReadOnly(); + + if (!whatIf) + Registry.SetValue(keyName, valueName, value); + } + + /////////////////////////////////////////////////////////////////// + + public void SetValue( + string keyName, + string valueName, + object value, + RegistryValueKind valueKind + ) + { + CheckDisposed(); + CheckReadOnly(); + + if (!whatIf) + Registry.SetValue(keyName, valueName, value, valueKind); + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region Private Methods + private void CheckReadOnly() + { + // + // NOTE: In "read-only" mode, we disallow all write access. + // + if (!readOnly) + return; + + throw new InvalidOperationException(); + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region IDisposable "Pattern" Members + private bool disposed; + private void CheckDisposed() /* throw */ + { + if (!disposed) + return; + + throw new ObjectDisposedException( + typeof(MockRegistry).Name); + } + + /////////////////////////////////////////////////////////////////// + + private /* protected virtual */ void Dispose( + bool disposing + ) + { + if (!disposed) + { + if (disposing) + { + //////////////////////////////////// + // dispose managed resources here... + //////////////////////////////////// + + if (classesRoot != null) + { + classesRoot.Close(); + classesRoot = null; + } + + if (currentConfig != null) + { + currentConfig.Close(); + currentConfig = null; + } + + if (currentUser != null) + { + currentUser.Close(); + currentUser = null; + } + + if (dynData != null) + { + dynData.Close(); + dynData = null; + } + + if (localMachine != null) + { + localMachine.Close(); + localMachine = null; + } + + if (performanceData != null) + { + performanceData.Close(); + performanceData = null; + } + + if (users != null) + { + users.Close(); + users = null; + } + } + + ////////////////////////////////////// + // release unmanaged resources here... + ////////////////////////////////////// + + // + // NOTE: This object is now disposed. + // + disposed = true; + } + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region IDisposable Members + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + #endregion + + /////////////////////////////////////////////////////////////////// + + #region Destructor + ~MockRegistry() + { + Dispose(false); + } + #endregion + } + #endregion + + /////////////////////////////////////////////////////////////////////// + #region MockRegistryKey Class - private sealed class MockRegistryKey : IDisposable + internal sealed class MockRegistryKey : IDisposable { #region Private Constructors private MockRegistryKey() { whatIf = true; @@ -695,21 +1056,22 @@ } /////////////////////////////////////////////////////////////////// public void DeleteSubKey( - string subKeyName + string subKeyName, + bool throwOnMissing ) { CheckDisposed(); CheckReadOnly(); if (key == null) return; if (!whatIf) - key.DeleteSubKey(subKeyName); + key.DeleteSubKey(subKeyName, throwOnMissing); } /////////////////////////////////////////////////////////////////// public void DeleteSubKeyTree( @@ -727,21 +1089,22 @@ } /////////////////////////////////////////////////////////////////// public void DeleteValue( - string name + string name, + bool throwOnMissing ) { CheckDisposed(); CheckReadOnly(); if (key == null) return; if (!whatIf) - key.DeleteValue(name); + key.DeleteValue(name, throwOnMissing); } /////////////////////////////////////////////////////////////////// public string[] GetSubKeyNames() @@ -920,23 +1283,10 @@ #endregion /////////////////////////////////////////////////////////////////// #region Implicit Conversion Operators - // - // BUGBUG: The 'what-if' mode setting here should probably be based - // on some static property, not hard-coded to true? - // - public static implicit operator MockRegistryKey( - RegistryKey key - ) - { - return new MockRegistryKey(key, null, true, false, false); - } - - /////////////////////////////////////////////////////////////////// - // // BUGBUG: Remove me? This should be safe because in 'what-if' // mode all keys are opened read-only. // public static implicit operator RegistryKey( @@ -1052,47 +1402,10 @@ #endregion /////////////////////////////////////////////////////////////////// #region Public Static Methods - public static RegistryKey GetRootKeyByName( - string keyName - ) - { - if (String.IsNullOrEmpty(keyName)) - return null; - - switch (keyName.ToUpperInvariant()) - { - case "HKCR": - case "HKEY_CLASSES_ROOT": - return Registry.ClassesRoot; - case "HKCC": - case "HKEY_CURRENT_CONFIG": - return Registry.CurrentConfig; - case "HKCU": - case "HKEY_CURRENT_USER": - return Registry.CurrentUser; - case "HKDD": - case "HKEY_DYN_DATA": - return Registry.DynData; - case "HKLM": - case "HKEY_LOCAL_MACHINE": - return Registry.LocalMachine; - case "HKPD": - case "HKEY_PERFORMANCE_DATA": - return Registry.PerformanceData; - case "HKU": - case "HKEY_USERS": - return Registry.Users; - } - - return null; - } - - /////////////////////////////////////////////////////////////////// - public static MockRegistryKey OpenSubKey( MockRegistryKey rootKey, string subKeyName, bool writable, bool whatIf, @@ -1156,16 +1469,16 @@ // MockRegistryKey key = rootKey.OpenSubKey(subKeyName); return (key != null) ? key : new MockRegistryKey( - rootKey, subKeyName, true, false, false); + rootKey, subKeyName, whatIf, false, false); } else { return new MockRegistryKey( - rootKey.CreateSubKey(subKeyName), false, false, + rootKey.CreateSubKey(subKeyName), whatIf, false, false); } } finally { @@ -1176,10 +1489,11 @@ /////////////////////////////////////////////////////////////////// public static void DeleteSubKey( MockRegistryKey rootKey, string subKeyName, + bool throwOnMissing, bool whatIf, bool verbose ) { if (rootKey == null) @@ -1191,11 +1505,11 @@ "rootKey = {0}, subKeyName = {1}", ForDisplay(rootKey), ForDisplay(subKeyName)), traceCategory); if (!whatIf) - rootKey.DeleteSubKey(subKeyName); + rootKey.DeleteSubKey(subKeyName, throwOnMissing); subKeysDeleted++; } /////////////////////////////////////////////////////////////////// @@ -1294,10 +1608,11 @@ /////////////////////////////////////////////////////////////////// public static void DeleteValue( MockRegistryKey key, string name, + bool throwOnMissing, bool whatIf, bool verbose ) { if (key == null) @@ -1308,11 +1623,11 @@ debugCallback, traceCallback, String.Format( "key = {0}, name = {1}", ForDisplay(key), ForDisplay(name)), traceCategory); if (!whatIf) - key.DeleteValue(name); + key.DeleteValue(name, throwOnMissing); keyValuesDeleted++; } #endregion } @@ -1377,22 +1692,10 @@ #region VersionMap Class private sealed class VersionMap : Dictionary { public VersionMap() { - // do nothing. - } - } - #endregion - - /////////////////////////////////////////////////////////////////////// - - #region VersionListMap Class - private sealed class VersionListMap : Dictionary - { - public VersionListMap() - { // do nothing. } } #endregion @@ -1497,10 +1800,11 @@ bool noVs2008, bool noVs2010, bool noTrace, bool noConsole, bool noLog, + bool throwOnMissing, bool whatIf, bool verbose, bool confirm ) { @@ -1524,10 +1828,11 @@ this.noVs2008 = noVs2008; this.noVs2010 = noVs2010; this.noTrace = noTrace; this.noConsole = noConsole; this.noLog = noLog; + this.throwOnMissing = throwOnMissing; this.whatIf = whatIf; this.verbose = verbose; this.confirm = confirm; } #endregion @@ -1674,14 +1979,14 @@ ref designerFileName); return new Configuration(thisAssembly, null, directory, coreFileName, linqFileName, designerFileName, TraceOps.DebugFormat, TraceOps.TraceFormat, - InstallFlags.Default, TracePriority.Debug, - TracePriority.Trace, true, false, false, false, false, + InstallFlags.Default, TracePriority.Default, + TracePriority.Default, true, false, false, false, false, false, false, false, false, false, false, true, true, - false); + true, false); } /////////////////////////////////////////////////////////////////// public static bool FromArgs( @@ -1975,10 +2280,31 @@ continue; } configuration.noRuntimeVersion = (bool)value; + } + else if (MatchOption(newArg, "throwOnMissing")) + { + bool? value = ParseBoolean(text); + + if (value == null) + { + error = TraceOps.DebugAndTrace( + TracePriority.Lowest, debugCallback, + traceCallback, String.Format( + "Invalid {0} boolean value: {1}", + ForDisplay(arg), ForDisplay(text)), + traceCategory); + + if (strict) + return false; + + continue; + } + + configuration.throwOnMissing = (bool)value; } else if (MatchOption(newArg, "whatIf")) { bool? value = ParseBoolean(text); @@ -2632,10 +2958,14 @@ traceCategory); traceCallback(String.Format(NameAndValueFormat, "NoLog", ForDisplay(noLog)), traceCategory); + + traceCallback(String.Format(NameAndValueFormat, + "ThrowOnMissing", ForDisplay(throwOnMissing)), + traceCategory); traceCallback(String.Format(NameAndValueFormat, "WhatIf", ForDisplay(whatIf)), traceCategory); @@ -2849,10 +3179,19 @@ set { noLog = value; } } /////////////////////////////////////////////////////////////////// + private bool throwOnMissing; + public bool ThrowOnMissing + { + get { return throwOnMissing; } + set { throwOnMissing = value; } + } + + /////////////////////////////////////////////////////////////////// + private bool whatIf; public bool WhatIf { get { return whatIf; } set { whatIf = value; } @@ -2892,12 +3231,12 @@ #endregion /////////////////////////////////////////////////////////////////// #region Public Methods - private RegistryKey rootKey; - public RegistryKey RootKey + private MockRegistryKey rootKey; + public MockRegistryKey RootKey { get { return rootKey; } set { rootKey = value; } } @@ -2944,12 +3283,12 @@ #endregion /////////////////////////////////////////////////////////////////// #region Public Properties - private RegistryKey rootKey; - public RegistryKey RootKey + private MockRegistryKey rootKey; + public MockRegistryKey RootKey { get { return rootKey; } set { rootKey = value; } } @@ -2959,28 +3298,10 @@ public VersionList Versions { get { return versions; } set { versions = value; } } - - /////////////////////////////////////////////////////////////////// - - private VersionListMap frameworkVersions; - public VersionListMap FrameworkVersions - { - get { return frameworkVersions; } - set { frameworkVersions = value; } - } - - /////////////////////////////////////////////////////////////////// - - private VersionList installedVersions; - public VersionList InstalledVersions - { - get { return installedVersions; } - set { installedVersions = value; } - } #endregion } #endregion #endregion @@ -3016,20 +3337,10 @@ private static readonly string FrameworkKeyName = "Software\\Microsoft\\.NETFramework"; /////////////////////////////////////////////////////////////////////// - private static readonly string FrameworkSdkKeyName = - "Software\\Microsoft\\Microsoft SDKs\\.NETFramework"; - - /////////////////////////////////////////////////////////////////////// - - private static readonly string WindowsSdkKeyName = - "Software\\Microsoft\\Microsoft SDKs\\Windows"; - - /////////////////////////////////////////////////////////////////////// - private static readonly string XPathForAddElement = "configuration/system.data/DbProviderFactories/add[@invariant=\"{0}\"]"; private static readonly string XPathForRemoveElement = "configuration/system.data/DbProviderFactories/remove[@invariant=\"{0}\"]"; @@ -3048,18 +3359,22 @@ #endregion /////////////////////////////////////////////////////////////////////// #region Trace Handling - private static string GetLogFileName() - { - string result = Path.GetTempFileName(); /* throw */ - - File.Move(result, result + LogFileSuffix); /* throw */ - result += LogFileSuffix; - - return result; + private static string GetLogFileName() /* throw */ + { + string fileName = Path.GetTempFileName(); + string directory = Path.GetDirectoryName(fileName); + string fileNameOnly = Path.GetFileNameWithoutExtension(fileName); + + string newFileName = Path.Combine(directory, + traceCategory + "." + fileNameOnly + LogFileSuffix); + + File.Move(fileName, newFileName); + + return newFileName; } /////////////////////////////////////////////////////////////////////// private static void AppDebug( @@ -3150,11 +3465,11 @@ } /////////////////////////////////////////////////////////////////////// private static string GetFrameworkDirectory( - RegistryKey rootKey, + MockRegistryKey rootKey, Version frameworkVersion, bool whatIf, bool verbose ) { @@ -3172,144 +3487,26 @@ return Path.Combine( (string)value, String.Format("v{0}", frameworkVersion)); } } - - /////////////////////////////////////////////////////////////////////// - - private static string GetSdkBinaryFileName( - RegistryKey rootKey, - string fileName, - bool whatIf, - bool verbose - ) - { - StringDictionary results = new StringDictionary(); - - string[] keyNames = { - FrameworkKeyName, - FrameworkSdkKeyName, - WindowsSdkKeyName - }; - - string[] valueNames = { - "sdkInstallRootv2.0", - "InstallationFolder", - "InstallationFolder" - }; - - bool[] useSubKeys = { - false, - true, - true - }; - - for (int index = 0; index < keyNames.Length; index++) - { - using (MockRegistryKey key = RegistryHelper.OpenSubKey( - rootKey, keyNames[index], false, whatIf, verbose)) - { - if (key == null) - continue; - - if (useSubKeys[index]) - { - foreach (string subKeyName in RegistryHelper.GetSubKeyNames( - key, whatIf, verbose)) - { - using (MockRegistryKey subKey = RegistryHelper.OpenSubKey( - key, subKeyName, false, whatIf, verbose)) - { - if (subKey == null) - continue; - - object value = RegistryHelper.GetValue( - subKey, valueNames[index], null, whatIf, - verbose); - - if (!(value is string)) - continue; - - string path = (string)value; - - if (!Directory.Exists(path)) - continue; - - path = Path.Combine(path, "bin"); - - if (!Directory.Exists(path)) - continue; - - if (String.IsNullOrEmpty(fileName)) - { - results.Add(subKey.Name, path); - continue; - } - - path = Path.Combine(path, fileName); - - if (File.Exists(path)) - results.Add(subKey.Name, path); - } - } - } - else - { - object value = RegistryHelper.GetValue( - key, valueNames[index], null, whatIf, verbose); - - if (!(value is string)) - continue; - - string path = (string)value; - - if (!Directory.Exists(path)) - continue; - - path = Path.Combine(path, "bin"); - - if (!Directory.Exists(path)) - continue; - - if (String.IsNullOrEmpty(fileName)) - { - results.Add(key.Name, path); - continue; - } - - path = Path.Combine(path, fileName); - - if (File.Exists(path)) - results.Add(key.Name, path); - } - } - } - - // - // NOTE: If we found some results, return the last (latest) one. - // - if (results.Count > 0) - return results[new StringList(results.Keys)[results.Count - 1]]; - - return null; - } #endregion /////////////////////////////////////////////////////////////////////// #region Per-Framework/Platform Handling private static void InitializeFrameworkList( + MockRegistryKey rootKey, Configuration configuration, ref FrameworkList frameworkList ) { if (frameworkList == null) frameworkList = new FrameworkList(); if (frameworkList.RootKey == null) - frameworkList.RootKey = Registry.LocalMachine; + frameworkList.RootKey = rootKey; /////////////////////////////////////////////////////////////////// if (frameworkList.Names == null) { @@ -3374,11 +3571,11 @@ } /////////////////////////////////////////////////////////////////////// private static bool HaveFramework( - RegistryKey rootKey, + MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, bool whatIf, bool verbose @@ -3414,40 +3611,48 @@ } /////////////////////////////////////////////////////////////////////// private static bool ForEachFrameworkConfig( + MockRegistry registry, FrameworkList frameworkList, FrameworkConfigCallback callback, string invariant, string name, string description, string typeName, AssemblyName assemblyName, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref bool saved, ref string error ) { + if (registry == null) + { + error = "invalid registry"; + return false; + } + if (frameworkList == null) { error = "invalid framework list"; return false; } - RegistryKey rootKey = frameworkList.RootKey; + MockRegistryKey rootKey = frameworkList.RootKey; if (rootKey == null) { error = "invalid root key"; return false; } - if (!Object.ReferenceEquals(rootKey, Registry.CurrentUser) && - !Object.ReferenceEquals(rootKey, Registry.LocalMachine)) + if (!Object.ReferenceEquals(rootKey, registry.CurrentUser) && + !Object.ReferenceEquals(rootKey, registry.LocalMachine)) { error = "root key must be per-user or per-machine"; return false; } @@ -3573,12 +3778,12 @@ bool localSaved = false; if (!callback( fileName, invariant, name, description, typeName, - assemblyName, clientData, whatIf, verbose, - ref localSaved, ref error)) + assemblyName, clientData, throwOnMissing, whatIf, + verbose, ref localSaved, ref error)) { return false; } else { @@ -3599,34 +3804,42 @@ } /////////////////////////////////////////////////////////////////////// private static bool ForEachFrameworkRegistry( + MockRegistry registry, FrameworkList frameworkList, FrameworkRegistryCallback callback, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { + if (registry == null) + { + error = "invalid registry"; + return false; + } + if (frameworkList == null) { error = "invalid framework list"; return false; } - RegistryKey rootKey = frameworkList.RootKey; + MockRegistryKey rootKey = frameworkList.RootKey; if (rootKey == null) { error = "invalid root key"; return false; } - if (!Object.ReferenceEquals(rootKey, Registry.CurrentUser) && - !Object.ReferenceEquals(rootKey, Registry.LocalMachine)) + if (!Object.ReferenceEquals(rootKey, registry.CurrentUser) && + !Object.ReferenceEquals(rootKey, registry.LocalMachine)) { error = "root key must be per-user or per-machine"; return false; } @@ -3703,12 +3916,12 @@ if (callback == null) continue; if (!callback( rootKey, frameworkName, frameworkVersion, - platformName, clientData, whatIf, verbose, - ref error)) + platformName, clientData, throwOnMissing, + whatIf, verbose, ref error)) { return false; } } } @@ -3719,19 +3932,20 @@ /////////////////////////////////////////////////////////////////////// #region Per-Visual Studio Version Handling private static void InitializeVsList( + MockRegistryKey rootKey, Configuration configuration, ref VsList vsList ) { if (vsList == null) vsList = new VsList(); if (vsList.RootKey == null) - vsList.RootKey = Registry.LocalMachine; + vsList.RootKey = rootKey; if (vsList.Versions == null) { vsList.Versions = new VersionList(); @@ -3741,36 +3955,16 @@ vsList.Versions.Add(new Version(9, 0)); // Visual Studio 2008 if ((configuration == null) || !configuration.NoVs2010) vsList.Versions.Add(new Version(10, 0));// Visual Studio 2010 } - - if (vsList.FrameworkVersions == null) - { - vsList.FrameworkVersions = new VersionListMap(); - - // vsList.FrameworkVersions.Add(new Version(8, 0), - // new VersionList(new Version[] { - // new Version(2, 0, 50727) })); - - if ((configuration == null) || !configuration.NoVs2008) - vsList.FrameworkVersions.Add(new Version(9, 0), - new VersionList(new Version[] { - new Version(2, 0, 50727) })); - - if ((configuration == null) || !configuration.NoVs2010) - vsList.FrameworkVersions.Add(new Version(10, 0), - new VersionList(new Version[] { - new Version(2, 0, 50727), - new Version(4, 0, 30319) })); - } } /////////////////////////////////////////////////////////////////////// private static bool HaveVsVersion( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, bool whatIf, bool verbose ) { @@ -3805,35 +3999,43 @@ } /////////////////////////////////////////////////////////////////////// private static bool ForEachVsVersionRegistry( + MockRegistry registry, VsList vsList, VisualStudioRegistryCallback callback, Package package, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { + if (registry == null) + { + error = "invalid registry"; + return false; + } + if (vsList == null) { error = "invalid VS list"; return false; } - RegistryKey rootKey = vsList.RootKey; + MockRegistryKey rootKey = vsList.RootKey; if (rootKey == null) { error = "invalid root key"; return false; } - if (!Object.ReferenceEquals(rootKey, Registry.CurrentUser) && - !Object.ReferenceEquals(rootKey, Registry.LocalMachine)) + if (!Object.ReferenceEquals(rootKey, registry.CurrentUser) && + !Object.ReferenceEquals(rootKey, registry.LocalMachine)) { error = "root key must be per-user or per-machine"; return false; } @@ -3862,12 +4064,12 @@ if (callback == null) continue; if (!callback( - rootKey, vsVersion, package, clientData, whatIf, - verbose, ref error)) + rootKey, vsVersion, package, clientData, + throwOnMissing, whatIf, verbose, ref error)) { return false; } } @@ -4041,10 +4243,11 @@ string name, string description, string typeName, AssemblyName assemblyName, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref bool saved, ref string error ) @@ -4093,11 +4296,11 @@ } /////////////////////////////////////////////////////////////////////// private static bool AddToAssemblyFolders( - RegistryKey rootKey, + MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, string subKeyName, string directory, @@ -4142,25 +4345,26 @@ } /////////////////////////////////////////////////////////////////////// private static bool RemoveFromAssemblyFolders( - RegistryKey rootKey, + MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, string subKeyName, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { string keyName = GetAssemblyFoldersKeyName( frameworkName, frameworkVersion, platformName); using (MockRegistryKey key = RegistryHelper.OpenSubKey( - rootKey, keyName, false, whatIf, verbose)) + rootKey, keyName, true, whatIf, verbose)) { if (key == null) { error = String.Format( "could not open registry key: {0}\\{1}", @@ -4168,24 +4372,25 @@ return false; } RegistryHelper.DeleteSubKey( - key, subKeyName, whatIf, verbose); + key, subKeyName, throwOnMissing, whatIf, verbose); } return true; } /////////////////////////////////////////////////////////////////////// private static bool ProcessAssemblyFolders( - RegistryKey rootKey, + MockRegistryKey rootKey, string frameworkName, Version frameworkVersion, string platformName, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { @@ -4199,20 +4404,20 @@ if (pair.Y) { return RemoveFromAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, - LegacyProjectName, whatIf, verbose, ref error) && + LegacyProjectName, false, whatIf, verbose, ref error) && AddToAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, ProjectName, pair.X, whatIf, verbose, ref error); } else { return RemoveFromAssemblyFolders( rootKey, frameworkName, frameworkVersion, platformName, - ProjectName, whatIf, verbose, ref error); + ProjectName, throwOnMissing, whatIf, verbose, ref error); } } #endregion /////////////////////////////////////////////////////////////////////// @@ -4229,44 +4434,13 @@ vsVersion); } /////////////////////////////////////////////////////////////////////// - #region Visual Studio Version Handling - private static bool AddVsVersion( - RegistryKey rootKey, - Version vsVersion, - Package package, - object clientData, - bool whatIf, - bool verbose, - ref string error - ) - { - if (vsVersion != null) - { - VsList vsList = clientData as VsList; - - if (vsList != null) - { - if (vsList.InstalledVersions == null) - vsList.InstalledVersions = new VersionList(); - - if (!vsList.InstalledVersions.Contains(vsVersion)) - vsList.InstalledVersions.Add(vsVersion); - } - } - - return true; - } - #endregion - - /////////////////////////////////////////////////////////////////////// - #region Visual Studio Data Source Handling private static bool AddVsDataSource( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, bool whatIf, bool verbose, ref string error @@ -4341,11 +4515,11 @@ } /////////////////////////////////////////////////////////////////////// private static bool RemoveVsDataSource( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, bool whatIf, bool verbose, ref string error @@ -4399,14 +4573,15 @@ } /////////////////////////////////////////////////////////////////////// private static bool ProcessVsDataSource( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { @@ -4439,11 +4614,11 @@ /////////////////////////////////////////////////////////////////////// #region Visual Studio Data Provider Handling private static bool AddVsDataProvider( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, string fileName, bool whatIf, bool verbose, @@ -4551,11 +4726,11 @@ } /////////////////////////////////////////////////////////////////////// private static bool RemoveVsDataProvider( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, bool whatIf, bool verbose, ref string error @@ -4603,14 +4778,15 @@ } /////////////////////////////////////////////////////////////////////// private static bool ProcessVsDataProvider( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { @@ -4666,11 +4842,11 @@ } /////////////////////////////////////////////////////////////////////// private static bool AddVsPackage( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, string fileName, bool whatIf, bool verbose, @@ -4713,12 +4889,13 @@ key); return false; } - using (MockRegistryKey packageKey = RegistryHelper.CreateSubKey( - subKey, package.PackageId.ToString(VsIdFormat), whatIf, + using (MockRegistryKey packageKey = + RegistryHelper.CreateSubKey(subKey, + package.PackageId.ToString(VsIdFormat), whatIf, verbose)) { if (packageKey == null) { error = String.Format( @@ -4726,13 +4903,13 @@ key, package.PackageId.ToString(VsIdFormat)); return false; } - RegistryHelper.SetValue(packageKey, null, String.Format( - "{0} Designer Package", ProjectName), whatIf, - verbose); + RegistryHelper.SetValue(packageKey, null, + String.Format("{0} Designer Package", ProjectName), + whatIf, verbose); RegistryHelper.SetValue(packageKey, "Class", "SQLite.Designer.SQLitePackage", whatIf, verbose); RegistryHelper.SetValue(packageKey, "CodeBase", @@ -4756,18 +4933,19 @@ whatIf, verbose); RegistryHelper.SetValue(packageKey, "ProductVersion", "1.0", whatIf, verbose); - using (MockRegistryKey toolboxKey = RegistryHelper.CreateSubKey( - packageKey, "Toolbox", whatIf, verbose)) + using (MockRegistryKey toolboxKey = + RegistryHelper.CreateSubKey(packageKey, + "Toolbox", whatIf, verbose)) { if (toolboxKey == null) { error = String.Format( - "could not create registry key: {0}\\Toolbox", - packageKey); + "could not create registry key: " + + "{0}\\Toolbox", packageKey); return false; } RegistryHelper.SetValue( @@ -4804,12 +4982,13 @@ key); return false; } - using (MockRegistryKey serviceKey = RegistryHelper.CreateSubKey( - subKey, package.ServiceId.ToString(VsIdFormat), whatIf, + using (MockRegistryKey serviceKey = + RegistryHelper.CreateSubKey(subKey, + package.ServiceId.ToString(VsIdFormat), whatIf, verbose)) { if (serviceKey == null) { error = String.Format( @@ -4834,13 +5013,14 @@ } /////////////////////////////////////////////////////////////////////// private static bool RemoveVsPackage( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { @@ -4881,12 +5061,12 @@ return false; } RegistryHelper.DeleteSubKeyTree( - key, package.PackageId.ToString(VsIdFormat), whatIf, - verbose); + subKey, package.PackageId.ToString(VsIdFormat), + whatIf, verbose); } using (MockRegistryKey subKey = RegistryHelper.OpenSubKey( key, "Menus", true, whatIf, verbose)) { @@ -4898,12 +5078,12 @@ return false; } RegistryHelper.DeleteValue( - subKey, package.PackageId.ToString(VsIdFormat), whatIf, - verbose); + subKey, package.PackageId.ToString(VsIdFormat), + throwOnMissing, whatIf, verbose); } using (MockRegistryKey subKey = RegistryHelper.OpenSubKey( key, "Services", true, whatIf, verbose)) { @@ -4915,25 +5095,26 @@ return false; } RegistryHelper.DeleteSubKeyTree( - subKey, package.ServiceId.ToString(VsIdFormat), whatIf, - verbose); + subKey, package.ServiceId.ToString(VsIdFormat), + whatIf, verbose); } } return true; } /////////////////////////////////////////////////////////////////////// private static bool ProcessVsPackage( - RegistryKey rootKey, + MockRegistryKey rootKey, Version vsVersion, Package package, object clientData, + bool throwOnMissing, bool whatIf, bool verbose, ref string error ) { @@ -4946,18 +5127,18 @@ } if (pair.Y) { return AddVsPackage( - rootKey, vsVersion, package, pair.X, whatIf, - verbose, ref error); + rootKey, vsVersion, package, pair.X, whatIf, verbose, + ref error); } else { return RemoveVsPackage( - rootKey, vsVersion, package, whatIf, verbose, - ref error); + rootKey, vsVersion, package, throwOnMissing, whatIf, + verbose, ref error); } } #endregion #endregion @@ -4966,233 +5147,277 @@ #region Application Entry Point private static int Main( string[] args ) { - Configuration configuration = null; - string error = null; - - /////////////////////////////////////////////////////////////////// - - #region Command Line Processing - if (!Configuration.FromArgs( - args, true, ref configuration, ref error) || - !Configuration.Process( - args, configuration, true, ref error) || - !Configuration.CheckRuntimeVersion( - configuration, true, ref error)) - { - TraceOps.ShowMessage(TracePriority.Highest, - debugCallback, traceCallback, thisAssembly, - error, traceCategory, MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return 1; /* FAILURE */ - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region .NET Framework / Visual Studio Data - Package package = null; - FrameworkList frameworkList = null; - VsList vsList = null; - - /////////////////////////////////////////////////////////////////// - - InitializeVsPackage(ref package); - InitializeFrameworkList(configuration, ref frameworkList); - InitializeVsList(configuration, ref vsList); - #endregion - - /////////////////////////////////////////////////////////////////// - - AssemblyName assemblyName = AssemblyName.GetAssemblyName( - configuration.CoreFileName); /* throw */ - - /////////////////////////////////////////////////////////////////// - - AnyPair directoryPair = new AnyPair( - configuration.Directory, configuration.Install); - - AnyPair fileNamePair = new AnyPair( - configuration.DesignerFileName, configuration.Install); - - /////////////////////////////////////////////////////////////////// - - #region .NET GAC Install/Remove - if (configuration.HasFlags(InstallFlags.GAC, true)) - { - Publish publish = null; - - if (!configuration.WhatIf) - publish = new Publish(); - - if (configuration.Install) - { - if (!configuration.WhatIf) - publish.GacInstall(configuration.CoreFileName); /* throw */ - - TraceOps.DebugAndTrace(TracePriority.Highest, - debugCallback, traceCallback, String.Format( - "GacInstall: assemblyPath = {0}", - ForDisplay(configuration.CoreFileName)), - traceCategory); - - if (!configuration.WhatIf) - publish.GacInstall(configuration.LinqFileName); /* throw */ - - TraceOps.DebugAndTrace(TracePriority.Highest, - debugCallback, traceCallback, String.Format( - "GacInstall: assemblyPath = {0}", - ForDisplay(configuration.LinqFileName)), - traceCategory); - } - else - { - if (!configuration.WhatIf) - publish.GacRemove(configuration.LinqFileName); /* throw */ - - TraceOps.DebugAndTrace(TracePriority.Highest, - debugCallback, traceCallback, String.Format( - "GacRemove: assemblyPath = {0}", - ForDisplay(configuration.LinqFileName)), - traceCategory); - - if (!configuration.WhatIf) - publish.GacRemove(configuration.CoreFileName); /* throw */ - - TraceOps.DebugAndTrace(TracePriority.Highest, - debugCallback, traceCallback, String.Format( - "GacRemove: assemblyPath = {0}", - ForDisplay(configuration.CoreFileName)), - traceCategory); - } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region .NET AssemblyFolders - if (configuration.HasFlags(InstallFlags.AssemblyFolders, true)) - { - if (!ForEachFrameworkRegistry( - frameworkList, ProcessAssemblyFolders, - directoryPair, configuration.WhatIf, - configuration.Verbose, ref error)) + try + { + Configuration configuration = null; + string error = null; + + /////////////////////////////////////////////////////////////// + + #region Command Line Processing + if (!Configuration.FromArgs( + args, true, ref configuration, ref error) || + !Configuration.Process( + args, configuration, true, ref error) || + !Configuration.CheckRuntimeVersion( + configuration, true, ref error)) { TraceOps.ShowMessage(TracePriority.Highest, debugCallback, traceCallback, thisAssembly, error, traceCategory, MessageBoxButtons.OK, MessageBoxIcon.Error); return 1; /* FAILURE */ } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region .NET DbProviderFactory - if (configuration.HasFlags(InstallFlags.DbProviderFactory, true)) - { - bool saved = false; - - if (!ForEachFrameworkConfig( - frameworkList, ProcessDbProviderFactory, - InvariantName, ProviderName, Description, - FactoryTypeName, assemblyName, directoryPair, - configuration.WhatIf, configuration.Verbose, - ref saved, ref error)) - { - TraceOps.ShowMessage(TracePriority.Highest, - debugCallback, traceCallback, thisAssembly, - error, traceCategory, MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return 1; /* FAILURE */ - } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region VS Package - if (configuration.HasFlags(InstallFlags.VsPackage, true)) - { - if (!ForEachVsVersionRegistry( - vsList, ProcessVsPackage, package, fileNamePair, - configuration.WhatIf, configuration.Verbose, - ref error)) - { - TraceOps.ShowMessage(TracePriority.Highest, - debugCallback, traceCallback, thisAssembly, - error, traceCategory, MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return 1; /* FAILURE */ - } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region VS DataSource - if (configuration.HasFlags(InstallFlags.VsDataSource, true)) - { - if (!ForEachVsVersionRegistry( - vsList, ProcessVsDataSource, package, fileNamePair, - configuration.WhatIf, configuration.Verbose, - ref error)) - { - TraceOps.ShowMessage(TracePriority.Highest, - debugCallback, traceCallback, thisAssembly, - error, traceCategory, MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return 1; /* FAILURE */ - } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region VS DataProvider - if (configuration.HasFlags(InstallFlags.VsDataProvider, true)) - { - if (!ForEachVsVersionRegistry( - vsList, ProcessVsDataProvider, package, fileNamePair, - configuration.WhatIf, configuration.Verbose, - ref error)) - { - TraceOps.ShowMessage(TracePriority.Highest, - debugCallback, traceCallback, thisAssembly, - error, traceCategory, MessageBoxButtons.OK, - MessageBoxIcon.Error); - - return 1; /* FAILURE */ - } - } - #endregion - - /////////////////////////////////////////////////////////////////// - - #region Log Summary - TraceOps.DebugAndTrace(TracePriority.Higher, - debugCallback, traceCallback, String.Format( - "subKeysCreated = {0}, subKeysDeleted = {1}, " + - "keyValuesSet = {2}, keyValuesDeleted = {3}", - ForDisplay(RegistryHelper.SubKeysCreated), - ForDisplay(RegistryHelper.SubKeysDeleted), - ForDisplay(RegistryHelper.KeyValuesSet), - ForDisplay(RegistryHelper.KeyValuesDeleted)), - traceCategory); - #endregion - - /////////////////////////////////////////////////////////////////// - - return 0; /* SUCCESS */ + #endregion + + /////////////////////////////////////////////////////////////// + + using (MockRegistry registry = new MockRegistry( + configuration.WhatIf, false, false)) + { + #region .NET Framework / Visual Studio Data + Package package = null; + FrameworkList frameworkList = null; + VsList vsList = null; + + /////////////////////////////////////////////////////////// + + InitializeVsPackage(ref package); + + /////////////////////////////////////////////////////////// + + InitializeFrameworkList(registry.LocalMachine, + configuration, ref frameworkList); + + InitializeVsList(registry.LocalMachine, configuration, + ref vsList); + #endregion + + /////////////////////////////////////////////////////////// + + #region Core Assembly Name Check + // + // NOTE: Do this first, before making any changes to the + // system, because it will throw an exception if the + // file name does not represent a valid managed + // assembly. + // + AssemblyName assemblyName = AssemblyName.GetAssemblyName( + configuration.CoreFileName); /* throw */ + #endregion + + /////////////////////////////////////////////////////////// + + #region Shared Client Data Creation + object directoryData = new AnyPair( + configuration.Directory, configuration.Install); + + object fileNameData = new AnyPair( + configuration.DesignerFileName, configuration.Install); + #endregion + + /////////////////////////////////////////////////////////// + + #region .NET GAC Install/Remove + if (configuration.HasFlags(InstallFlags.GAC, true)) + { + Publish publish = null; + + if (!configuration.WhatIf) + publish = new Publish(); + + if (configuration.Install) + { + if (!configuration.WhatIf) + /* throw */ + publish.GacInstall(configuration.CoreFileName); + + TraceOps.DebugAndTrace(TracePriority.Highest, + debugCallback, traceCallback, String.Format( + "GacInstall: assemblyPath = {0}", + ForDisplay(configuration.CoreFileName)), + traceCategory); + + if (!configuration.WhatIf) + /* throw */ + publish.GacInstall(configuration.LinqFileName); + + TraceOps.DebugAndTrace(TracePriority.Highest, + debugCallback, traceCallback, String.Format( + "GacInstall: assemblyPath = {0}", + ForDisplay(configuration.LinqFileName)), + traceCategory); + } + else + { + if (!configuration.WhatIf) + /* throw */ + publish.GacRemove(configuration.LinqFileName); + + TraceOps.DebugAndTrace(TracePriority.Highest, + debugCallback, traceCallback, String.Format( + "GacRemove: assemblyPath = {0}", + ForDisplay(configuration.LinqFileName)), + traceCategory); + + if (!configuration.WhatIf) + /* throw */ + publish.GacRemove(configuration.CoreFileName); + + TraceOps.DebugAndTrace(TracePriority.Highest, + debugCallback, traceCallback, String.Format( + "GacRemove: assemblyPath = {0}", + ForDisplay(configuration.CoreFileName)), + traceCategory); + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region .NET AssemblyFolders + if (configuration.HasFlags( + InstallFlags.AssemblyFolders, true)) + { + if (!ForEachFrameworkRegistry(registry, + frameworkList, ProcessAssemblyFolders, + directoryData, configuration.ThrowOnMissing, + configuration.WhatIf, configuration.Verbose, + ref error)) + { + TraceOps.ShowMessage(TracePriority.Highest, + debugCallback, traceCallback, thisAssembly, + error, traceCategory, MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return 1; /* FAILURE */ + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region .NET DbProviderFactory + if (configuration.HasFlags( + InstallFlags.DbProviderFactory, true)) + { + bool saved = false; + + if (!ForEachFrameworkConfig(registry, + frameworkList, ProcessDbProviderFactory, + InvariantName, ProviderName, Description, + FactoryTypeName, assemblyName, + directoryData, configuration.ThrowOnMissing, + configuration.WhatIf, configuration.Verbose, + ref saved, ref error)) + { + TraceOps.ShowMessage(TracePriority.Highest, + debugCallback, traceCallback, thisAssembly, + error, traceCategory, MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return 1; /* FAILURE */ + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region VS Package + if (configuration.HasFlags( + InstallFlags.VsPackage, true)) + { + if (!ForEachVsVersionRegistry(registry, + vsList, ProcessVsPackage, package, + fileNameData, configuration.ThrowOnMissing, + configuration.WhatIf, configuration.Verbose, + ref error)) + { + TraceOps.ShowMessage(TracePriority.Highest, + debugCallback, traceCallback, thisAssembly, + error, traceCategory, MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return 1; /* FAILURE */ + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region VS DataSource + if (configuration.HasFlags( + InstallFlags.VsDataSource, true)) + { + if (!ForEachVsVersionRegistry(registry, + vsList, ProcessVsDataSource, package, + fileNameData, configuration.ThrowOnMissing, + configuration.WhatIf, configuration.Verbose, + ref error)) + { + TraceOps.ShowMessage(TracePriority.Highest, + debugCallback, traceCallback, thisAssembly, + error, traceCategory, MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return 1; /* FAILURE */ + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region VS DataProvider + if (configuration.HasFlags( + InstallFlags.VsDataProvider, true)) + { + if (!ForEachVsVersionRegistry(registry, + vsList, ProcessVsDataProvider, package, + fileNameData, configuration.ThrowOnMissing, + configuration.WhatIf, configuration.Verbose, + ref error)) + { + TraceOps.ShowMessage(TracePriority.Highest, + debugCallback, traceCallback, thisAssembly, + error, traceCategory, MessageBoxButtons.OK, + MessageBoxIcon.Error); + + return 1; /* FAILURE */ + } + } + #endregion + + /////////////////////////////////////////////////////////// + + #region Log Summary + TraceOps.DebugAndTrace(TracePriority.Higher, + debugCallback, traceCallback, String.Format( + "subKeysCreated = {0}, subKeysDeleted = {1}, " + + "keyValuesSet = {2}, keyValuesDeleted = {3}", + ForDisplay(RegistryHelper.SubKeysCreated), + ForDisplay(RegistryHelper.SubKeysDeleted), + ForDisplay(RegistryHelper.KeyValuesSet), + ForDisplay(RegistryHelper.KeyValuesDeleted)), + traceCategory); + #endregion + + /////////////////////////////////////////////////////////// + + return 0; /* SUCCESS */ + } + } + catch (Exception e) + { + TraceOps.DebugAndTrace(TracePriority.Highest, + debugCallback, traceCallback, e, traceCategory); + + throw; + } } #endregion } #endregion }