diff options
Diffstat (limited to 'src')
44 files changed, 4263 insertions, 0 deletions
diff --git a/src/Cpp.Build.props b/src/Cpp.Build.props new file mode 100644 index 00000000..453aa442 --- /dev/null +++ b/src/Cpp.Build.props | |||
| @@ -0,0 +1,101 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project> | ||
| 5 | <PropertyGroup> | ||
| 6 | <Platform Condition=" '$(Platform)' == 'AnyCPU' ">Win32</Platform> | ||
| 7 | <BaseOutputPath>$(OutputPath)</BaseOutputPath> | ||
| 8 | <IntDir>$(BaseIntermediateOutputPath)$(Platform)\</IntDir> | ||
| 9 | <OutDir>$(OutputPath)$(Platform)\</OutDir> | ||
| 10 | </PropertyGroup> | ||
| 11 | |||
| 12 | <ItemDefinitionGroup> | ||
| 13 | <ClCompile> | ||
| 14 | <DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings> | ||
| 15 | <WarningLevel>Level4</WarningLevel> | ||
| 16 | <AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||
| 17 | <PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| 18 | <PrecompiledHeader>Use</PrecompiledHeader> | ||
| 19 | <PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile> | ||
| 20 | <CallingConvention>StdCall</CallingConvention> | ||
| 21 | <TreatWarningAsError>true</TreatWarningAsError> | ||
| 22 | <ExceptionHandling>false</ExceptionHandling> | ||
| 23 | <AdditionalOptions>-YlprecompDefine</AdditionalOptions> | ||
| 24 | <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions> | ||
| 25 | <MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) > 4 ">true</MultiProcessorCompilation> | ||
| 26 | </ClCompile> | ||
| 27 | <ResourceCompile> | ||
| 28 | <PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| 29 | <AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||
| 30 | </ResourceCompile> | ||
| 31 | <Lib> | ||
| 32 | <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| 33 | </Lib> | ||
| 34 | <Link> | ||
| 35 | <SubSystem>$(ProjectSubSystem)</SubSystem> | ||
| 36 | <ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile> | ||
| 37 | <NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint> | ||
| 38 | <GenerateDebugInformation>true</GenerateDebugInformation> | ||
| 39 | <AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||
| 40 | <AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> | ||
| 41 | <AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions> | ||
| 42 | </Link> | ||
| 43 | </ItemDefinitionGroup> | ||
| 44 | |||
| 45 | <ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'"> | ||
| 46 | <ClCompile> | ||
| 47 | <EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet> | ||
| 48 | </ClCompile> | ||
| 49 | </ItemDefinitionGroup> | ||
| 50 | <ItemDefinitionGroup Condition=" '$(Platform)'=='arm' "> | ||
| 51 | <ClCompile> | ||
| 52 | <CallingConvention>CDecl</CallingConvention> | ||
| 53 | </ClCompile> | ||
| 54 | </ItemDefinitionGroup> | ||
| 55 | <ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' "> | ||
| 56 | <ClCompile> | ||
| 57 | <DebugInformationFormat>OldStyle</DebugInformationFormat> | ||
| 58 | <OmitDefaultLibName>true</OmitDefaultLibName> | ||
| 59 | <IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries> | ||
| 60 | </ClCompile> | ||
| 61 | </ItemDefinitionGroup> | ||
| 62 | <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' "> | ||
| 63 | <ClCompile> | ||
| 64 | <Optimization>Disabled</Optimization> | ||
| 65 | <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | ||
| 66 | <PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| 67 | <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | ||
| 68 | </ClCompile> | ||
| 69 | </ItemDefinitionGroup> | ||
| 70 | <ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' and '$(CLRSupport)'=='true' "> | ||
| 71 | <ClCompile> | ||
| 72 | <BasicRuntimeChecks></BasicRuntimeChecks> | ||
| 73 | <RuntimeLibrary>MultiThreadedDebugDll</RuntimeLibrary> | ||
| 74 | </ClCompile> | ||
| 75 | </ItemDefinitionGroup> | ||
| 76 | <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' "> | ||
| 77 | <ClCompile> | ||
| 78 | <Optimization>MinSpace</Optimization> | ||
| 79 | <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||
| 80 | <FunctionLevelLinking>true</FunctionLevelLinking> | ||
| 81 | <IntrinsicFunctions>true</IntrinsicFunctions> | ||
| 82 | <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | ||
| 83 | </ClCompile> | ||
| 84 | <Link> | ||
| 85 | <EnableCOMDATFolding>true</EnableCOMDATFolding> | ||
| 86 | <OptimizeReferences>true</OptimizeReferences> | ||
| 87 | </Link> | ||
| 88 | </ItemDefinitionGroup> | ||
| 89 | <ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' and '$(CLRSupport)'=='true' "> | ||
| 90 | <ClCompile> | ||
| 91 | <BasicRuntimeChecks></BasicRuntimeChecks> | ||
| 92 | <RuntimeLibrary>MultiThreadedDll</RuntimeLibrary> | ||
| 93 | </ClCompile> | ||
| 94 | </ItemDefinitionGroup> | ||
| 95 | <ItemDefinitionGroup Condition=" '$(CLRSupport)'=='true' "> | ||
| 96 | <Link> | ||
| 97 | <KeyFile>$(LinkKeyFile)</KeyFile> | ||
| 98 | <DelaySign>$(LinkDelaySign)</DelaySign> | ||
| 99 | </Link> | ||
| 100 | </ItemDefinitionGroup> | ||
| 101 | </Project> | ||
diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 00000000..63ad5d6e --- /dev/null +++ b/src/Directory.Build.props | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project> | ||
| 5 | <PropertyGroup> | ||
| 6 | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||
| 7 | <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | ||
| 8 | <BaseIntermediateOutputPath>$(MSBuildThisFileDirectory)..\build\obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath> | ||
| 9 | <OutputPath>$(MSBuildThisFileDirectory)..\build\$(Configuration)\</OutputPath> | ||
| 10 | |||
| 11 | <Authors>WiX Toolset Team</Authors> | ||
| 12 | <Company>WiX Toolset</Company> | ||
| 13 | <Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright> | ||
| 14 | </PropertyGroup> | ||
| 15 | |||
| 16 | <PropertyGroup> | ||
| 17 | <WixToolsetRootFolder>$(MSBuildThisFileDirectory)..\..\</WixToolsetRootFolder> | ||
| 18 | </PropertyGroup> | ||
| 19 | |||
| 20 | <Import Project="Cpp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.vcxproj' " /> | ||
| 21 | <Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " /> | ||
| 22 | </Project> | ||
diff --git a/src/FindLocalWix.props b/src/FindLocalWix.props new file mode 100644 index 00000000..c33939ea --- /dev/null +++ b/src/FindLocalWix.props | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| 5 | <PropertyGroup> | ||
| 6 | <WixTargetsPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Core\README.md') ">$(MSBuildThisFileDirectory)..\..\Core\build\Debug\net461\wix.targets</WixTargetsPath> | ||
| 7 | |||
| 8 | <WixToolsetUtilWixextPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Util.wixext\README.md') ">$(MSBuildThisFileDirectory)..\..\Util.wixext\build\Debug\netstandard2.0\WixToolset.Util.wixext.dll</WixToolsetUtilWixextPath> | ||
| 9 | </PropertyGroup> | ||
| 10 | </Project> | ||
diff --git a/src/ca/cost.h b/src/ca/cost.h new file mode 100644 index 00000000..95368eba --- /dev/null +++ b/src/ca/cost.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #pragma once | ||
| 2 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 3 | |||
| 4 | |||
| 5 | const UINT COST_NGEN_BLOCKING = 5000; | ||
| 6 | const UINT COST_NGEN_NONBLOCKING = 500; | ||
| 7 | |||
diff --git a/src/ca/dllmain.cpp b/src/ca/dllmain.cpp new file mode 100644 index 00000000..df53f872 --- /dev/null +++ b/src/ca/dllmain.cpp | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | /******************************************************************** | ||
| 6 | DllMain - standard entry point for all WiX CustomActions | ||
| 7 | |||
| 8 | ********************************************************************/ | ||
| 9 | extern "C" BOOL WINAPI DllMain( | ||
| 10 | IN HINSTANCE hInst, | ||
| 11 | IN ULONG ulReason, | ||
| 12 | IN LPVOID) | ||
| 13 | { | ||
| 14 | switch(ulReason) | ||
| 15 | { | ||
| 16 | case DLL_PROCESS_ATTACH: | ||
| 17 | WcaGlobalInitialize(hInst); | ||
| 18 | break; | ||
| 19 | |||
| 20 | case DLL_PROCESS_DETACH: | ||
| 21 | WcaGlobalFinalize(); | ||
| 22 | break; | ||
| 23 | } | ||
| 24 | |||
| 25 | return TRUE; | ||
| 26 | } | ||
diff --git a/src/ca/netfxca.cpp b/src/ca/netfxca.cpp new file mode 100644 index 00000000..15802f2b --- /dev/null +++ b/src/ca/netfxca.cpp | |||
| @@ -0,0 +1,823 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | #include "precomp.h" | ||
| 4 | |||
| 5 | #define NGEN_DEBUG 0x0001 | ||
| 6 | #define NGEN_NODEP 0x0002 | ||
| 7 | #define NGEN_PROFILE 0x0004 | ||
| 8 | #define NGEN_32BIT 0x0008 | ||
| 9 | #define NGEN_64BIT 0x0010 | ||
| 10 | |||
| 11 | #define NGEN_TIMEOUT 60000 // 60 seconds | ||
| 12 | |||
| 13 | // If you change one of these strings, be sure to change the appropriate EmptyFormattedLength variable right below | ||
| 14 | LPCWSTR vpwzUnformattedQuotedFile = L"\"[#%s]\""; | ||
| 15 | LPCWSTR vpwzUnformattedQuotedDirectory = L"\"[%s]\\\""; | ||
| 16 | |||
| 17 | // These represent the length of the above strings in the case that the property resolves to an empty string | ||
| 18 | const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_FILE = 2; | ||
| 19 | const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY = 3; | ||
| 20 | |||
| 21 | LPCWSTR vcsFileId = | ||
| 22 | L"SELECT `File` FROM `File` WHERE `File`=?"; | ||
| 23 | enum eFileId { fiFile = 1 }; | ||
| 24 | |||
| 25 | LPCWSTR vcsNgenQuery = | ||
| 26 | L"SELECT `NetFxNativeImage`.`File_`, `NetFxNativeImage`.`NetFxNativeImage`, `NetFxNativeImage`.`Priority`, `NetFxNativeImage`.`Attributes`, `NetFxNativeImage`.`File_Application`, `NetFxNativeImage`.`Directory_ApplicationBase`, `File`.`Component_` " | ||
| 27 | L"FROM `NetFxNativeImage`, `File` WHERE `File`.`File`=`NetFxNativeImage`.`File_`"; | ||
| 28 | enum eNgenQuery { ngqFile = 1, ngqId, ngqPriority, ngqAttributes, ngqFileApp, ngqDirAppBase, ngqComponent }; | ||
| 29 | |||
| 30 | LPCWSTR vcsNgenGac = | ||
| 31 | L"SELECT `MsiAssembly`.`File_Application` " | ||
| 32 | L"FROM `File`, `MsiAssembly` WHERE `File`.`Component_`=`MsiAssembly`.`Component_` AND `File`.`File`=?"; | ||
| 33 | enum eNgenGac { nggApplication = 1 }; | ||
| 34 | |||
| 35 | LPCWSTR vcsNgenStrongName = | ||
| 36 | L"SELECT `Name`,`Value` FROM `MsiAssemblyName` WHERE `Component_`=?"; | ||
| 37 | enum eNgenStrongName { ngsnName = 1, ngsnValue }; | ||
| 38 | |||
| 39 | // Searches subdirectories of the given path for the highest version of ngen.exe available | ||
| 40 | static HRESULT GetNgenVersion( | ||
| 41 | __in LPWSTR pwzParentPath, | ||
| 42 | __out LPWSTR* ppwzVersion | ||
| 43 | ) | ||
| 44 | { | ||
| 45 | Assert(pwzParentPath); | ||
| 46 | |||
| 47 | HRESULT hr = S_OK; | ||
| 48 | DWORD dwError = 0; | ||
| 49 | DWORD dwNgenFileFlags = 0; | ||
| 50 | |||
| 51 | LPWSTR pwzVersionSearch = NULL; | ||
| 52 | LPWSTR pwzNgen = NULL; | ||
| 53 | LPWSTR pwzTemp = NULL; | ||
| 54 | LPWSTR pwzTempVersion = NULL; | ||
| 55 | DWORD dwMaxMajorVersion = 0; // This stores the highest major version we've seen so far | ||
| 56 | DWORD dwMaxMinorVersion = 0; // This stores the minor version of the highest major version we've seen so far | ||
| 57 | DWORD dwMajorVersion = 0; // This stores the major version of the directory we're currently considering | ||
| 58 | DWORD dwMinorVersion = 0; // This stores the minor version of the directory we're currently considering | ||
| 59 | BOOL fFound = TRUE; | ||
| 60 | WIN32_FIND_DATAW wfdVersionDirectories; | ||
| 61 | HANDLE hFind = INVALID_HANDLE_VALUE; | ||
| 62 | |||
| 63 | hr = StrAllocFormatted(&pwzVersionSearch, L"%s*", pwzParentPath); | ||
| 64 | ExitOnFailure(hr, "failed to create outer directory search string from string %ls", pwzParentPath); | ||
| 65 | hFind = FindFirstFileW(pwzVersionSearch, &wfdVersionDirectories); | ||
| 66 | if (hFind == INVALID_HANDLE_VALUE) | ||
| 67 | { | ||
| 68 | ExitWithLastError(hr, "failed to call FindFirstFileW with string %ls", pwzVersionSearch); | ||
| 69 | } | ||
| 70 | |||
| 71 | while (fFound) | ||
| 72 | { | ||
| 73 | pwzTempVersion = (LPWSTR)&(wfdVersionDirectories.cFileName); | ||
| 74 | |||
| 75 | // Explicitly exclude v1.1.4322, which isn't backwards compatible and is not supported | ||
| 76 | if (wfdVersionDirectories.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) | ||
| 77 | { | ||
| 78 | if (0 != lstrcmpW(L"v1.1.4322", pwzTempVersion)) | ||
| 79 | { | ||
| 80 | // A potential candidate directory was found to run ngen from - let's make sure ngen actually exists here | ||
| 81 | hr = StrAllocFormatted(&pwzNgen, L"%s%s\\ngen.exe", pwzParentPath, pwzTempVersion); | ||
| 82 | ExitOnFailure(hr, "failed to create inner ngen search string with strings %ls and %ls", pwzParentPath, pwzTempVersion); | ||
| 83 | |||
| 84 | // If Ngen.exe does exist as a file here, then let's check the file version | ||
| 85 | if (FileExistsEx(pwzNgen, &dwNgenFileFlags) && (0 == (dwNgenFileFlags & FILE_ATTRIBUTE_DIRECTORY))) | ||
| 86 | { | ||
| 87 | hr = FileVersion(pwzNgen, &dwMajorVersion, &dwMinorVersion); | ||
| 88 | |||
| 89 | if (FAILED(hr)) | ||
| 90 | { | ||
| 91 | WcaLog(LOGMSG_VERBOSE, "Failed to get version of %ls - continuing", pwzNgen); | ||
| 92 | } | ||
| 93 | else if (dwMajorVersion > dwMaxMajorVersion || (dwMajorVersion == dwMaxMajorVersion && dwMinorVersion > dwMaxMinorVersion)) | ||
| 94 | { | ||
| 95 | // If the version we found is the highest we've seen so far in this search, it will be our new best-so-far candidate | ||
| 96 | hr = StrAllocString(ppwzVersion, pwzTempVersion, 0); | ||
| 97 | ExitOnFailure(hr, "failed to copy temp version string %ls to version string", pwzTempVersion); | ||
| 98 | // Add one for the backslash after the directory name | ||
| 99 | WcaLog(LOGMSG_VERBOSE, "Found highest-so-far version of ngen.exe (in directory %ls, version %u.%u.%u.%u)", *ppwzVersion, (DWORD)HIWORD(dwMajorVersion), (DWORD)LOWORD(dwMajorVersion), (DWORD)HIWORD(dwMinorVersion), (DWORD)LOWORD(dwMinorVersion)); | ||
| 100 | |||
| 101 | dwMaxMajorVersion = dwMajorVersion; | ||
| 102 | dwMaxMinorVersion = dwMinorVersion; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | else | ||
| 106 | { | ||
| 107 | WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it doesn't contain the file ngen.exe", pwzTempVersion); | ||
| 108 | } | ||
| 109 | } | ||
| 110 | else | ||
| 111 | { | ||
| 112 | WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it is from .NET Framework v1.1, which is not backwards compatible with other versions of the Framework and thus is not supported by this custom action.", pwzTempVersion); | ||
| 113 | } | ||
| 114 | } | ||
| 115 | else | ||
| 116 | { | ||
| 117 | WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it isn't a directory", pwzTempVersion); | ||
| 118 | } | ||
| 119 | |||
| 120 | fFound = FindNextFileW(hFind, &wfdVersionDirectories); | ||
| 121 | |||
| 122 | if (!fFound) | ||
| 123 | { | ||
| 124 | dwError = ::GetLastError(); | ||
| 125 | hr = (ERROR_NO_MORE_FILES == dwError) ? ERROR_SUCCESS : HRESULT_FROM_WIN32(dwError); | ||
| 126 | ExitOnFailure(hr, "Failed to call FindNextFileW() with query %ls", pwzVersionSearch); | ||
| 127 | } | ||
| 128 | } | ||
| 129 | |||
| 130 | if (NULL == *ppwzVersion) | ||
| 131 | { | ||
| 132 | hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); | ||
| 133 | ExitOnRootFailure(hr, "Searched through all subdirectories of %ls, but failed to find any version of ngen.exe", pwzParentPath); | ||
| 134 | } | ||
| 135 | else | ||
| 136 | { | ||
| 137 | WcaLog(LOGMSG_VERBOSE, "Using highest version of ngen found, located in this subdirectory: %ls, version %u.%u.%u.%u", *ppwzVersion, (DWORD)HIWORD(dwMajorVersion), (DWORD)LOWORD(dwMajorVersion), (DWORD)HIWORD(dwMinorVersion), (DWORD)LOWORD(dwMinorVersion)); | ||
| 138 | } | ||
| 139 | |||
| 140 | LExit: | ||
| 141 | if (hFind != INVALID_HANDLE_VALUE) | ||
| 142 | { | ||
| 143 | if (0 == FindClose(hFind)) | ||
| 144 | { | ||
| 145 | dwError = ::GetLastError(); | ||
| 146 | hr = HRESULT_FROM_WIN32(dwError); | ||
| 147 | WcaLog(LOGMSG_STANDARD, "Failed to close handle created by outer FindFirstFile with error %x - continuing", hr); | ||
| 148 | } | ||
| 149 | hFind = INVALID_HANDLE_VALUE; | ||
| 150 | } | ||
| 151 | |||
| 152 | ReleaseStr(pwzVersionSearch); | ||
| 153 | ReleaseStr(pwzNgen); | ||
| 154 | ReleaseStr(pwzTemp); | ||
| 155 | // Purposely don't release pwzTempVersion, because it wasn't allocated in this function, it's just a pointer to a string inside wfdVersionDirectories | ||
| 156 | |||
| 157 | return hr; | ||
| 158 | } | ||
| 159 | |||
| 160 | // Gets the path to ngen.exe | ||
| 161 | static HRESULT GetNgenPath( | ||
| 162 | __out LPWSTR* ppwzNgenPath, | ||
| 163 | __in BOOL f64BitFramework | ||
| 164 | ) | ||
| 165 | { | ||
| 166 | Assert(ppwzNgenPath); | ||
| 167 | HRESULT hr = S_OK; | ||
| 168 | |||
| 169 | LPWSTR pwzVersion = NULL; | ||
| 170 | LPWSTR pwzWindowsFolder = NULL; | ||
| 171 | |||
| 172 | hr = WcaGetProperty(L"WindowsFolder", &pwzWindowsFolder); | ||
| 173 | ExitOnFailure(hr, "failed to get WindowsFolder property"); | ||
| 174 | |||
| 175 | hr = StrAllocString(ppwzNgenPath, pwzWindowsFolder, 0); | ||
| 176 | ExitOnFailure(hr, "failed to copy to NgenPath windows folder: %ls", pwzWindowsFolder); | ||
| 177 | |||
| 178 | if (f64BitFramework) | ||
| 179 | { | ||
| 180 | WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 64-bit framework path"); | ||
| 181 | |||
| 182 | hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework64\\", 0); | ||
| 183 | ExitOnFailure(hr, "failed to copy platform portion of ngen path"); | ||
| 184 | } | ||
| 185 | else | ||
| 186 | { | ||
| 187 | WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 32-bit framework path"); | ||
| 188 | |||
| 189 | hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework\\", 0); | ||
| 190 | ExitOnFailure(hr, "failed to copy platform portion of ngen path"); | ||
| 191 | } | ||
| 192 | |||
| 193 | // We want to run the highest version of ngen possible, because they should be backwards compatible - so let's find the most appropriate directory now | ||
| 194 | hr = GetNgenVersion(*ppwzNgenPath, &pwzVersion); | ||
| 195 | ExitOnFailure(hr, "failed to search for ngen under path %ls", *ppwzNgenPath); | ||
| 196 | |||
| 197 | hr = StrAllocConcat(ppwzNgenPath, pwzVersion, 0); | ||
| 198 | ExitOnFailure(hr, "failed to copy version portion of ngen path"); | ||
| 199 | |||
| 200 | hr = StrAllocConcat(ppwzNgenPath, L"\\ngen.exe", 0); | ||
| 201 | ExitOnFailure(hr, "failed to copy \"\\ngen.exe\" portion of ngen path"); | ||
| 202 | |||
| 203 | LExit: | ||
| 204 | ReleaseStr(pwzVersion); | ||
| 205 | ReleaseStr(pwzWindowsFolder); | ||
| 206 | |||
| 207 | return hr; | ||
| 208 | } | ||
| 209 | |||
| 210 | |||
| 211 | static HRESULT GetStrongName( | ||
| 212 | __out LPWSTR* ppwzStrongName, | ||
| 213 | __in LPCWSTR pwzComponent | ||
| 214 | ) | ||
| 215 | { | ||
| 216 | Assert(ppwzStrongName); | ||
| 217 | HRESULT hr = S_OK; | ||
| 218 | |||
| 219 | PMSIHANDLE hView = NULL; | ||
| 220 | PMSIHANDLE hComponentRec = NULL; | ||
| 221 | PMSIHANDLE hRec = NULL; | ||
| 222 | |||
| 223 | LPWSTR pwzData = NULL; | ||
| 224 | LPWSTR pwzName = NULL; | ||
| 225 | LPWSTR pwzVersion = NULL; | ||
| 226 | LPWSTR pwzCulture = NULL; | ||
| 227 | LPWSTR pwzPublicKeyToken = NULL; | ||
| 228 | |||
| 229 | hComponentRec = ::MsiCreateRecord(1); | ||
| 230 | hr = WcaSetRecordString(hComponentRec, 1, pwzComponent); | ||
| 231 | ExitOnFailure(hr, "failed to set component value in record to: %ls", pwzComponent); | ||
| 232 | |||
| 233 | // get the name value records for this component | ||
| 234 | hr = WcaOpenView(vcsNgenStrongName, &hView); | ||
| 235 | ExitOnFailure(hr, "failed to open view on NetFxNativeImage table"); | ||
| 236 | |||
| 237 | hr = WcaExecuteView(hView, hComponentRec); | ||
| 238 | ExitOnFailure(hr, "failed to execute strong name view"); | ||
| 239 | |||
| 240 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) | ||
| 241 | { | ||
| 242 | hr = WcaGetRecordString(hRec, ngsnName, &pwzData); | ||
| 243 | ExitOnFailure(hr, "failed to get MsiAssemblyName.Name for component: %ls", pwzComponent); | ||
| 244 | |||
| 245 | if (0 == lstrcmpW(L"name", pwzData)) | ||
| 246 | { | ||
| 247 | hr = WcaGetRecordString(hRec, ngsnValue, &pwzName); | ||
| 248 | ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData); | ||
| 249 | } | ||
| 250 | else if (0 == lstrcmpW(L"version", pwzData)) | ||
| 251 | { | ||
| 252 | hr = WcaGetRecordString(hRec, ngsnValue, &pwzVersion); | ||
| 253 | ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData); | ||
| 254 | } | ||
| 255 | else if (0 == lstrcmpW(L"culture", pwzData)) | ||
| 256 | { | ||
| 257 | hr = WcaGetRecordString(hRec, ngsnValue, &pwzCulture); | ||
| 258 | ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData); | ||
| 259 | } | ||
| 260 | else if (0 == lstrcmpW(L"publicKeyToken", pwzData)) | ||
| 261 | { | ||
| 262 | hr = WcaGetRecordString(hRec, ngsnValue, &pwzPublicKeyToken); | ||
| 263 | ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData); | ||
| 264 | } | ||
| 265 | } | ||
| 266 | if (E_NOMOREITEMS == hr) | ||
| 267 | hr = S_OK; | ||
| 268 | ExitOnFailure(hr, "failed while looping through all names and values in MsiAssemblyName table for component: %ls", pwzComponent); | ||
| 269 | |||
| 270 | hr = StrAllocFormatted(ppwzStrongName, L"\"%s, Version=%s, Culture=%s, PublicKeyToken=%s\"", pwzName, pwzVersion, pwzCulture, pwzPublicKeyToken); | ||
| 271 | ExitOnFailure(hr, "failed to format strong name for component: %ls", pwzComponent); | ||
| 272 | |||
| 273 | LExit: | ||
| 274 | ReleaseStr(pwzData); | ||
| 275 | ReleaseStr(pwzName); | ||
| 276 | ReleaseStr(pwzVersion); | ||
| 277 | ReleaseStr(pwzCulture); | ||
| 278 | ReleaseStr(pwzPublicKeyToken); | ||
| 279 | |||
| 280 | return hr; | ||
| 281 | } | ||
| 282 | |||
| 283 | static HRESULT CreateInstallCommand( | ||
| 284 | __out LPWSTR* ppwzCommandLine, | ||
| 285 | __in LPCWSTR pwzNgenPath, | ||
| 286 | __in LPCWSTR pwzFile, | ||
| 287 | __in int iPriority, | ||
| 288 | __in int iAttributes, | ||
| 289 | __in LPCWSTR pwzFileApp, | ||
| 290 | __in LPCWSTR pwzDirAppBase | ||
| 291 | ) | ||
| 292 | { | ||
| 293 | Assert(ppwzCommandLine && pwzNgenPath && *pwzNgenPath && pwzFile && *pwzFile&& pwzFileApp && pwzDirAppBase); | ||
| 294 | HRESULT hr = S_OK; | ||
| 295 | |||
| 296 | LPWSTR pwzQueueString = NULL; | ||
| 297 | |||
| 298 | hr = StrAllocFormatted(ppwzCommandLine, L"%s install %s", pwzNgenPath, pwzFile); | ||
| 299 | ExitOnFailure(hr, "failed to assemble install command line"); | ||
| 300 | |||
| 301 | if (iPriority > 0) | ||
| 302 | { | ||
| 303 | hr = StrAllocFormatted(&pwzQueueString, L" /queue:%d", iPriority); | ||
| 304 | ExitOnFailure(hr, "failed to format queue string"); | ||
| 305 | |||
| 306 | hr = StrAllocConcat(ppwzCommandLine, pwzQueueString, 0); | ||
| 307 | ExitOnFailure(hr, "failed to add queue string to NGEN command line"); | ||
| 308 | } | ||
| 309 | |||
| 310 | if (NGEN_DEBUG & iAttributes) | ||
| 311 | { | ||
| 312 | hr = StrAllocConcat(ppwzCommandLine, L" /Debug", 0); | ||
| 313 | ExitOnFailure(hr, "failed to add debug to NGEN command line"); | ||
| 314 | } | ||
| 315 | |||
| 316 | if (NGEN_PROFILE & iAttributes) | ||
| 317 | { | ||
| 318 | hr = StrAllocConcat(ppwzCommandLine, L" /Profile", 0); | ||
| 319 | ExitOnFailure(hr, "failed to add profile to NGEN command line"); | ||
| 320 | } | ||
| 321 | |||
| 322 | if (NGEN_NODEP & iAttributes) | ||
| 323 | { | ||
| 324 | hr = StrAllocConcat(ppwzCommandLine, L" /NoDependencies", 0); | ||
| 325 | ExitOnFailure(hr, "failed to add no dependencies to NGEN command line"); | ||
| 326 | } | ||
| 327 | |||
| 328 | // If it's more than just two quotes around an empty string | ||
| 329 | if (EMPTY_FORMATTED_LENGTH_QUOTED_FILE < lstrlenW(pwzFileApp)) | ||
| 330 | { | ||
| 331 | hr = StrAllocConcat(ppwzCommandLine, L" /ExeConfig:", 0); | ||
| 332 | ExitOnFailure(hr, "failed to add exe config to NGEN command line"); | ||
| 333 | |||
| 334 | hr = StrAllocConcat(ppwzCommandLine, pwzFileApp, 0); | ||
| 335 | ExitOnFailure(hr, "failed to add file app to NGEN command line"); | ||
| 336 | } | ||
| 337 | |||
| 338 | // If it's more than just two quotes around a backslash | ||
| 339 | if (EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY < lstrlenW(pwzDirAppBase)) | ||
| 340 | { | ||
| 341 | hr = StrAllocConcat(ppwzCommandLine, L" /AppBase:", 0); | ||
| 342 | ExitOnFailure(hr, "failed to add app base to NGEN command line"); | ||
| 343 | |||
| 344 | hr = StrAllocConcat(ppwzCommandLine, pwzDirAppBase, 0); | ||
| 345 | ExitOnFailure(hr, "failed to add dir app base to NGEN command line"); | ||
| 346 | } | ||
| 347 | |||
| 348 | LExit: | ||
| 349 | return hr; | ||
| 350 | } | ||
| 351 | |||
| 352 | /****************************************************************** | ||
| 353 | FileIdExists - checks if the file ID is found in the File table | ||
| 354 | |||
| 355 | returns S_OK if the file exists; S_FALSE if not; otherwise, error | ||
| 356 | ********************************************************************/ | ||
| 357 | static HRESULT FileIdExists( | ||
| 358 | __in_opt LPCWSTR wzFile | ||
| 359 | ) | ||
| 360 | { | ||
| 361 | HRESULT hr = S_OK; | ||
| 362 | PMSIHANDLE hView = NULL; | ||
| 363 | PMSIHANDLE hRec = NULL; | ||
| 364 | |||
| 365 | if (!wzFile) | ||
| 366 | { | ||
| 367 | hr = S_FALSE; | ||
| 368 | ExitFunction(); | ||
| 369 | } | ||
| 370 | |||
| 371 | hRec = ::MsiCreateRecord(1); | ||
| 372 | hr = WcaSetRecordString(hRec, fiFile, wzFile); | ||
| 373 | ExitOnFailure(hr, "failed to create a record with the file: %ls", wzFile); | ||
| 374 | |||
| 375 | hr = WcaTableExists(L"File"); | ||
| 376 | if (S_OK == hr) | ||
| 377 | { | ||
| 378 | hr = WcaOpenView(vcsFileId, &hView); | ||
| 379 | ExitOnFailure(hr, "failed to open view on File table"); | ||
| 380 | |||
| 381 | hr = WcaExecuteView(hView, hRec); | ||
| 382 | ExitOnFailure(hr, "failed to execute view on File table"); | ||
| 383 | |||
| 384 | // Reuse the same record; the handle will be released. | ||
| 385 | hr = WcaFetchSingleRecord(hView, &hRec); | ||
| 386 | ExitOnFailure(hr, "failed to fetch File from File table"); | ||
| 387 | } | ||
| 388 | |||
| 389 | LExit: | ||
| 390 | |||
| 391 | return hr; | ||
| 392 | } | ||
| 393 | |||
| 394 | /****************************************************************** | ||
| 395 | SchedNetFx - entry point for NetFx Custom Action | ||
| 396 | |||
| 397 | ********************************************************************/ | ||
| 398 | extern "C" UINT __stdcall SchedNetFx( | ||
| 399 | __in MSIHANDLE hInstall | ||
| 400 | ) | ||
| 401 | { | ||
| 402 | // AssertSz(FALSE, "debug SchedNetFx"); | ||
| 403 | |||
| 404 | HRESULT hr = S_OK; | ||
| 405 | UINT er = ERROR_SUCCESS; | ||
| 406 | |||
| 407 | LPWSTR pwzInstallCustomActionData = NULL; | ||
| 408 | LPWSTR pwzUninstallCustomActionData = NULL; | ||
| 409 | UINT uiCost = 0; | ||
| 410 | |||
| 411 | PMSIHANDLE hView = NULL; | ||
| 412 | PMSIHANDLE hRec = NULL; | ||
| 413 | PMSIHANDLE hViewGac = NULL; | ||
| 414 | PMSIHANDLE hRecGac = NULL; | ||
| 415 | |||
| 416 | LPWSTR pwzId = NULL; | ||
| 417 | LPWSTR pwzData = NULL; | ||
| 418 | LPWSTR pwzTemp = NULL; | ||
| 419 | LPWSTR pwzFile = NULL; | ||
| 420 | int iPriority = 0; | ||
| 421 | int iAssemblyCost = 0; | ||
| 422 | int iAttributes = 0; | ||
| 423 | LPWSTR pwzFileApp = NULL; | ||
| 424 | LPWSTR pwzDirAppBase = NULL; | ||
| 425 | LPWSTR pwzComponent = NULL; | ||
| 426 | |||
| 427 | INSTALLSTATE isInstalled; | ||
| 428 | INSTALLSTATE isAction; | ||
| 429 | |||
| 430 | LPWSTR pwz32Ngen = NULL; | ||
| 431 | LPWSTR pwz64Ngen = NULL; | ||
| 432 | |||
| 433 | BOOL f32NgenExeExists = FALSE; | ||
| 434 | BOOL f64NgenExeExists = FALSE; | ||
| 435 | |||
| 436 | BOOL fNeedInstallUpdate32 = FALSE; | ||
| 437 | BOOL fNeedUninstallUpdate32 = FALSE; | ||
| 438 | BOOL fNeedInstallUpdate64 = FALSE; | ||
| 439 | BOOL fNeedUninstallUpdate64 = FALSE; | ||
| 440 | |||
| 441 | // initialize | ||
| 442 | hr = WcaInitialize(hInstall, "SchedNetFx"); | ||
| 443 | ExitOnFailure(hr, "failed to initialize"); | ||
| 444 | |||
| 445 | hr = GetNgenPath(&pwz32Ngen, FALSE); | ||
| 446 | f32NgenExeExists = SUCCEEDED(hr); | ||
| 447 | if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) | ||
| 448 | { | ||
| 449 | hr = ERROR_SUCCESS; | ||
| 450 | WcaLog(LOGMSG_STANDARD, "Failed to find 32bit ngen. No actions will be scheduled to create native images for 32bit."); | ||
| 451 | } | ||
| 452 | ExitOnFailure(hr, "failed to get 32bit ngen.exe path"); | ||
| 453 | |||
| 454 | hr = GetNgenPath(&pwz64Ngen, TRUE); | ||
| 455 | f64NgenExeExists = SUCCEEDED(hr); | ||
| 456 | if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) | ||
| 457 | { | ||
| 458 | hr = ERROR_SUCCESS; | ||
| 459 | WcaLog(LOGMSG_STANDARD, "Failed to find 64bit ngen. No actions will be scheduled to create native images for 64bit."); | ||
| 460 | } | ||
| 461 | ExitOnFailure(hr, "failed to get 64bit ngen.exe path"); | ||
| 462 | |||
| 463 | // loop through all the NetFx records | ||
| 464 | hr = WcaOpenExecuteView(vcsNgenQuery, &hView); | ||
| 465 | ExitOnFailure(hr, "failed to open view on NetFxNativeImage table"); | ||
| 466 | |||
| 467 | while (S_OK == (hr = WcaFetchRecord(hView, &hRec))) | ||
| 468 | { | ||
| 469 | // Get Id | ||
| 470 | hr = WcaGetRecordString(hRec, ngqId, &pwzId); | ||
| 471 | ExitOnFailure(hr, "failed to get NetFxNativeImage.NetFxNativeImage"); | ||
| 472 | |||
| 473 | // Get File | ||
| 474 | hr = WcaGetRecordString(hRec, ngqFile, &pwzData); | ||
| 475 | ExitOnFailure(hr, "failed to get NetFxNativeImage.File_ for record: %ls", pwzId); | ||
| 476 | hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData); | ||
| 477 | ExitOnFailure(hr, "failed to format file string for file: %ls", pwzData); | ||
| 478 | hr = WcaGetFormattedString(pwzTemp, &pwzFile); | ||
| 479 | ExitOnFailure(hr, "failed to get formatted string for file: %ls", pwzData); | ||
| 480 | |||
| 481 | // Get Priority | ||
| 482 | hr = WcaGetRecordInteger(hRec, ngqPriority, &iPriority); | ||
| 483 | ExitOnFailure(hr, "failed to get NetFxNativeImage.Priority for record: %ls", pwzId); | ||
| 484 | |||
| 485 | if (0 == iPriority) | ||
| 486 | iAssemblyCost = COST_NGEN_BLOCKING; | ||
| 487 | else | ||
| 488 | iAssemblyCost = COST_NGEN_NONBLOCKING; | ||
| 489 | |||
| 490 | // Get Attributes | ||
| 491 | hr = WcaGetRecordInteger(hRec, ngqAttributes, &iAttributes); | ||
| 492 | ExitOnFailure(hr, "failed to get NetFxNativeImage.Attributes for record: %ls", pwzId); | ||
| 493 | |||
| 494 | // Get File_Application or leave pwzFileApp NULL. | ||
| 495 | hr = WcaGetRecordFormattedString(hRec, ngqFileApp, &pwzData); | ||
| 496 | ExitOnFailure(hr, "failed to get NetFxNativeImage.File_Application for record: %ls", pwzId); | ||
| 497 | |||
| 498 | // Check if the value resolves to a valid file ID. | ||
| 499 | if (S_OK == FileIdExists(pwzData)) | ||
| 500 | { | ||
| 501 | // Resolve the file ID to a path. | ||
| 502 | hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData); | ||
| 503 | ExitOnFailure(hr, "failed to format file application string for file: %ls", pwzData); | ||
| 504 | |||
| 505 | hr = WcaGetFormattedString(pwzTemp, &pwzFileApp); | ||
| 506 | ExitOnFailure(hr, "failed to get formatted string for file application: %ls", pwzData); | ||
| 507 | } | ||
| 508 | else | ||
| 509 | { | ||
| 510 | // Assume record formatted to a path already. | ||
| 511 | hr = StrAllocString(&pwzFileApp, pwzData, 0); | ||
| 512 | ExitOnFailure(hr, "failed to allocate string for file path: %ls", pwzData); | ||
| 513 | |||
| 514 | hr = PathEnsureQuoted(&pwzFileApp, FALSE); | ||
| 515 | ExitOnFailure(hr, "failed to quote file path: %ls", pwzData); | ||
| 516 | } | ||
| 517 | |||
| 518 | // Get Directory_ApplicationBase or leave pwzDirAppBase NULL. | ||
| 519 | hr = WcaGetRecordFormattedString(hRec, ngqDirAppBase, &pwzData); | ||
| 520 | ExitOnFailure(hr, "failed to get NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId); | ||
| 521 | |||
| 522 | if (WcaIsUnicodePropertySet(pwzData)) | ||
| 523 | { | ||
| 524 | // Resolve the directory ID to a path. | ||
| 525 | hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedDirectory, pwzData); | ||
| 526 | ExitOnFailure(hr, "failed to format directory application base string for property: %ls", pwzData); | ||
| 527 | |||
| 528 | hr = WcaGetFormattedString(pwzTemp, &pwzDirAppBase); | ||
| 529 | ExitOnFailure(hr, "failed to get formatted string for directory application base: %ls", pwzData); | ||
| 530 | } | ||
| 531 | else | ||
| 532 | { | ||
| 533 | // Assume record formatted to a path already. | ||
| 534 | hr = StrAllocString(&pwzDirAppBase, pwzData, 0); | ||
| 535 | ExitOnFailure(hr, "failed to allocate string for directory path: %ls", pwzData); | ||
| 536 | |||
| 537 | hr = PathEnsureQuoted(&pwzDirAppBase, TRUE); | ||
| 538 | ExitOnFailure(hr, "failed to quote and backslashify directory: %ls", pwzData); | ||
| 539 | } | ||
| 540 | |||
| 541 | // Get Component | ||
| 542 | hr = WcaGetRecordString(hRec, ngqComponent, &pwzComponent); | ||
| 543 | ExitOnFailure(hr, "failed to get NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId); | ||
| 544 | er = ::MsiGetComponentStateW(hInstall, pwzComponent, &isInstalled, &isAction); | ||
| 545 | ExitOnWin32Error(er, hr, "failed to get install state for Component: %ls", pwzComponent); | ||
| 546 | |||
| 547 | // | ||
| 548 | // Figure out if it's going to be GAC'd. The possibility exists that no assemblies are going to be GAC'd | ||
| 549 | // so we have to check for the MsiAssembly table first. | ||
| 550 | // | ||
| 551 | if (S_OK == WcaTableExists(L"MsiAssembly")) | ||
| 552 | { | ||
| 553 | hr = WcaOpenView(vcsNgenGac, &hViewGac); | ||
| 554 | ExitOnFailure(hr, "failed to open view on File/MsiAssembly table"); | ||
| 555 | |||
| 556 | hr = WcaExecuteView(hViewGac, hRec); | ||
| 557 | ExitOnFailure(hr, "failed to execute view on File/MsiAssembly table"); | ||
| 558 | |||
| 559 | hr = WcaFetchSingleRecord(hViewGac, &hRecGac); | ||
| 560 | ExitOnFailure(hr, "failed to fetch File_Assembly from File/MsiAssembly table"); | ||
| 561 | |||
| 562 | if (S_FALSE != hr) | ||
| 563 | { | ||
| 564 | hr = WcaGetRecordString(hRecGac, nggApplication, &pwzData); | ||
| 565 | ExitOnFailure(hr, "failed to get MsiAssembly.File_Application"); | ||
| 566 | |||
| 567 | // If it's in the GAC replace the file name with the strong name | ||
| 568 | if (L'\0' == pwzData[0]) | ||
| 569 | { | ||
| 570 | hr = GetStrongName(&pwzFile, pwzComponent); | ||
| 571 | ExitOnFailure(hr, "failed to get strong name for component: %ls", pwzData); | ||
| 572 | } | ||
| 573 | } | ||
| 574 | } | ||
| 575 | |||
| 576 | // | ||
| 577 | // Schedule the work | ||
| 578 | // | ||
| 579 | if (!(iAttributes & NGEN_32BIT) && !(iAttributes & NGEN_64BIT)) | ||
| 580 | ExitOnFailure(hr = E_INVALIDARG, "Neither 32bit nor 64bit is specified for NGEN of file: %ls", pwzFile); | ||
| 581 | |||
| 582 | if (WcaIsInstalling(isInstalled, isAction) || WcaIsReInstalling(isInstalled, isAction)) | ||
| 583 | { | ||
| 584 | if (iAttributes & NGEN_32BIT && f32NgenExeExists) | ||
| 585 | { | ||
| 586 | // Assemble the install command line | ||
| 587 | hr = CreateInstallCommand(&pwzData, pwz32Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase); | ||
| 588 | ExitOnFailure(hr, "failed to create install command line"); | ||
| 589 | |||
| 590 | hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); | ||
| 591 | ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData); | ||
| 592 | |||
| 593 | hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData); | ||
| 594 | ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData); | ||
| 595 | |||
| 596 | uiCost += iAssemblyCost; | ||
| 597 | |||
| 598 | fNeedInstallUpdate32 = TRUE; | ||
| 599 | } | ||
| 600 | |||
| 601 | if (iAttributes & NGEN_64BIT && f64NgenExeExists) | ||
| 602 | { | ||
| 603 | // Assemble the install command line | ||
| 604 | hr = CreateInstallCommand(&pwzData, pwz64Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase); | ||
| 605 | ExitOnFailure(hr, "failed to create install command line"); | ||
| 606 | |||
| 607 | hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command | ||
| 608 | ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData); | ||
| 609 | |||
| 610 | hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData); // cost | ||
| 611 | ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData); | ||
| 612 | |||
| 613 | uiCost += iAssemblyCost; | ||
| 614 | |||
| 615 | fNeedInstallUpdate64 = TRUE; | ||
| 616 | } | ||
| 617 | } | ||
| 618 | else if (WcaIsUninstalling(isInstalled, isAction)) | ||
| 619 | { | ||
| 620 | if (iAttributes & NGEN_32BIT && f32NgenExeExists) | ||
| 621 | { | ||
| 622 | hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz32Ngen, pwzFile); | ||
| 623 | ExitOnFailure(hr, "failed to create update 32 command line"); | ||
| 624 | |||
| 625 | hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command | ||
| 626 | ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData); | ||
| 627 | |||
| 628 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost | ||
| 629 | ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData); | ||
| 630 | |||
| 631 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 632 | |||
| 633 | fNeedUninstallUpdate32 = TRUE; | ||
| 634 | } | ||
| 635 | |||
| 636 | if (iAttributes & NGEN_64BIT && f64NgenExeExists) | ||
| 637 | { | ||
| 638 | hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz64Ngen, pwzFile); | ||
| 639 | ExitOnFailure(hr, "failed to create update 64 command line"); | ||
| 640 | |||
| 641 | hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command | ||
| 642 | ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData); | ||
| 643 | |||
| 644 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost | ||
| 645 | ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData); | ||
| 646 | |||
| 647 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 648 | |||
| 649 | fNeedUninstallUpdate64 = TRUE; | ||
| 650 | } | ||
| 651 | } | ||
| 652 | } | ||
| 653 | if (E_NOMOREITEMS == hr) | ||
| 654 | hr = S_OK; | ||
| 655 | ExitOnFailure(hr, "failed while looping through all files to create native images for"); | ||
| 656 | |||
| 657 | // If we need 32 bit install update | ||
| 658 | if (fNeedInstallUpdate32) | ||
| 659 | { | ||
| 660 | hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen); | ||
| 661 | ExitOnFailure(hr, "failed to create install update 32 command line"); | ||
| 662 | |||
| 663 | hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command | ||
| 664 | ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData); | ||
| 665 | |||
| 666 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost | ||
| 667 | ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData); | ||
| 668 | |||
| 669 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 670 | } | ||
| 671 | |||
| 672 | // If we need 32 bit uninstall update | ||
| 673 | if (fNeedUninstallUpdate32) | ||
| 674 | { | ||
| 675 | hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen); | ||
| 676 | ExitOnFailure(hr, "failed to create uninstall update 32 command line"); | ||
| 677 | |||
| 678 | hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command | ||
| 679 | ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData); | ||
| 680 | |||
| 681 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost | ||
| 682 | ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData); | ||
| 683 | |||
| 684 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 685 | } | ||
| 686 | |||
| 687 | // If we need 64 bit install update | ||
| 688 | if (fNeedInstallUpdate64) | ||
| 689 | { | ||
| 690 | hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen); | ||
| 691 | ExitOnFailure(hr, "failed to create install update 64 command line"); | ||
| 692 | |||
| 693 | hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command | ||
| 694 | ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData); | ||
| 695 | |||
| 696 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost | ||
| 697 | ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData); | ||
| 698 | |||
| 699 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 700 | } | ||
| 701 | |||
| 702 | // If we need 64 bit install update | ||
| 703 | if (fNeedUninstallUpdate64) | ||
| 704 | { | ||
| 705 | hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen); | ||
| 706 | ExitOnFailure(hr, "failed to create uninstall update 64 command line"); | ||
| 707 | |||
| 708 | hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command | ||
| 709 | ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData); | ||
| 710 | |||
| 711 | hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost | ||
| 712 | ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData); | ||
| 713 | |||
| 714 | uiCost += COST_NGEN_NONBLOCKING; | ||
| 715 | } | ||
| 716 | |||
| 717 | // Add to progress bar | ||
| 718 | if ((pwzInstallCustomActionData && *pwzInstallCustomActionData) || (pwzUninstallCustomActionData && *pwzUninstallCustomActionData)) | ||
| 719 | { | ||
| 720 | hr = WcaProgressMessage(uiCost, TRUE); | ||
| 721 | ExitOnFailure(hr, "failed to extend progress bar for NetFxExecuteNativeImage"); | ||
| 722 | } | ||
| 723 | |||
| 724 | // Schedule the install custom action | ||
| 725 | if (pwzInstallCustomActionData && *pwzInstallCustomActionData) | ||
| 726 | { | ||
| 727 | hr = WcaSetProperty(L"NetFxExecuteNativeImageInstall", pwzInstallCustomActionData); | ||
| 728 | ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageInstall action"); | ||
| 729 | |||
| 730 | hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitInstall", pwzInstallCustomActionData); | ||
| 731 | ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitInstall action"); | ||
| 732 | } | ||
| 733 | |||
| 734 | // Schedule the uninstall custom action | ||
| 735 | if (pwzUninstallCustomActionData && *pwzUninstallCustomActionData) | ||
| 736 | { | ||
| 737 | hr = WcaSetProperty(L"NetFxExecuteNativeImageUninstall", pwzUninstallCustomActionData); | ||
| 738 | ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageUninstall action"); | ||
| 739 | |||
| 740 | hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitUninstall", pwzUninstallCustomActionData); | ||
| 741 | ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitUninstall action"); | ||
| 742 | } | ||
| 743 | |||
| 744 | |||
| 745 | LExit: | ||
| 746 | ReleaseStr(pwzInstallCustomActionData); | ||
| 747 | ReleaseStr(pwzUninstallCustomActionData); | ||
| 748 | ReleaseStr(pwzId); | ||
| 749 | ReleaseStr(pwzData); | ||
| 750 | ReleaseStr(pwzTemp); | ||
| 751 | ReleaseStr(pwzFile); | ||
| 752 | ReleaseStr(pwzFileApp); | ||
| 753 | ReleaseStr(pwzDirAppBase); | ||
| 754 | ReleaseStr(pwzComponent); | ||
| 755 | ReleaseStr(pwz32Ngen); | ||
| 756 | ReleaseStr(pwz64Ngen); | ||
| 757 | |||
| 758 | if (FAILED(hr)) | ||
| 759 | er = ERROR_INSTALL_FAILURE; | ||
| 760 | return WcaFinalize(er); | ||
| 761 | } | ||
| 762 | |||
| 763 | |||
| 764 | /****************************************************************** | ||
| 765 | ExecNetFx - entry point for NetFx Custom Action | ||
| 766 | |||
| 767 | *******************************************************************/ | ||
| 768 | extern "C" UINT __stdcall ExecNetFx( | ||
| 769 | __in MSIHANDLE hInstall | ||
| 770 | ) | ||
| 771 | { | ||
| 772 | // AssertSz(FALSE, "debug ExecNetFx"); | ||
| 773 | |||
| 774 | HRESULT hr = S_OK; | ||
| 775 | UINT er = ERROR_SUCCESS; | ||
| 776 | |||
| 777 | LPWSTR pwzCustomActionData = NULL; | ||
| 778 | LPWSTR pwzData = NULL; | ||
| 779 | LPWSTR pwz = NULL; | ||
| 780 | int iCost = 0; | ||
| 781 | |||
| 782 | // initialize | ||
| 783 | hr = WcaInitialize(hInstall, "ExecNetFx"); | ||
| 784 | ExitOnFailure(hr, "failed to initialize"); | ||
| 785 | |||
| 786 | hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData); | ||
| 787 | ExitOnFailure(hr, "failed to get CustomActionData"); | ||
| 788 | |||
| 789 | WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData); | ||
| 790 | |||
| 791 | pwz = pwzCustomActionData; | ||
| 792 | |||
| 793 | // loop through all the passed in data | ||
| 794 | while (pwz && *pwz) | ||
| 795 | { | ||
| 796 | hr = WcaReadStringFromCaData(&pwz, &pwzData); | ||
| 797 | ExitOnFailure(hr, "failed to read command line from custom action data"); | ||
| 798 | |||
| 799 | hr = WcaReadIntegerFromCaData(&pwz, &iCost); | ||
| 800 | ExitOnFailure(hr, "failed to read cost from custom action data"); | ||
| 801 | |||
| 802 | hr = QuietExec(pwzData, NGEN_TIMEOUT, TRUE, TRUE); | ||
| 803 | // If we fail here it isn't critical - keep looping through to try to act on the other assemblies on our list | ||
| 804 | if (FAILED(hr)) | ||
| 805 | { | ||
| 806 | WcaLog(LOGMSG_STANDARD, "failed to execute Ngen command (with error 0x%x): %ls, continuing anyway", hr, pwzData); | ||
| 807 | hr = S_OK; | ||
| 808 | } | ||
| 809 | |||
| 810 | // Tick the progress bar along for this assembly | ||
| 811 | hr = WcaProgressMessage(iCost, FALSE); | ||
| 812 | ExitOnFailure(hr, "failed to tick progress bar for command line: %ls", pwzData); | ||
| 813 | } | ||
| 814 | |||
| 815 | LExit: | ||
| 816 | ReleaseStr(pwzCustomActionData); | ||
| 817 | ReleaseStr(pwzData); | ||
| 818 | |||
| 819 | if (FAILED(hr)) | ||
| 820 | er = ERROR_INSTALL_FAILURE; | ||
| 821 | return WcaFinalize(er); | ||
| 822 | } | ||
| 823 | |||
diff --git a/src/ca/netfxca.def b/src/ca/netfxca.def new file mode 100644 index 00000000..c1d01f5f --- /dev/null +++ b/src/ca/netfxca.def | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | ; Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | |||
| 4 | LIBRARY "netfxca" | ||
| 5 | |||
| 6 | EXPORTS | ||
| 7 | SchedNetFx | ||
| 8 | ExecNetFx | ||
diff --git a/src/ca/netfxca.vcxproj b/src/ca/netfxca.vcxproj new file mode 100644 index 00000000..98b7352b --- /dev/null +++ b/src/ca/netfxca.vcxproj | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
| 5 | <Import Project="..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props')" /> | ||
| 6 | <Import Project="..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props')" /> | ||
| 7 | |||
| 8 | <ItemGroup Label="ProjectConfigurations"> | ||
| 9 | <ProjectConfiguration Include="Debug|Win32"> | ||
| 10 | <Configuration>Debug</Configuration> | ||
| 11 | <Platform>Win32</Platform> | ||
| 12 | </ProjectConfiguration> | ||
| 13 | <ProjectConfiguration Include="Release|Win32"> | ||
| 14 | <Configuration>Release</Configuration> | ||
| 15 | <Platform>Win32</Platform> | ||
| 16 | </ProjectConfiguration> | ||
| 17 | </ItemGroup> | ||
| 18 | |||
| 19 | <PropertyGroup Label="Globals"> | ||
| 20 | <ProjectGuid>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</ProjectGuid> | ||
| 21 | <ConfigurationType>DynamicLibrary</ConfigurationType> | ||
| 22 | <TargetName>netfxca</TargetName> | ||
| 23 | <PlatformToolset>v141</PlatformToolset> | ||
| 24 | <CharacterSet>Unicode</CharacterSet> | ||
| 25 | <ProjectModuleDefinitionFile>netfxca.def</ProjectModuleDefinitionFile> | ||
| 26 | <Description>WiX Toolset .NET Framework CustomAction</Description> | ||
| 27 | </PropertyGroup> | ||
| 28 | |||
| 29 | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||
| 30 | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||
| 31 | |||
| 32 | <ImportGroup Label="ExtensionSettings"> | ||
| 33 | </ImportGroup> | ||
| 34 | |||
| 35 | <ImportGroup Label="Shared"> | ||
| 36 | <Import Project="..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.1.14.114\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets" Condition="Exists('..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.1.14.114\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" /> | ||
| 37 | </ImportGroup> | ||
| 38 | |||
| 39 | <PropertyGroup> | ||
| 40 | <ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries> | ||
| 41 | </PropertyGroup> | ||
| 42 | |||
| 43 | <ItemGroup> | ||
| 44 | <ClCompile Include="dllmain.cpp"> | ||
| 45 | <PrecompiledHeader>Create</PrecompiledHeader> | ||
| 46 | </ClCompile> | ||
| 47 | <ClCompile Include="netfxca.cpp" /> | ||
| 48 | </ItemGroup> | ||
| 49 | |||
| 50 | <ItemGroup> | ||
| 51 | <ClInclude Include="cost.h" /> | ||
| 52 | <ClInclude Include="precomp.h" /> | ||
| 53 | </ItemGroup> | ||
| 54 | |||
| 55 | <ItemGroup> | ||
| 56 | <None Include="packages.config" /> | ||
| 57 | <None Include="netfxca.def" /> | ||
| 58 | </ItemGroup> | ||
| 59 | |||
| 60 | <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||
| 61 | |||
| 62 | <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | ||
| 63 | <PropertyGroup> | ||
| 64 | <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> | ||
| 65 | </PropertyGroup> | ||
| 66 | <Error Condition="!Exists('..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.1.14.114\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.1.14.114\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets'))" /> | ||
| 67 | <Error Condition="!Exists('..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props'))" /> | ||
| 68 | <Error Condition="!Exists('..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props'))" /> | ||
| 69 | </Target> | ||
| 70 | </Project> \ No newline at end of file | ||
diff --git a/src/ca/packages.config b/src/ca/packages.config new file mode 100644 index 00000000..b74ff5d0 --- /dev/null +++ b/src/ca/packages.config | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <packages> | ||
| 3 | <package id="Microsoft.VisualStudio.Setup.Configuration.Native" version="1.14.114" targetFramework="native" developmentDependency="true" /> | ||
| 4 | <package id="WixToolset.DUtil" version="4.0.6" targetFramework="native" /> | ||
| 5 | <package id="WixToolset.WcaUtil" version="4.0.2" targetFramework="native" /> | ||
| 6 | </packages> \ No newline at end of file | ||
diff --git a/src/ca/precomp.h b/src/ca/precomp.h new file mode 100644 index 00000000..5caedb16 --- /dev/null +++ b/src/ca/precomp.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #pragma once | ||
| 2 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 3 | |||
| 4 | |||
| 5 | #include <windows.h> | ||
| 6 | #include <msiquery.h> | ||
| 7 | |||
| 8 | #include "wcautil.h" | ||
| 9 | #include "fileutil.h" | ||
| 10 | #include "strutil.h" | ||
| 11 | #include "pathutil.h" | ||
| 12 | |||
| 13 | #include "cost.h" | ||
diff --git a/src/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs b/src/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs new file mode 100644 index 00000000..a9428d7c --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolsetTest.Netfx | ||
| 4 | { | ||
| 5 | using System.Linq; | ||
| 6 | using WixBuildTools.TestSupport; | ||
| 7 | using WixToolset.Core.TestPackage; | ||
| 8 | using WixToolset.Netfx; | ||
| 9 | using Xunit; | ||
| 10 | |||
| 11 | public class NetfxExtensionFixture | ||
| 12 | { | ||
| 13 | [Fact] | ||
| 14 | public void CanBuildUsingNativeImage() | ||
| 15 | { | ||
| 16 | var folder = TestData.Get(@"TestData\UsingNativeImage"); | ||
| 17 | var build = new Builder(folder, typeof(NetfxExtensionFactory), new[] { folder }); | ||
| 18 | |||
| 19 | var results = build.BuildAndQuery(Build, "NetFxNativeImage"); | ||
| 20 | Assert.Equal(new[] | ||
| 21 | { | ||
| 22 | "NetFxNativeImage:ExampleNgen\tfil6349_KNDJhqShNzVdHX3ihhvA6Y\t3\t8\t\t", | ||
| 23 | }, results.OrderBy(s => s).ToArray()); | ||
| 24 | } | ||
| 25 | |||
| 26 | private static void Build(string[] args) | ||
| 27 | { | ||
| 28 | var result = WixRunner.Execute(args, out var messages); | ||
| 29 | Assert.Equal(0, result); | ||
| 30 | Assert.Empty(messages); | ||
| 31 | } | ||
| 32 | } | ||
| 33 | } | ||
diff --git a/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl new file mode 100644 index 00000000..38c12ac1 --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | |||
| 3 | <!-- | ||
| 4 | This file contains the declaration of all the localizable strings. | ||
| 5 | --> | ||
| 6 | <WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US"> | ||
| 7 | |||
| 8 | <String Id="DowngradeError">A newer version of [ProductName] is already installed.</String> | ||
| 9 | <String Id="FeatureTitle">MsiPackage</String> | ||
| 10 | |||
| 11 | </WixLocalization> | ||
diff --git a/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs new file mode 100644 index 00000000..68ff98fd --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 3 | <Product Id="*" Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a"> | ||
| 4 | <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" /> | ||
| 5 | |||
| 6 | <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" /> | ||
| 7 | <MediaTemplate /> | ||
| 8 | |||
| 9 | <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)"> | ||
| 10 | <ComponentGroupRef Id="ProductComponents" /> | ||
| 11 | </Feature> | ||
| 12 | |||
| 13 | </Product> | ||
| 14 | |||
| 15 | <Fragment> | ||
| 16 | <Directory Id="TARGETDIR" Name="SourceDir"> | ||
| 17 | <Directory Id="ProgramFilesFolder"> | ||
| 18 | <Directory Id="INSTALLFOLDER" Name="MsiPackage" /> | ||
| 19 | </Directory> | ||
| 20 | </Directory> | ||
| 21 | </Fragment> | ||
| 22 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs new file mode 100644 index 00000000..21c92f26 --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" | ||
| 3 | xmlns:netfx="http://wixtoolset.org/schemas/v4/wxs/netfx"> | ||
| 4 | <Fragment> | ||
| 5 | <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> | ||
| 6 | <Component> | ||
| 7 | <File Name="fake.ddl" Source="example.txt"> | ||
| 8 | <netfx:NativeImage Id="ExampleNgen" /> | ||
| 9 | </File> | ||
| 10 | </Component> | ||
| 11 | </ComponentGroup> | ||
| 12 | </Fragment> | ||
| 13 | </Wix> | ||
diff --git a/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt new file mode 100644 index 00000000..1b4ffe8a --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt | |||
| @@ -0,0 +1 @@ | |||
| This is example.txt. \ No newline at end of file | |||
diff --git a/src/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj b/src/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj new file mode 100644 index 00000000..45429574 --- /dev/null +++ b/src/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project Sdk="Microsoft.NET.Sdk"> | ||
| 5 | <PropertyGroup> | ||
| 6 | <TargetFramework>netcoreapp2.0</TargetFramework> | ||
| 7 | <IsPackable>false</IsPackable> | ||
| 8 | </PropertyGroup> | ||
| 9 | |||
| 10 | <PropertyGroup> | ||
| 11 | <NoWarn>NU1701</NoWarn> | ||
| 12 | </PropertyGroup> | ||
| 13 | |||
| 14 | <ItemGroup> | ||
| 15 | <Content Include="TestData\UsingNativeImage\example.txt" CopyToOutputDirectory="PreserveNewest" /> | ||
| 16 | <Content Include="TestData\UsingNativeImage\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" /> | ||
| 17 | <Content Include="TestData\UsingNativeImage\Package.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 18 | <Content Include="TestData\UsingNativeImage\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" /> | ||
| 19 | </ItemGroup> | ||
| 20 | |||
| 21 | <ItemGroup> | ||
| 22 | <ProjectReference Include="..\..\wixext\WixToolset.Netfx.wixext.csproj" /> | ||
| 23 | </ItemGroup> | ||
| 24 | |||
| 25 | <ItemGroup> | ||
| 26 | <ProjectReference Include="$(WixToolsetRootFolder)\Core\src\WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\README.md') " /> | ||
| 27 | <ProjectReference Include="$(WixToolsetRootFolder)\Core\src\wix\wix.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\README.md') " /> | ||
| 28 | <PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core\README.md') " PrivateAssets="all" /> | ||
| 29 | </ItemGroup> | ||
| 30 | |||
| 31 | <ItemGroup> | ||
| 32 | <PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" /> | ||
| 33 | </ItemGroup> | ||
| 34 | |||
| 35 | <ItemGroup> | ||
| 36 | <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" /> | ||
| 37 | <PackageReference Include="xunit" Version="2.2.0" /> | ||
| 38 | <PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> | ||
| 39 | </ItemGroup> | ||
| 40 | </Project> | ||
diff --git a/src/wixext/NetFxCompiler.cs b/src/wixext/NetFxCompiler.cs new file mode 100644 index 00000000..55db4297 --- /dev/null +++ b/src/wixext/NetFxCompiler.cs | |||
| @@ -0,0 +1,159 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Collections.Generic; | ||
| 7 | using System.Xml.Linq; | ||
| 8 | using WixToolset.Data; | ||
| 9 | using WixToolset.Extensibility; | ||
| 10 | |||
| 11 | /// <summary> | ||
| 12 | /// The compiler for the WiX Toolset .NET Framework Extension. | ||
| 13 | /// </summary> | ||
| 14 | public sealed class NetfxCompiler : BaseCompilerExtension | ||
| 15 | { | ||
| 16 | public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/netfx"; | ||
| 17 | |||
| 18 | /// <summary> | ||
| 19 | /// Processes an element for the Compiler. | ||
| 20 | /// </summary> | ||
| 21 | /// <param name="parentElement">Parent element of element to process.</param> | ||
| 22 | /// <param name="element">Element to process.</param> | ||
| 23 | /// <param name="contextValues">Extra information about the context in which this element is being parsed.</param> | ||
| 24 | public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context) | ||
| 25 | { | ||
| 26 | switch (parentElement.Name.LocalName) | ||
| 27 | { | ||
| 28 | case "File": | ||
| 29 | string fileId = context["FileId"]; | ||
| 30 | |||
| 31 | switch (element.Name.LocalName) | ||
| 32 | { | ||
| 33 | case "NativeImage": | ||
| 34 | this.ParseNativeImageElement(intermediate, section, element, fileId); | ||
| 35 | break; | ||
| 36 | default: | ||
| 37 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 38 | break; | ||
| 39 | } | ||
| 40 | break; | ||
| 41 | default: | ||
| 42 | this.ParseHelper.UnexpectedElement(parentElement, element); | ||
| 43 | break; | ||
| 44 | } | ||
| 45 | } | ||
| 46 | |||
| 47 | /// <summary> | ||
| 48 | /// Parses a NativeImage element. | ||
| 49 | /// </summary> | ||
| 50 | /// <param name="element">The element to parse.</param> | ||
| 51 | /// <param name="fileId">The file identifier of the parent element.</param> | ||
| 52 | private void ParseNativeImageElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId) | ||
| 53 | { | ||
| 54 | SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); | ||
| 55 | Identifier id = null; | ||
| 56 | string appBaseDirectory = null; | ||
| 57 | string assemblyApplication = null; | ||
| 58 | int attributes = 0x8; // 32bit is on by default | ||
| 59 | int priority = 3; | ||
| 60 | |||
| 61 | foreach (XAttribute attrib in element.Attributes()) | ||
| 62 | { | ||
| 63 | if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) | ||
| 64 | { | ||
| 65 | switch (attrib.Name.LocalName) | ||
| 66 | { | ||
| 67 | case "Id": | ||
| 68 | id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); | ||
| 69 | break; | ||
| 70 | case "AppBaseDirectory": | ||
| 71 | appBaseDirectory = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 72 | |||
| 73 | // See if a formatted value is specified. | ||
| 74 | if (-1 == appBaseDirectory.IndexOf("[", StringComparison.Ordinal)) | ||
| 75 | { | ||
| 76 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Directory", appBaseDirectory); | ||
| 77 | } | ||
| 78 | break; | ||
| 79 | case "AssemblyApplication": | ||
| 80 | assemblyApplication = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 81 | |||
| 82 | // See if a formatted value is specified. | ||
| 83 | if (-1 == assemblyApplication.IndexOf("[", StringComparison.Ordinal)) | ||
| 84 | { | ||
| 85 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", assemblyApplication); | ||
| 86 | } | ||
| 87 | break; | ||
| 88 | case "Debug": | ||
| 89 | if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | ||
| 90 | { | ||
| 91 | attributes |= 0x1; | ||
| 92 | } | ||
| 93 | break; | ||
| 94 | case "Dependencies": | ||
| 95 | if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | ||
| 96 | { | ||
| 97 | attributes |= 0x2; | ||
| 98 | } | ||
| 99 | break; | ||
| 100 | case "Platform": | ||
| 101 | string platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); | ||
| 102 | if (0 < platformValue.Length) | ||
| 103 | { | ||
| 104 | switch (platformValue) | ||
| 105 | { | ||
| 106 | case "32bit": | ||
| 107 | // 0x8 is already on by default | ||
| 108 | break; | ||
| 109 | case "64bit": | ||
| 110 | attributes &= ~0x8; | ||
| 111 | attributes |= 0x10; | ||
| 112 | break; | ||
| 113 | case "all": | ||
| 114 | attributes |= 0x10; | ||
| 115 | break; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | break; | ||
| 119 | case "Priority": | ||
| 120 | priority = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3); | ||
| 121 | break; | ||
| 122 | case "Profile": | ||
| 123 | if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib)) | ||
| 124 | { | ||
| 125 | attributes |= 0x4; | ||
| 126 | } | ||
| 127 | break; | ||
| 128 | default: | ||
| 129 | this.ParseHelper.UnexpectedAttribute(element, attrib); | ||
| 130 | break; | ||
| 131 | } | ||
| 132 | } | ||
| 133 | else | ||
| 134 | { | ||
| 135 | this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); | ||
| 136 | } | ||
| 137 | } | ||
| 138 | |||
| 139 | if (null == id) | ||
| 140 | { | ||
| 141 | this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id")); | ||
| 142 | } | ||
| 143 | |||
| 144 | this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); | ||
| 145 | |||
| 146 | this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "NetFxScheduleNativeImage"); | ||
| 147 | |||
| 148 | if (!this.Messaging.EncounteredError) | ||
| 149 | { | ||
| 150 | var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "NetFxNativeImage", id); | ||
| 151 | row.Set(1, fileId); | ||
| 152 | row.Set(2, priority); | ||
| 153 | row.Set(3, attributes); | ||
| 154 | row.Set(4, assemblyApplication); | ||
| 155 | row.Set(5, appBaseDirectory); | ||
| 156 | } | ||
| 157 | } | ||
| 158 | } | ||
| 159 | } | ||
diff --git a/src/wixext/NetFxDecompiler.cs b/src/wixext/NetFxDecompiler.cs new file mode 100644 index 00000000..e30905d1 --- /dev/null +++ b/src/wixext/NetFxDecompiler.cs | |||
| @@ -0,0 +1,139 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Extensions | ||
| 4 | { | ||
| 5 | #if TODO_CONSIDER_DECOMPILER | ||
| 6 | using System; | ||
| 7 | using System.Collections; | ||
| 8 | using System.Diagnostics; | ||
| 9 | using System.Globalization; | ||
| 10 | using WixToolset.Data; | ||
| 11 | using WixToolset.Extensibility; | ||
| 12 | using NetFx = WixToolset.Extensions.Serialize.NetFx; | ||
| 13 | using Wix = WixToolset.Data.Serialize; | ||
| 14 | |||
| 15 | /// <summary> | ||
| 16 | /// The decompiler for the WiX Toolset .NET Framework Extension. | ||
| 17 | /// </summary> | ||
| 18 | public sealed class NetFxDecompiler : DecompilerExtension | ||
| 19 | { | ||
| 20 | /// <summary> | ||
| 21 | /// Creates a decompiler for NetFx Extension. | ||
| 22 | /// </summary> | ||
| 23 | public NetFxDecompiler() | ||
| 24 | { | ||
| 25 | this.TableDefinitions = NetFxExtensionData.GetExtensionTableDefinitions(); | ||
| 26 | } | ||
| 27 | |||
| 28 | /// <summary> | ||
| 29 | /// Get the extensions library to be removed. | ||
| 30 | /// </summary> | ||
| 31 | /// <param name="tableDefinitions">Table definitions for library.</param> | ||
| 32 | /// <returns>Library to remove from decompiled output.</returns> | ||
| 33 | public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions) | ||
| 34 | { | ||
| 35 | return NetFxExtensionData.GetExtensionLibrary(tableDefinitions); | ||
| 36 | } | ||
| 37 | |||
| 38 | /// <summary> | ||
| 39 | /// Decompiles an extension table. | ||
| 40 | /// </summary> | ||
| 41 | /// <param name="table">The table to decompile.</param> | ||
| 42 | public override void DecompileTable(Table table) | ||
| 43 | { | ||
| 44 | switch (table.Name) | ||
| 45 | { | ||
| 46 | case "NetFxNativeImage": | ||
| 47 | this.DecompileNetFxNativeImageTable(table); | ||
| 48 | break; | ||
| 49 | default: | ||
| 50 | base.DecompileTable(table); | ||
| 51 | break; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | /// <summary> | ||
| 56 | /// Decompile the NetFxNativeImage table. | ||
| 57 | /// </summary> | ||
| 58 | /// <param name="table">The table to decompile.</param> | ||
| 59 | private void DecompileNetFxNativeImageTable(Table table) | ||
| 60 | { | ||
| 61 | foreach (Row row in table.Rows) | ||
| 62 | { | ||
| 63 | NetFx.NativeImage nativeImage = new NetFx.NativeImage(); | ||
| 64 | |||
| 65 | nativeImage.Id = (string)row[0]; | ||
| 66 | |||
| 67 | switch ((int)row[2]) | ||
| 68 | { | ||
| 69 | case 0: | ||
| 70 | nativeImage.Priority = NetFx.NativeImage.PriorityType.Item0; | ||
| 71 | break; | ||
| 72 | case 1: | ||
| 73 | nativeImage.Priority = NetFx.NativeImage.PriorityType.Item1; | ||
| 74 | break; | ||
| 75 | case 2: | ||
| 76 | nativeImage.Priority = NetFx.NativeImage.PriorityType.Item2; | ||
| 77 | break; | ||
| 78 | case 3: | ||
| 79 | nativeImage.Priority = NetFx.NativeImage.PriorityType.Item3; | ||
| 80 | break; | ||
| 81 | } | ||
| 82 | |||
| 83 | if (null != row[3]) | ||
| 84 | { | ||
| 85 | int attributes = (int)row[3]; | ||
| 86 | |||
| 87 | if (0x1 == (attributes & 0x1)) | ||
| 88 | { | ||
| 89 | nativeImage.Debug = NetFx.YesNoType.yes; | ||
| 90 | } | ||
| 91 | |||
| 92 | if (0x2 == (attributes & 0x2)) | ||
| 93 | { | ||
| 94 | nativeImage.Dependencies = NetFx.YesNoType.no; | ||
| 95 | } | ||
| 96 | |||
| 97 | if (0x4 == (attributes & 0x4)) | ||
| 98 | { | ||
| 99 | nativeImage.Profile = NetFx.YesNoType.yes; | ||
| 100 | } | ||
| 101 | |||
| 102 | if (0x8 == (attributes & 0x8) && 0x10 == (attributes & 0x10)) | ||
| 103 | { | ||
| 104 | nativeImage.Platform = NetFx.NativeImage.PlatformType.all; | ||
| 105 | } | ||
| 106 | else if (0x8 == (attributes & 0x8)) | ||
| 107 | { | ||
| 108 | nativeImage.Platform = NetFx.NativeImage.PlatformType.Item32bit; | ||
| 109 | } | ||
| 110 | else if (0x10 == (attributes & 0x10)) | ||
| 111 | { | ||
| 112 | nativeImage.Platform = NetFx.NativeImage.PlatformType.Item64bit; | ||
| 113 | } | ||
| 114 | } | ||
| 115 | |||
| 116 | if (null != row[4]) | ||
| 117 | { | ||
| 118 | nativeImage.AssemblyApplication = (string)row[4]; | ||
| 119 | } | ||
| 120 | |||
| 121 | if (null != row[5]) | ||
| 122 | { | ||
| 123 | nativeImage.AppBaseDirectory = (string)row[5]; | ||
| 124 | } | ||
| 125 | |||
| 126 | Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", (string)row[1]); | ||
| 127 | if (null != file) | ||
| 128 | { | ||
| 129 | file.AddChild(nativeImage); | ||
| 130 | } | ||
| 131 | else | ||
| 132 | { | ||
| 133 | this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File_", (string)row[1], "File")); | ||
| 134 | } | ||
| 135 | } | ||
| 136 | } | ||
| 137 | } | ||
| 138 | #endif | ||
| 139 | } | ||
diff --git a/src/wixext/NetFxExtensionData.cs b/src/wixext/NetFxExtensionData.cs new file mode 100644 index 00000000..b68741fd --- /dev/null +++ b/src/wixext/NetFxExtensionData.cs | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | using WixToolset.Extensibility; | ||
| 7 | using WixToolset.Netfx.Tuples; | ||
| 8 | |||
| 9 | /// <summary> | ||
| 10 | /// The WiX Toolset .NET Framework Extension. | ||
| 11 | /// </summary> | ||
| 12 | public sealed class NetfxExtensionData : BaseExtensionData | ||
| 13 | { | ||
| 14 | public override bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition) | ||
| 15 | { | ||
| 16 | tupleDefinition = (name == NetfxTupleDefinitionNames.NetFxNativeImage) ? NetfxTupleDefinitions.NetFxNativeImage : null; | ||
| 17 | return tupleDefinition != null; | ||
| 18 | } | ||
| 19 | |||
| 20 | public override Intermediate GetLibrary(ITupleDefinitionCreator tupleDefinitions) | ||
| 21 | { | ||
| 22 | return Intermediate.Load(typeof(NetfxExtensionData).Assembly, "WixToolset.Netfx.netfx.wixlib", tupleDefinitions); | ||
| 23 | } | ||
| 24 | } | ||
| 25 | } | ||
diff --git a/src/wixext/NetfxExtensionFactory.cs b/src/wixext/NetfxExtensionFactory.cs new file mode 100644 index 00000000..756d1b2a --- /dev/null +++ b/src/wixext/NetfxExtensionFactory.cs | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx | ||
| 4 | { | ||
| 5 | using System; | ||
| 6 | using System.Collections.Generic; | ||
| 7 | using WixToolset.Extensibility; | ||
| 8 | |||
| 9 | public class NetfxExtensionFactory : BaseExtensionFactory | ||
| 10 | { | ||
| 11 | protected override IEnumerable<Type> ExtensionTypes => new[] | ||
| 12 | { | ||
| 13 | typeof(NetfxCompiler), | ||
| 14 | typeof(NetfxExtensionData), | ||
| 15 | typeof(NetfxWindowsInstallerBackendExtension), | ||
| 16 | }; | ||
| 17 | } | ||
| 18 | } | ||
diff --git a/src/wixext/NetfxWindowsInstallerBackendExtension.cs b/src/wixext/NetfxWindowsInstallerBackendExtension.cs new file mode 100644 index 00000000..50266ef4 --- /dev/null +++ b/src/wixext/NetfxWindowsInstallerBackendExtension.cs | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx | ||
| 4 | { | ||
| 5 | using WixToolset.Data.WindowsInstaller; | ||
| 6 | using WixToolset.Extensibility; | ||
| 7 | |||
| 8 | public class NetfxWindowsInstallerBackendExtension : BaseWindowsInstallerBackendExtension | ||
| 9 | { | ||
| 10 | private static readonly TableDefinition[] Tables = new[] { | ||
| 11 | new TableDefinition( | ||
| 12 | "NetFxNativeImage", | ||
| 13 | new[] | ||
| 14 | { | ||
| 15 | new ColumnDefinition("NetFxNativeImage", ColumnType.String, 72, true, false, ColumnCategory.Identifier, description: "The primary key, a non-localized token."), | ||
| 16 | new ColumnDefinition("File_", ColumnType.String, 0, false, false, ColumnCategory.Identifier, keyTable:"File", keyColumn: 1, description: "The assembly for which a native image will be generated."), | ||
| 17 | new ColumnDefinition("Priority", ColumnType.Number, 2, false, false, ColumnCategory.Integer, maxValue: 3, description: "The priority for generating this native image: 0 is syncronous, 1-3 represent various levels of queued generation."), | ||
| 18 | new ColumnDefinition("Attributes", ColumnType.Number, 4, false, false, ColumnCategory.Integer, maxValue: 2147483647, description: "Integer containing bit flags representing native image attributes."), | ||
| 19 | new ColumnDefinition("File_Application", ColumnType.String, 72, false, true, ColumnCategory.Formatted, description: "The application which loads this assembly."), | ||
| 20 | new ColumnDefinition("Directory_ApplicationBase", ColumnType.String, 72, false, true, ColumnCategory.Formatted, description: "The directory containing the application which loads this assembly."), | ||
| 21 | } | ||
| 22 | ), | ||
| 23 | }; | ||
| 24 | |||
| 25 | protected override TableDefinition[] TableDefinitionsForTuples => Tables; | ||
| 26 | } | ||
| 27 | } | ||
diff --git a/src/wixext/Tuples/NetFxNativeImageTuple.cs b/src/wixext/Tuples/NetFxNativeImageTuple.cs new file mode 100644 index 00000000..af507137 --- /dev/null +++ b/src/wixext/Tuples/NetFxNativeImageTuple.cs | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx.Tuples | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | |||
| 7 | public enum NetFxNativeImageTupleFields | ||
| 8 | { | ||
| 9 | NetFxNativeImage, | ||
| 10 | File_, | ||
| 11 | Priority, | ||
| 12 | Attributes, | ||
| 13 | File_Application, | ||
| 14 | Directory_ApplicationBase, | ||
| 15 | } | ||
| 16 | |||
| 17 | public class NetFxNativeImageTuple : IntermediateTuple | ||
| 18 | { | ||
| 19 | public NetFxNativeImageTuple() : base(NetfxTupleDefinitions.NetFxNativeImage, null, null) | ||
| 20 | { | ||
| 21 | } | ||
| 22 | |||
| 23 | public NetFxNativeImageTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxTupleDefinitions.NetFxNativeImage, sourceLineNumber, id) | ||
| 24 | { | ||
| 25 | } | ||
| 26 | |||
| 27 | public IntermediateField this[NetFxNativeImageTupleFields index] => this.Fields[(int)index]; | ||
| 28 | |||
| 29 | public string NetFxNativeImage | ||
| 30 | { | ||
| 31 | get => this.Fields[(int)NetFxNativeImageTupleFields.NetFxNativeImage].AsString(); | ||
| 32 | set => this.Set((int)NetFxNativeImageTupleFields.NetFxNativeImage, value); | ||
| 33 | } | ||
| 34 | |||
| 35 | public string File_ | ||
| 36 | { | ||
| 37 | get => this.Fields[(int)NetFxNativeImageTupleFields.File_].AsString(); | ||
| 38 | set => this.Set((int)NetFxNativeImageTupleFields.File_, value); | ||
| 39 | } | ||
| 40 | |||
| 41 | public int Priority | ||
| 42 | { | ||
| 43 | get => this.Fields[(int)NetFxNativeImageTupleFields.Priority].AsNumber(); | ||
| 44 | set => this.Set((int)NetFxNativeImageTupleFields.Priority, value); | ||
| 45 | } | ||
| 46 | |||
| 47 | public int Attributes | ||
| 48 | { | ||
| 49 | get => this.Fields[(int)NetFxNativeImageTupleFields.Attributes].AsNumber(); | ||
| 50 | set => this.Set((int)NetFxNativeImageTupleFields.Attributes, value); | ||
| 51 | } | ||
| 52 | |||
| 53 | public string File_Application | ||
| 54 | { | ||
| 55 | get => this.Fields[(int)NetFxNativeImageTupleFields.File_Application].AsString(); | ||
| 56 | set => this.Set((int)NetFxNativeImageTupleFields.File_Application, value); | ||
| 57 | } | ||
| 58 | |||
| 59 | public string Directory_ApplicationBase | ||
| 60 | { | ||
| 61 | get => this.Fields[(int)NetFxNativeImageTupleFields.Directory_ApplicationBase].AsString(); | ||
| 62 | set => this.Set((int)NetFxNativeImageTupleFields.Directory_ApplicationBase, value); | ||
| 63 | } | ||
| 64 | } | ||
| 65 | } \ No newline at end of file | ||
diff --git a/src/wixext/Tuples/NetfxTupleDefinitions.cs b/src/wixext/Tuples/NetfxTupleDefinitions.cs new file mode 100644 index 00000000..aa584b38 --- /dev/null +++ b/src/wixext/Tuples/NetfxTupleDefinitions.cs | |||
| @@ -0,0 +1,27 @@ | |||
| 1 | // Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. | ||
| 2 | |||
| 3 | namespace WixToolset.Netfx.Tuples | ||
| 4 | { | ||
| 5 | using WixToolset.Data; | ||
| 6 | |||
| 7 | public static class NetfxTupleDefinitionNames | ||
| 8 | { | ||
| 9 | public static string NetFxNativeImage { get; } = "NetFxNativeImage"; | ||
| 10 | } | ||
| 11 | |||
| 12 | public static class NetfxTupleDefinitions | ||
| 13 | { | ||
| 14 | public static readonly IntermediateTupleDefinition NetFxNativeImage = new IntermediateTupleDefinition( | ||
| 15 | NetfxTupleDefinitionNames.NetFxNativeImage, | ||
| 16 | new[] | ||
| 17 | { | ||
| 18 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.NetFxNativeImage), IntermediateFieldType.String), | ||
| 19 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.File_), IntermediateFieldType.String), | ||
| 20 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Priority), IntermediateFieldType.Number), | ||
| 21 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Attributes), IntermediateFieldType.Number), | ||
| 22 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.File_Application), IntermediateFieldType.String), | ||
| 23 | new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Directory_ApplicationBase), IntermediateFieldType.String), | ||
| 24 | }, | ||
| 25 | typeof(NetFxNativeImageTuple)); | ||
| 26 | } | ||
| 27 | } | ||
diff --git a/src/wixext/WixToolset.Netfx.wixext.csproj b/src/wixext/WixToolset.Netfx.wixext.csproj new file mode 100644 index 00000000..d925e348 --- /dev/null +++ b/src/wixext/WixToolset.Netfx.wixext.csproj | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project Sdk="Microsoft.NET.Sdk"> | ||
| 5 | <PropertyGroup> | ||
| 6 | <TargetFramework>netstandard2.0</TargetFramework> | ||
| 7 | <RootNamespace>WixToolset.Netfx</RootNamespace> | ||
| 8 | <Description>WiX Toolset .NET Framework Extension</Description> | ||
| 9 | <Title>WiX Toolset .NET Framework Extension</Title> | ||
| 10 | <IsTool>true</IsTool> | ||
| 11 | <ContentTargetFolders>build</ContentTargetFolders> | ||
| 12 | </PropertyGroup> | ||
| 13 | |||
| 14 | <ItemGroup> | ||
| 15 | <Content Include="$(MSBuildThisFileName).targets" /> | ||
| 16 | <Content Include="netfx.xsd" PackagePath="tools" /> | ||
| 17 | <EmbeddedResource Include="$(OutputPath)..\netfx.wixlib" /> | ||
| 18 | </ItemGroup> | ||
| 19 | |||
| 20 | <ItemGroup> | ||
| 21 | <ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\README.md') " /> | ||
| 22 | <PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\README.md') " PrivateAssets="all" /> | ||
| 23 | |||
| 24 | <ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\README.md') " /> | ||
| 25 | <PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\README.md') " PrivateAssets="all" /> | ||
| 26 | </ItemGroup> | ||
| 27 | |||
| 28 | <ItemGroup> | ||
| 29 | <ProjectReference Include="..\wixlib\netfx.wixproj" ReferenceOutputAssembly="false" /> | ||
| 30 | </ItemGroup> | ||
| 31 | |||
| 32 | <ItemGroup> | ||
| 33 | <PackageReference Include="Nerdbank.GitVersioning" Version="2.1.7" PrivateAssets="all" /> | ||
| 34 | </ItemGroup> | ||
| 35 | </Project> | ||
diff --git a/src/wixext/WixToolset.Netfx.wixext.targets b/src/wixext/WixToolset.Netfx.wixext.targets new file mode 100644 index 00000000..17312abf --- /dev/null +++ b/src/wixext/WixToolset.Netfx.wixext.targets | |||
| @@ -0,0 +1,11 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> | ||
| 5 | <PropertyGroup> | ||
| 6 | <WixToolsetNetfxWixextPath Condition=" '$(WixToolsetNetfxWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Netfx.wixext.dll"</WixToolsetNetfxWixextPath> | ||
| 7 | </PropertyGroup> | ||
| 8 | <ItemGroup> | ||
| 9 | <WixExtension Include="$(WixToolsetNetfxWixextPath)" /> | ||
| 10 | </ItemGroup> | ||
| 11 | </Project> | ||
diff --git a/src/wixext/netfx.xsd b/src/wixext/netfx.xsd new file mode 100644 index 00000000..6ef4e9b6 --- /dev/null +++ b/src/wixext/netfx.xsd | |||
| @@ -0,0 +1,235 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" | ||
| 6 | xmlns:xse=" http://wixtoolset.org/schemas/XmlSchemaExtension" | ||
| 7 | xmlns:html="http://www.w3.org/1999/xhtml" | ||
| 8 | targetNamespace="http://wixtoolset.org/schemas/v4/wxs/netfx" | ||
| 9 | xmlns="http://wixtoolset.org/schemas/v4/wxs/netfx"> | ||
| 10 | <xs:annotation> | ||
| 11 | <xs:documentation> | ||
| 12 | The source code schema for the WiX Toolset .NET Framework Extension. | ||
| 13 | </xs:documentation> | ||
| 14 | </xs:annotation> | ||
| 15 | |||
| 16 | <xs:element name="NativeImage"> | ||
| 17 | <xs:annotation> | ||
| 18 | <xs:documentation> | ||
| 19 | Improves the performance of managed applications by creating native images. | ||
| 20 | Requires the .NET Framework 2.0 or newer to be installed on the target machine since | ||
| 21 | it runs <html:a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx">NGen</html:a>. | ||
| 22 | </xs:documentation> | ||
| 23 | <xs:appinfo> | ||
| 24 | <xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="File" /> | ||
| 25 | <xse:remarks> | ||
| 26 | <html:p> | ||
| 27 | Native images are files containing compiled processor-specific machine code, which | ||
| 28 | are installed into the native image cache on the local computer. The runtime | ||
| 29 | can use native images from the cache instead using the just-in-time (JIT) | ||
| 30 | compiler to compile the original assembly. | ||
| 31 | </html:p> | ||
| 32 | <html:p> | ||
| 33 | The native image custom actions are configured to ignore failures so that failing | ||
| 34 | to generate or remove a native image will not cause setup to fail and roll back. | ||
| 35 | </html:p> | ||
| 36 | <html:p> | ||
| 37 | <html:b>Note for patches:</html:b> if you built your target, or baseline, MSI with | ||
| 38 | previous versions 3.0 or 3.5 of this extension and want to upgrade to formattable | ||
| 39 | values for @AssemblyApplication or @AppBaseDirectory you must also include a | ||
| 40 | BinaryRef to "NetFxCA" to pull in necessary changes. If you do use formattable | ||
| 41 | values and do not include the binary changes ngen.exe will not optimize your | ||
| 42 | native images for the specified application. | ||
| 43 | </html:p> | ||
| 44 | <html:p> | ||
| 45 | This should be a rare occurrence, however. Because you cannot remove components | ||
| 46 | in a patch - and pyro does validate you do not - it is not practical to switch | ||
| 47 | from using identifiers to formattable values in a patch. One practical possibility | ||
| 48 | is if you wanted to use a different application to optimize your native images | ||
| 49 | and that application is not already installed with the MSI to be updated. | ||
| 50 | </html:p> | ||
| 51 | </xse:remarks> | ||
| 52 | </xs:appinfo> | ||
| 53 | </xs:annotation> | ||
| 54 | <xs:complexType> | ||
| 55 | <xs:attribute name="Id" type="xs:string" use="required"> | ||
| 56 | <xs:annotation> | ||
| 57 | <xs:documentation> | ||
| 58 | The identifier for this NativeImage. | ||
| 59 | </xs:documentation> | ||
| 60 | </xs:annotation> | ||
| 61 | </xs:attribute> | ||
| 62 | <xs:attribute name="AppBaseDirectory" type="xs:string"> | ||
| 63 | <xs:annotation> | ||
| 64 | <xs:documentation> | ||
| 65 | <html:p> | ||
| 66 | The directory to use for locating dependent assemblies. | ||
| 67 | For DLL assemblies and assemblies installed to the Global Assembly Cache (GAC), | ||
| 68 | this attribute should be set to the directory of the application which loads this | ||
| 69 | assembly. For EXE assemblies, this attribute does not need to be set because NGen | ||
| 70 | will use the directory of the assembly file by default. | ||
| 71 | </html:p> | ||
| 72 | <html:p> | ||
| 73 | The value can be in the form of a directory identifier, or a formatted string | ||
| 74 | that resolves to either a directory identifier or a full path to a directory. | ||
| 75 | </html:p> | ||
| 76 | </xs:documentation> | ||
| 77 | </xs:annotation> | ||
| 78 | </xs:attribute> | ||
| 79 | <xs:attribute name="AssemblyApplication" type="xs:string"> | ||
| 80 | <xs:annotation> | ||
| 81 | <xs:documentation> | ||
| 82 | <html:p> | ||
| 83 | The application which will load this assembly. | ||
| 84 | For DLL assemblies which are loaded via reflection, this attribute should | ||
| 85 | be set to indicate the application which will load this assembly. | ||
| 86 | The configuration of the application (usually specified via an exe.config file) will be used | ||
| 87 | to determine how to resolve dependencies for this assembly. | ||
| 88 | </html:p> | ||
| 89 | <html:p> | ||
| 90 | The value can be in the form of a file identifier, or a formatted string | ||
| 91 | that resolves to either a file identifier or a full path to a file. | ||
| 92 | </html:p> | ||
| 93 | <html:p> | ||
| 94 | When a shared component is loaded at run time, using the Load method, the | ||
| 95 | application's configuration file determines the dependencies that are loaded | ||
| 96 | for the shared component — for example, the version of a dependency that is loaded. | ||
| 97 | This attribute gives guidance on which dependencies would be loaded at run time in order | ||
| 98 | to figure out which dependency assemblies will also need to have native images generated | ||
| 99 | (assuming the Dependency attribute is not set to "no"). | ||
| 100 | </html:p> | ||
| 101 | <html:p> | ||
| 102 | This attribute cannot be set if the AssemblyApplication attribute is set on the parent | ||
| 103 | File element (please note that these attributes both refer to the same application | ||
| 104 | assembly but do very different things: specifiying File/@AssemblyApplication will force | ||
| 105 | an assembly to install to a private location next to the indicated application, whereas | ||
| 106 | this AssemblyApplication attribute will be used to help resolve dependent assemblies | ||
| 107 | while generating native images for this assembly). | ||
| 108 | </html:p> | ||
| 109 | </xs:documentation> | ||
| 110 | </xs:annotation> | ||
| 111 | </xs:attribute> | ||
| 112 | <xs:attribute name="Debug" type="YesNoType"> | ||
| 113 | <xs:annotation> | ||
| 114 | <xs:documentation> | ||
| 115 | Set to "yes" to generate native images that can be used under a debugger. | ||
| 116 | The default value is "no". | ||
| 117 | </xs:documentation> | ||
| 118 | </xs:annotation> | ||
| 119 | </xs:attribute> | ||
| 120 | <xs:attribute name="Dependencies" type="YesNoType"> | ||
| 121 | <xs:annotation> | ||
| 122 | <xs:documentation> | ||
| 123 | Set to "no" to generate the minimum number of native images. | ||
| 124 | The default value is "yes". | ||
| 125 | </xs:documentation> | ||
| 126 | </xs:annotation> | ||
| 127 | </xs:attribute> | ||
| 128 | <xs:attribute name="Platform"> | ||
| 129 | <xs:annotation> | ||
| 130 | <xs:documentation> | ||
| 131 | Sets the platform(s) for which native images will be generated. | ||
| 132 | </xs:documentation> | ||
| 133 | </xs:annotation> | ||
| 134 | <xs:simpleType> | ||
| 135 | <xs:restriction base="xs:NMTOKEN"> | ||
| 136 | <xs:enumeration value="32bit"> | ||
| 137 | <xs:annotation> | ||
| 138 | <xs:documentation> | ||
| 139 | Attempt to generate native images only for the 32-bit version of the .NET Framework | ||
| 140 | on the target machine. If the 32-bit version of the .NET Framework 2.0 or newer is not | ||
| 141 | present on the target machine, native image custom actions will not be scheduled. | ||
| 142 | This is the default value. | ||
| 143 | </xs:documentation> | ||
| 144 | </xs:annotation> | ||
| 145 | </xs:enumeration> | ||
| 146 | <xs:enumeration value="64bit"> | ||
| 147 | <xs:annotation> | ||
| 148 | <xs:documentation> | ||
| 149 | Attempt to generate native images only for the 64-bit version of the .NET Framework | ||
| 150 | on the target machine. If a 64-bit version of the .NET Framework 2.0 or newer is not | ||
| 151 | present on the target machine, native image custom actions will not be scheduled. | ||
| 152 | </xs:documentation> | ||
| 153 | </xs:annotation> | ||
| 154 | </xs:enumeration> | ||
| 155 | <xs:enumeration value="all"> | ||
| 156 | <xs:annotation> | ||
| 157 | <xs:documentation> | ||
| 158 | Attempt to generate native images for the 32-bit and 64-bit versions of the .NET Framework | ||
| 159 | on the target machine. If a version of the .NET Framework 2.0 or newer is not present on the | ||
| 160 | target machine for a processor architecture, native image custom actions will not be | ||
| 161 | scheduled for that processor architecture. | ||
| 162 | </xs:documentation> | ||
| 163 | </xs:annotation> | ||
| 164 | </xs:enumeration> | ||
| 165 | </xs:restriction> | ||
| 166 | </xs:simpleType> | ||
| 167 | </xs:attribute> | ||
| 168 | <xs:attribute name="Priority"> | ||
| 169 | <xs:annotation> | ||
| 170 | <xs:documentation> | ||
| 171 | Sets the priority of generating the native images for this assembly. | ||
| 172 | </xs:documentation> | ||
| 173 | </xs:annotation> | ||
| 174 | <xs:simpleType> | ||
| 175 | <xs:restriction base="xs:NMTOKEN"> | ||
| 176 | <xs:enumeration value="0"> | ||
| 177 | <xs:annotation> | ||
| 178 | <xs:documentation> | ||
| 179 | This is the highest priority, it means that image generation occurs syncronously | ||
| 180 | during the setup process. This option will slow down setup performance. | ||
| 181 | </xs:documentation> | ||
| 182 | </xs:annotation> | ||
| 183 | </xs:enumeration> | ||
| 184 | <xs:enumeration value="1"> | ||
| 185 | <xs:annotation> | ||
| 186 | <xs:documentation> | ||
| 187 | This will queue image generation to the NGen service to occur immediately. | ||
| 188 | This option will slow down setup performance. | ||
| 189 | </xs:documentation> | ||
| 190 | </xs:annotation> | ||
| 191 | </xs:enumeration> | ||
| 192 | <xs:enumeration value="2"> | ||
| 193 | <xs:annotation> | ||
| 194 | <xs:documentation> | ||
| 195 | This will queue image generation to the NGen service to occur after all priority 1 | ||
| 196 | assemblies have completed. | ||
| 197 | This option will slow down setup performance. | ||
| 198 | </xs:documentation> | ||
| 199 | </xs:annotation> | ||
| 200 | </xs:enumeration> | ||
| 201 | <xs:enumeration value="3"> | ||
| 202 | <xs:annotation> | ||
| 203 | <xs:documentation> | ||
| 204 | This is the lowest priority, it will queue image generation to occur when the | ||
| 205 | machine is idle. | ||
| 206 | This option should not slow down setup performance. | ||
| 207 | This is the default value. | ||
| 208 | </xs:documentation> | ||
| 209 | </xs:annotation> | ||
| 210 | </xs:enumeration> | ||
| 211 | </xs:restriction> | ||
| 212 | </xs:simpleType> | ||
| 213 | </xs:attribute> | ||
| 214 | <xs:attribute name="Profile" type="YesNoType"> | ||
| 215 | <xs:annotation> | ||
| 216 | <xs:documentation> | ||
| 217 | Set to "yes" to generate native images that can be used under a profiler. | ||
| 218 | The default value is "no". | ||
| 219 | </xs:documentation> | ||
| 220 | </xs:annotation> | ||
| 221 | </xs:attribute> | ||
| 222 | </xs:complexType> | ||
| 223 | </xs:element> | ||
| 224 | |||
| 225 | <xs:simpleType name="YesNoType"> | ||
| 226 | <xs:annotation> | ||
| 227 | <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation> | ||
| 228 | </xs:annotation> | ||
| 229 | <xs:restriction base='xs:NMTOKEN'> | ||
| 230 | <xs:enumeration value="no"/> | ||
| 231 | <xs:enumeration value="yes"/> | ||
| 232 | </xs:restriction> | ||
| 233 | </xs:simpleType> | ||
| 234 | |||
| 235 | </xs:schema> | ||
diff --git a/src/wixlib/NetFx1.1.wxs b/src/wixlib/NetFx1.1.wxs new file mode 100644 index 00000000..406aef3f --- /dev/null +++ b/src/wixlib/NetFx1.1.wxs | |||
| @@ -0,0 +1,192 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 1.1 - http://msdn.microsoft.com/library/ms994339.aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <!-- set to #1 if the .NET Framework 1.1 is installed (not set otherwise) --> | ||
| 16 | <Fragment> | ||
| 17 | <Property Id="NETFRAMEWORK11" Secure="yes"> | ||
| 18 | <RegistrySearch Id="NetFramework11" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="Install" Type="raw" /> | ||
| 19 | </Property> | ||
| 20 | </Fragment> | ||
| 21 | |||
| 22 | <!-- Indicates the service pack level for the .NET Framework 1.1. --> | ||
| 23 | <Fragment> | ||
| 24 | <Property Id="NETFRAMEWORK11_SP_LEVEL" Secure="yes"> | ||
| 25 | <RegistrySearch Id="NetFramework11SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="SP" Type="raw" /> | ||
| 26 | </Property> | ||
| 27 | </Fragment> | ||
| 28 | |||
| 29 | <!-- Location of .NET Framework 1.1 redistributable install root directory --> | ||
| 30 | <Fragment> | ||
| 31 | <Property Id="NETFRAMEWORK11INSTALLROOTDIR" Secure="yes"> | ||
| 32 | <RegistrySearch Id="NetFxInstallRootForNetfx11Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot"> | ||
| 33 | <DirectorySearch Id="NetFx11InstallRootSearch" Path="v1.1.4322" Depth="0" /> | ||
| 34 | </RegistrySearch> | ||
| 35 | </Property> | ||
| 36 | </Fragment> | ||
| 37 | |||
| 38 | <!-- set to #1 if the .NET Framework 1.1 Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 39 | <Fragment> | ||
| 40 | <Property Id="NETFRAMEWORK11_ZH_CN_LANGPACK" Secure="yes"> | ||
| 41 | <RegistrySearch Id="NetFramework11ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2052" Name="Install" Type="raw" /> | ||
| 42 | </Property> | ||
| 43 | </Fragment> | ||
| 44 | |||
| 45 | <!-- set to #1 if the .NET Framework 1.1 Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 46 | <Fragment> | ||
| 47 | <Property Id="NETFRAMEWORK11_ZH_TW_LANGPACK" Secure="yes"> | ||
| 48 | <RegistrySearch Id="NetFramework11ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1028" Name="Install" Type="raw" /> | ||
| 49 | </Property> | ||
| 50 | </Fragment> | ||
| 51 | |||
| 52 | <!-- set to #1 if the .NET Framework 1.1 Czech language pack is installed (not set otherwise) --> | ||
| 53 | <Fragment> | ||
| 54 | <Property Id="NETFRAMEWORK11_CS_CZ_LANGPACK" Secure="yes"> | ||
| 55 | <RegistrySearch Id="NetFramework11CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1029" Name="Install" Type="raw" /> | ||
| 56 | </Property> | ||
| 57 | </Fragment> | ||
| 58 | |||
| 59 | <!-- set to #1 if the .NET Framework 1.1 Danish language pack is installed (not set otherwise) --> | ||
| 60 | <Fragment> | ||
| 61 | <Property Id="NETFRAMEWORK11_DA_DK_LANGPACK" Secure="yes"> | ||
| 62 | <RegistrySearch Id="NetFramework11DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1030" Name="Install" Type="raw" /> | ||
| 63 | </Property> | ||
| 64 | </Fragment> | ||
| 65 | |||
| 66 | <!-- set to #1 if the .NET Framework 1.1 Dutch language pack is installed (not set otherwise) --> | ||
| 67 | <Fragment> | ||
| 68 | <Property Id="NETFRAMEWORK11_NL_NL_LANGPACK" Secure="yes"> | ||
| 69 | <RegistrySearch Id="NetFramework11NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1043" Name="Install" Type="raw" /> | ||
| 70 | </Property> | ||
| 71 | </Fragment> | ||
| 72 | |||
| 73 | <!-- set to #1 if the .NET Framework 1.1 Finnish language pack is installed (not set otherwise) --> | ||
| 74 | <Fragment> | ||
| 75 | <Property Id="NETFRAMEWORK11_FI_FI_LANGPACK" Secure="yes"> | ||
| 76 | <RegistrySearch Id="NetFramework11FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1035" Name="Install" Type="raw" /> | ||
| 77 | </Property> | ||
| 78 | </Fragment> | ||
| 79 | |||
| 80 | <!-- set to #1 if the .NET Framework 1.1 French language pack is installed (not set otherwise) --> | ||
| 81 | <Fragment> | ||
| 82 | <Property Id="NETFRAMEWORK11_FR_FR_LANGPACK" Secure="yes"> | ||
| 83 | <RegistrySearch Id="NetFramework11FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1036" Name="Install" Type="raw" /> | ||
| 84 | </Property> | ||
| 85 | </Fragment> | ||
| 86 | |||
| 87 | <!-- set to #1 if the .NET Framework 1.1 German language pack is installed (not set otherwise) --> | ||
| 88 | <Fragment> | ||
| 89 | <Property Id="NETFRAMEWORK11_DE_DE_LANGPACK" Secure="yes"> | ||
| 90 | <RegistrySearch Id="NetFramework11DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1031" Name="Install" Type="raw" /> | ||
| 91 | </Property> | ||
| 92 | </Fragment> | ||
| 93 | |||
| 94 | <!-- set to #1 if the .NET Framework 1.1 Greek language pack is installed (not set otherwise) --> | ||
| 95 | <Fragment> | ||
| 96 | <Property Id="NETFRAMEWORK11_EL_GR_LANGPACK" Secure="yes"> | ||
| 97 | <RegistrySearch Id="NetFramework11ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1032" Name="Install" Type="raw" /> | ||
| 98 | </Property> | ||
| 99 | </Fragment> | ||
| 100 | |||
| 101 | <!-- set to #1 if the .NET Framework 1.1 Hungarian language pack is installed (not set otherwise) --> | ||
| 102 | <Fragment> | ||
| 103 | <Property Id="NETFRAMEWORK11_HU_HU_LANGPACK" Secure="yes"> | ||
| 104 | <RegistrySearch Id="NetFramework11HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1038" Name="Install" Type="raw" /> | ||
| 105 | </Property> | ||
| 106 | </Fragment> | ||
| 107 | |||
| 108 | <!-- set to #1 if the .NET Framework 1.1 Italian language pack is installed (not set otherwise) --> | ||
| 109 | <Fragment> | ||
| 110 | <Property Id="NETFRAMEWORK11_IT_IT_LANGPACK" Secure="yes"> | ||
| 111 | <RegistrySearch Id="NetFramework11ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1040" Name="Install" Type="raw" /> | ||
| 112 | </Property> | ||
| 113 | </Fragment> | ||
| 114 | |||
| 115 | <!-- set to #1 if the .NET Framework 1.1 Japanese language pack is installed (not set otherwise) --> | ||
| 116 | <Fragment> | ||
| 117 | <Property Id="NETFRAMEWORK11_JA_JP_LANGPACK" Secure="yes"> | ||
| 118 | <RegistrySearch Id="NetFramework11JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1041" Name="Install" Type="raw" /> | ||
| 119 | </Property> | ||
| 120 | </Fragment> | ||
| 121 | |||
| 122 | <!-- set to #1 if the .NET Framework 1.1 Korean language pack is installed (not set otherwise) --> | ||
| 123 | <Fragment> | ||
| 124 | <Property Id="NETFRAMEWORK11_KO_KR_LANGPACK" Secure="yes"> | ||
| 125 | <RegistrySearch Id="NetFramework11KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1042" Name="Install" Type="raw" /> | ||
| 126 | </Property> | ||
| 127 | </Fragment> | ||
| 128 | |||
| 129 | <!-- set to #1 if the .NET Framework 1.1 Norwegian language pack is installed (not set otherwise) --> | ||
| 130 | <Fragment> | ||
| 131 | <Property Id="NETFRAMEWORK11_NB_NO_LANGPACK" Secure="yes"> | ||
| 132 | <RegistrySearch Id="NetFramework11NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1044" Name="Install" Type="raw" /> | ||
| 133 | </Property> | ||
| 134 | </Fragment> | ||
| 135 | |||
| 136 | <!-- set to #1 if the .NET Framework 1.1 Polish language pack is installed (not set otherwise) --> | ||
| 137 | <Fragment> | ||
| 138 | <Property Id="NETFRAMEWORK11_PL_PL_LANGPACK" Secure="yes"> | ||
| 139 | <RegistrySearch Id="NetFramework11PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1045" Name="Install" Type="raw" /> | ||
| 140 | </Property> | ||
| 141 | </Fragment> | ||
| 142 | |||
| 143 | <!-- set to #1 if the .NET Framework 1.1 Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 144 | <Fragment> | ||
| 145 | <Property Id="NETFRAMEWORK11_PT_BR_LANGPACK" Secure="yes"> | ||
| 146 | <RegistrySearch Id="NetFramework11PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1046" Name="Install" Type="raw" /> | ||
| 147 | </Property> | ||
| 148 | </Fragment> | ||
| 149 | |||
| 150 | <!-- set to #1 if the .NET Framework 1.1 Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 151 | <Fragment> | ||
| 152 | <Property Id="NETFRAMEWORK11_PT_PT_LANGPACK" Secure="yes"> | ||
| 153 | <RegistrySearch Id="NetFramework11PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2070" Name="Install" Type="raw" /> | ||
| 154 | </Property> | ||
| 155 | </Fragment> | ||
| 156 | |||
| 157 | <!-- set to #1 if the .NET Framework 1.1 Russian language pack is installed (not set otherwise) --> | ||
| 158 | <Fragment> | ||
| 159 | <Property Id="NETFRAMEWORK11_RU_RU_LANGPACK" Secure="yes"> | ||
| 160 | <RegistrySearch Id="NetFramework11RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1049" Name="Install" Type="raw" /> | ||
| 161 | </Property> | ||
| 162 | </Fragment> | ||
| 163 | |||
| 164 | <!-- set to #1 if the .NET Framework 1.1 Spanish language pack is installed (not set otherwise) --> | ||
| 165 | <Fragment> | ||
| 166 | <Property Id="NETFRAMEWORK11_ES_ES_LANGPACK" Secure="yes"> | ||
| 167 | <RegistrySearch Id="NetFramework11EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\3082" Name="Install" Type="raw" /> | ||
| 168 | </Property> | ||
| 169 | </Fragment> | ||
| 170 | |||
| 171 | <!-- set to #1 if the .NET Framework 1.1 Swedish language pack is installed (not set otherwise) --> | ||
| 172 | <Fragment> | ||
| 173 | <Property Id="NETFRAMEWORK11_SV_SE_LANGPACK" Secure="yes"> | ||
| 174 | <RegistrySearch Id="NetFramework11SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1053" Name="Install" Type="raw" /> | ||
| 175 | </Property> | ||
| 176 | </Fragment> | ||
| 177 | |||
| 178 | <!-- set to #1 if the .NET Framework 1.1 Turkish language pack is installed (not set otherwise) --> | ||
| 179 | <Fragment> | ||
| 180 | <Property Id="NETFRAMEWORK11_TR_TR_LANGPACK" Secure="yes"> | ||
| 181 | <RegistrySearch Id="NetFramework11TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1055" Name="Install" Type="raw" /> | ||
| 182 | </Property> | ||
| 183 | </Fragment> | ||
| 184 | |||
| 185 | <!-- location of the .NET Framework 1.1 SDK installation root --> | ||
| 186 | <Fragment> | ||
| 187 | <Property Id="NETFRAMEWORK11SDKDIR" Secure="yes"> | ||
| 188 | <RegistrySearch Id="NetFramework11SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv1.1" Type="raw" /> | ||
| 189 | </Property> | ||
| 190 | </Fragment> | ||
| 191 | |||
| 192 | </Wix> | ||
diff --git a/src/wixlib/NetFx1.wxs b/src/wixlib/NetFx1.wxs new file mode 100644 index 00000000..c1b266e8 --- /dev/null +++ b/src/wixlib/NetFx1.wxs | |||
| @@ -0,0 +1,31 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 1.0 - http://msdn.microsoft.com/library/ms994349.aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <!-- set to 3321-3705 if the .NET Framework 1.0 is installed (not set otherwise) --> | ||
| 16 | <Fragment> | ||
| 17 | <Property Id="NETFRAMEWORK10" Secure="yes"> | ||
| 18 | <RegistrySearch Id="NetFramework10" Root="HKLM" Key="SOFTWARE\Microsoft\.NETFramework\policy\v1.0" Name="3705" Type="raw" /> | ||
| 19 | </Property> | ||
| 20 | </Fragment> | ||
| 21 | |||
| 22 | <!-- Location of .NET Framework 1.0 redistributable install root directory --> | ||
| 23 | <Fragment> | ||
| 24 | <Property Id="NETFRAMEWORK10INSTALLROOTDIR" Secure="yes"> | ||
| 25 | <RegistrySearch Id="NetFxInstallRootForNetfx10Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot"> | ||
| 26 | <DirectorySearch Id="NetFx10InstallRootSearch" Path="v1.0.3705" Depth="0" /> | ||
| 27 | </RegistrySearch> | ||
| 28 | </Property> | ||
| 29 | </Fragment> | ||
| 30 | |||
| 31 | </Wix> | ||
diff --git a/src/wixlib/NetFx2.wxs b/src/wixlib/NetFx2.wxs new file mode 100644 index 00000000..92386b02 --- /dev/null +++ b/src/wixlib/NetFx2.wxs | |||
| @@ -0,0 +1,201 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 2.0 - http://msdn.microsoft.com/library/aa480243.aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <!-- set to #1 if the .NET Framework 2.0 is installed (not set otherwise) --> | ||
| 16 | <Fragment> | ||
| 17 | <Property Id="NETFRAMEWORK20" Secure="yes"> | ||
| 18 | <RegistrySearch Id="NetFramework20" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="Install" Type="raw" /> | ||
| 19 | </Property> | ||
| 20 | </Fragment> | ||
| 21 | |||
| 22 | <!-- Indicates the service pack level for the .NET Framework 2.0. --> | ||
| 23 | <Fragment> | ||
| 24 | <Property Id="NETFRAMEWORK20_SP_LEVEL" Secure="yes"> | ||
| 25 | <RegistrySearch Id="NetFramework20SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="SP" Type="raw" /> | ||
| 26 | </Property> | ||
| 27 | </Fragment> | ||
| 28 | |||
| 29 | <!-- Location of .NET Framework 2.0 redistributable install root directory --> | ||
| 30 | <Fragment> | ||
| 31 | <Property Id="NETFRAMEWORK20INSTALLROOTDIR" Secure="yes"> | ||
| 32 | <RegistrySearch Id="NetFxInstallRootForNetfx20Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot"> | ||
| 33 | <DirectorySearch Id="NetFx20InstallRootSearch" Path="v2.0.50727" Depth="0" /> | ||
| 34 | </RegistrySearch> | ||
| 35 | </Property> | ||
| 36 | </Fragment> | ||
| 37 | |||
| 38 | <!-- Location of .NET Framework 2.0 (64-bit) redistributable install root directory --> | ||
| 39 | <Fragment> | ||
| 40 | <Property Id="NETFRAMEWORK20INSTALLROOTDIR64" Secure="yes"> | ||
| 41 | <RegistrySearch Id="NetFxInstallRootForNetfx20Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes"> | ||
| 42 | <DirectorySearch Id="NetFx20InstallRootSearch64" Path="v2.0.50727" Depth="0" /> | ||
| 43 | </RegistrySearch> | ||
| 44 | </Property> | ||
| 45 | </Fragment> | ||
| 46 | |||
| 47 | <!-- set to #1 if the .NET Framework 2.0 Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 48 | <Fragment> | ||
| 49 | <Property Id="NETFRAMEWORK20_ZH_CN_LANGPACK" Secure="yes"> | ||
| 50 | <RegistrySearch Id="NETFRAMEWORK20ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2052" Name="Install" Type="raw" /> | ||
| 51 | </Property> | ||
| 52 | </Fragment> | ||
| 53 | |||
| 54 | <!-- set to #1 if the .NET Framework 2.0 Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 55 | <Fragment> | ||
| 56 | <Property Id="NETFRAMEWORK20_ZH_TW_LANGPACK" Secure="yes"> | ||
| 57 | <RegistrySearch Id="NETFRAMEWORK20ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1028" Name="Install" Type="raw" /> | ||
| 58 | </Property> | ||
| 59 | </Fragment> | ||
| 60 | |||
| 61 | <!-- set to #1 if the .NET Framework 2.0 Czech language pack is installed (not set otherwise) --> | ||
| 62 | <Fragment> | ||
| 63 | <Property Id="NETFRAMEWORK20_CS_CZ_LANGPACK" Secure="yes"> | ||
| 64 | <RegistrySearch Id="NETFRAMEWORK20CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1029" Name="Install" Type="raw" /> | ||
| 65 | </Property> | ||
| 66 | </Fragment> | ||
| 67 | |||
| 68 | <!-- set to #1 if the .NET Framework 2.0 Danish language pack is installed (not set otherwise) --> | ||
| 69 | <Fragment> | ||
| 70 | <Property Id="NETFRAMEWORK20_DA_DK_LANGPACK" Secure="yes"> | ||
| 71 | <RegistrySearch Id="NETFRAMEWORK20DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1030" Name="Install" Type="raw" /> | ||
| 72 | </Property> | ||
| 73 | </Fragment> | ||
| 74 | |||
| 75 | <!-- set to #1 if the .NET Framework 2.0 Dutch language pack is installed (not set otherwise) --> | ||
| 76 | <Fragment> | ||
| 77 | <Property Id="NETFRAMEWORK20_NL_NL_LANGPACK" Secure="yes"> | ||
| 78 | <RegistrySearch Id="NETFRAMEWORK20NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1043" Name="Install" Type="raw" /> | ||
| 79 | </Property> | ||
| 80 | </Fragment> | ||
| 81 | |||
| 82 | <!-- set to #1 if the .NET Framework 2.0 Finnish language pack is installed (not set otherwise) --> | ||
| 83 | <Fragment> | ||
| 84 | <Property Id="NETFRAMEWORK20_FI_FI_LANGPACK" Secure="yes"> | ||
| 85 | <RegistrySearch Id="NETFRAMEWORK20FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1035" Name="Install" Type="raw" /> | ||
| 86 | </Property> | ||
| 87 | </Fragment> | ||
| 88 | |||
| 89 | <!-- set to #1 if the .NET Framework 2.0 French language pack is installed (not set otherwise) --> | ||
| 90 | <Fragment> | ||
| 91 | <Property Id="NETFRAMEWORK20_FR_FR_LANGPACK" Secure="yes"> | ||
| 92 | <RegistrySearch Id="NETFRAMEWORK20FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1036" Name="Install" Type="raw" /> | ||
| 93 | </Property> | ||
| 94 | </Fragment> | ||
| 95 | |||
| 96 | <!-- set to #1 if the .NET Framework 2.0 German language pack is installed (not set otherwise) --> | ||
| 97 | <Fragment> | ||
| 98 | <Property Id="NETFRAMEWORK20_DE_DE_LANGPACK" Secure="yes"> | ||
| 99 | <RegistrySearch Id="NETFRAMEWORK20DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1031" Name="Install" Type="raw" /> | ||
| 100 | </Property> | ||
| 101 | </Fragment> | ||
| 102 | |||
| 103 | <!-- set to #1 if the .NET Framework 2.0 Greek language pack is installed (not set otherwise) --> | ||
| 104 | <Fragment> | ||
| 105 | <Property Id="NETFRAMEWORK20_EL_GR_LANGPACK" Secure="yes"> | ||
| 106 | <RegistrySearch Id="NETFRAMEWORK20ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1032" Name="Install" Type="raw" /> | ||
| 107 | </Property> | ||
| 108 | </Fragment> | ||
| 109 | |||
| 110 | <!-- set to #1 if the .NET Framework 2.0 Hungarian language pack is installed (not set otherwise) --> | ||
| 111 | <Fragment> | ||
| 112 | <Property Id="NETFRAMEWORK20_HU_HU_LANGPACK" Secure="yes"> | ||
| 113 | <RegistrySearch Id="NETFRAMEWORK20HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1038" Name="Install" Type="raw" /> | ||
| 114 | </Property> | ||
| 115 | </Fragment> | ||
| 116 | |||
| 117 | <!-- set to #1 if the .NET Framework 2.0 Italian language pack is installed (not set otherwise) --> | ||
| 118 | <Fragment> | ||
| 119 | <Property Id="NETFRAMEWORK20_IT_IT_LANGPACK" Secure="yes"> | ||
| 120 | <RegistrySearch Id="NETFRAMEWORK20ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1040" Name="Install" Type="raw" /> | ||
| 121 | </Property> | ||
| 122 | </Fragment> | ||
| 123 | |||
| 124 | <!-- set to #1 if the .NET Framework 2.0 Japanese language pack is installed (not set otherwise) --> | ||
| 125 | <Fragment> | ||
| 126 | <Property Id="NETFRAMEWORK20_JA_JP_LANGPACK" Secure="yes"> | ||
| 127 | <RegistrySearch Id="NETFRAMEWORK20JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1041" Name="Install" Type="raw" /> | ||
| 128 | </Property> | ||
| 129 | </Fragment> | ||
| 130 | |||
| 131 | <!-- set to #1 if the .NET Framework 2.0 Korean language pack is installed (not set otherwise) --> | ||
| 132 | <Fragment> | ||
| 133 | <Property Id="NETFRAMEWORK20_KO_KR_LANGPACK" Secure="yes"> | ||
| 134 | <RegistrySearch Id="NETFRAMEWORK20KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1042" Name="Install" Type="raw" /> | ||
| 135 | </Property> | ||
| 136 | </Fragment> | ||
| 137 | |||
| 138 | <!-- set to #1 if the .NET Framework 2.0 Norwegian language pack is installed (not set otherwise) --> | ||
| 139 | <Fragment> | ||
| 140 | <Property Id="NETFRAMEWORK20_NB_NO_LANGPACK" Secure="yes"> | ||
| 141 | <RegistrySearch Id="NETFRAMEWORK20NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1044" Name="Install" Type="raw" /> | ||
| 142 | </Property> | ||
| 143 | </Fragment> | ||
| 144 | |||
| 145 | <!-- set to #1 if the .NET Framework 2.0 Polish language pack is installed (not set otherwise) --> | ||
| 146 | <Fragment> | ||
| 147 | <Property Id="NETFRAMEWORK20_PL_PL_LANGPACK" Secure="yes"> | ||
| 148 | <RegistrySearch Id="NETFRAMEWORK20PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1045" Name="Install" Type="raw" /> | ||
| 149 | </Property> | ||
| 150 | </Fragment> | ||
| 151 | |||
| 152 | <!-- set to #1 if the .NET Framework 2.0 Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 153 | <Fragment> | ||
| 154 | <Property Id="NETFRAMEWORK20_PT_BR_LANGPACK" Secure="yes"> | ||
| 155 | <RegistrySearch Id="NETFRAMEWORK20PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1046" Name="Install" Type="raw" /> | ||
| 156 | </Property> | ||
| 157 | </Fragment> | ||
| 158 | |||
| 159 | <!-- set to #1 if the .NET Framework 2.0 Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 160 | <Fragment> | ||
| 161 | <Property Id="NETFRAMEWORK20_PT_PT_LANGPACK" Secure="yes"> | ||
| 162 | <RegistrySearch Id="NETFRAMEWORK20PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2070" Name="Install" Type="raw" /> | ||
| 163 | </Property> | ||
| 164 | </Fragment> | ||
| 165 | |||
| 166 | <!-- set to #1 if the .NET Framework 2.0 Russian language pack is installed (not set otherwise) --> | ||
| 167 | <Fragment> | ||
| 168 | <Property Id="NETFRAMEWORK20_RU_RU_LANGPACK" Secure="yes"> | ||
| 169 | <RegistrySearch Id="NETFRAMEWORK20RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1049" Name="Install" Type="raw" /> | ||
| 170 | </Property> | ||
| 171 | </Fragment> | ||
| 172 | |||
| 173 | <!-- set to #1 if the .NET Framework 2.0 Spanish language pack is installed (not set otherwise) --> | ||
| 174 | <Fragment> | ||
| 175 | <Property Id="NETFRAMEWORK20_ES_ES_LANGPACK" Secure="yes"> | ||
| 176 | <RegistrySearch Id="NETFRAMEWORK20EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\3082" Name="Install" Type="raw" /> | ||
| 177 | </Property> | ||
| 178 | </Fragment> | ||
| 179 | |||
| 180 | <!-- set to #1 if the .NET Framework 2.0 Swedish language pack is installed (not set otherwise) --> | ||
| 181 | <Fragment> | ||
| 182 | <Property Id="NETFRAMEWORK20_SV_SE_LANGPACK" Secure="yes"> | ||
| 183 | <RegistrySearch Id="NETFRAMEWORK20SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1053" Name="Install" Type="raw" /> | ||
| 184 | </Property> | ||
| 185 | </Fragment> | ||
| 186 | |||
| 187 | <!-- set to #1 if the .NET Framework 2.0 Turkish language pack is installed (not set otherwise) --> | ||
| 188 | <Fragment> | ||
| 189 | <Property Id="NETFRAMEWORK20_TR_TR_LANGPACK" Secure="yes"> | ||
| 190 | <RegistrySearch Id="NETFRAMEWORK20TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1055" Name="Install" Type="raw" /> | ||
| 191 | </Property> | ||
| 192 | </Fragment> | ||
| 193 | |||
| 194 | <!-- location of the .NET Framework 2.0 SDK installation root --> | ||
| 195 | <Fragment> | ||
| 196 | <Property Id="NETFRAMEWORK20SDKDIR" Secure="yes"> | ||
| 197 | <RegistrySearch Id="NetFramework20SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv2.0" Type="raw" /> | ||
| 198 | </Property> | ||
| 199 | </Fragment> | ||
| 200 | |||
| 201 | </Wix> | ||
diff --git a/src/wixlib/NetFx3.5.wxs b/src/wixlib/NetFx3.5.wxs new file mode 100644 index 00000000..422608da --- /dev/null +++ b/src/wixlib/NetFx3.5.wxs | |||
| @@ -0,0 +1,241 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following locations: | ||
| 11 | |||
| 12 | .NET Framework 3.5 - http://msdn.microsoft.com/library/cc160716.aspx | ||
| 13 | .NET Framework 3.5 client profile - http://download.microsoft.com/download/5/a/a/5aa86d6c-969b-42d8-bc6b-30e02bfeccf0/NETFXClientProfile_DeploymentGuide.htm | ||
| 14 | --> | ||
| 15 | |||
| 16 | <!-- Indicates the service pack level for the .NET Framework 3.5 (for bundles). --> | ||
| 17 | <Fragment> | ||
| 18 | <util:RegistrySearch | ||
| 19 | Id="NETFRAMEWORK35_SP_LEVEL" | ||
| 20 | Variable="NETFRAMEWORK35_SP_LEVEL" | ||
| 21 | Root="HKLM" | ||
| 22 | Key="Software\Microsoft\NET Framework Setup\NDP\v3.5" | ||
| 23 | Value="SP" | ||
| 24 | Result="value" /> | ||
| 25 | </Fragment> | ||
| 26 | |||
| 27 | <!-- set to #1 if the .NET Framework 3.5 is installed (not set otherwise) --> | ||
| 28 | <Fragment> | ||
| 29 | <Property Id="NETFRAMEWORK35" Secure="yes"> | ||
| 30 | <RegistrySearch Id="NetFramework35" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" Name="Install" Type="raw" /> | ||
| 31 | </Property> | ||
| 32 | </Fragment> | ||
| 33 | |||
| 34 | <!-- Indicates the service pack level for the .NET Framework 3.5. --> | ||
| 35 | <Fragment> | ||
| 36 | <Property Id="NETFRAMEWORK35_SP_LEVEL" Secure="yes"> | ||
| 37 | <RegistrySearch Id="NetFramework35SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5" Name="SP" Type="raw" /> | ||
| 38 | </Property> | ||
| 39 | </Fragment> | ||
| 40 | |||
| 41 | <!-- Location of .NET Framework 3.5 redistributable install root directory --> | ||
| 42 | <Fragment> | ||
| 43 | <Property Id="NETFRAMEWORK35INSTALLROOTDIR" Secure="yes"> | ||
| 44 | <RegistrySearch Id="NetFxInstallRootForNetfx35Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot"> | ||
| 45 | <DirectorySearch Id="NetFx35InstallRootSearch" Path="v3.5" Depth="0" /> | ||
| 46 | </RegistrySearch> | ||
| 47 | </Property> | ||
| 48 | </Fragment> | ||
| 49 | |||
| 50 | <!-- Location of .NET Framework 3.5 (64-bit) redistributable install root directory --> | ||
| 51 | <Fragment> | ||
| 52 | <Property Id="NETFRAMEWORK35INSTALLROOTDIR64" Secure="yes"> | ||
| 53 | <RegistrySearch Id="NetFxInstallRootForNetfx35Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes"> | ||
| 54 | <DirectorySearch Id="NetFx35InstallRootSearch64" Path="v3.5" Depth="0" /> | ||
| 55 | </RegistrySearch> | ||
| 56 | </Property> | ||
| 57 | </Fragment> | ||
| 58 | |||
| 59 | <!-- set to #1 if the .NET Framework 3.5 Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 60 | <Fragment> | ||
| 61 | <Property Id="NETFRAMEWORK35_ZH_CN_LANGPACK" Secure="yes"> | ||
| 62 | <RegistrySearch Id="NETFRAMEWORK35ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2052" Name="Install" Type="raw" /> | ||
| 63 | </Property> | ||
| 64 | </Fragment> | ||
| 65 | |||
| 66 | <!-- set to #1 if the .NET Framework 3.5 Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 67 | <Fragment> | ||
| 68 | <Property Id="NETFRAMEWORK35_ZH_TW_LANGPACK" Secure="yes"> | ||
| 69 | <RegistrySearch Id="NETFRAMEWORK35ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1028" Name="Install" Type="raw" /> | ||
| 70 | </Property> | ||
| 71 | </Fragment> | ||
| 72 | |||
| 73 | <!-- set to #1 if the .NET Framework 3.5 Czech language pack is installed (not set otherwise) --> | ||
| 74 | <Fragment> | ||
| 75 | <Property Id="NETFRAMEWORK35_CS_CZ_LANGPACK" Secure="yes"> | ||
| 76 | <RegistrySearch Id="NETFRAMEWORK35CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1029" Name="Install" Type="raw" /> | ||
| 77 | </Property> | ||
| 78 | </Fragment> | ||
| 79 | |||
| 80 | <!-- set to #1 if the .NET Framework 3.5 Danish language pack is installed (not set otherwise) --> | ||
| 81 | <Fragment> | ||
| 82 | <Property Id="NETFRAMEWORK35_DA_DK_LANGPACK" Secure="yes"> | ||
| 83 | <RegistrySearch Id="NETFRAMEWORK35DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1030" Name="Install" Type="raw" /> | ||
| 84 | </Property> | ||
| 85 | </Fragment> | ||
| 86 | |||
| 87 | <!-- set to #1 if the .NET Framework 3.5 Dutch language pack is installed (not set otherwise) --> | ||
| 88 | <Fragment> | ||
| 89 | <Property Id="NETFRAMEWORK35_NL_NL_LANGPACK" Secure="yes"> | ||
| 90 | <RegistrySearch Id="NETFRAMEWORK35NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1043" Name="Install" Type="raw" /> | ||
| 91 | </Property> | ||
| 92 | </Fragment> | ||
| 93 | |||
| 94 | <!-- set to #1 if the .NET Framework 3.5 Finnish language pack is installed (not set otherwise) --> | ||
| 95 | <Fragment> | ||
| 96 | <Property Id="NETFRAMEWORK35_FI_FI_LANGPACK" Secure="yes"> | ||
| 97 | <RegistrySearch Id="NETFRAMEWORK35FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1035" Name="Install" Type="raw" /> | ||
| 98 | </Property> | ||
| 99 | </Fragment> | ||
| 100 | |||
| 101 | <!-- set to #1 if the .NET Framework 3.5 French language pack is installed (not set otherwise) --> | ||
| 102 | <Fragment> | ||
| 103 | <Property Id="NETFRAMEWORK35_FR_FR_LANGPACK" Secure="yes"> | ||
| 104 | <RegistrySearch Id="NETFRAMEWORK35FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1036" Name="Install" Type="raw" /> | ||
| 105 | </Property> | ||
| 106 | </Fragment> | ||
| 107 | |||
| 108 | <!-- set to #1 if the .NET Framework 3.5 German language pack is installed (not set otherwise) --> | ||
| 109 | <Fragment> | ||
| 110 | <Property Id="NETFRAMEWORK35_DE_DE_LANGPACK" Secure="yes"> | ||
| 111 | <RegistrySearch Id="NETFRAMEWORK35DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1031" Name="Install" Type="raw" /> | ||
| 112 | </Property> | ||
| 113 | </Fragment> | ||
| 114 | |||
| 115 | <!-- set to #1 if the .NET Framework 3.5 Greek language pack is installed (not set otherwise) --> | ||
| 116 | <Fragment> | ||
| 117 | <Property Id="NETFRAMEWORK35_EL_GR_LANGPACK" Secure="yes"> | ||
| 118 | <RegistrySearch Id="NETFRAMEWORK35ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1032" Name="Install" Type="raw" /> | ||
| 119 | </Property> | ||
| 120 | </Fragment> | ||
| 121 | |||
| 122 | <!-- set to #1 if the .NET Framework 3.5 Hungarian language pack is installed (not set otherwise) --> | ||
| 123 | <Fragment> | ||
| 124 | <Property Id="NETFRAMEWORK35_HU_HU_LANGPACK" Secure="yes"> | ||
| 125 | <RegistrySearch Id="NETFRAMEWORK35HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1038" Name="Install" Type="raw" /> | ||
| 126 | </Property> | ||
| 127 | </Fragment> | ||
| 128 | |||
| 129 | <!-- set to #1 if the .NET Framework 3.5 Italian language pack is installed (not set otherwise) --> | ||
| 130 | <Fragment> | ||
| 131 | <Property Id="NETFRAMEWORK35_IT_IT_LANGPACK" Secure="yes"> | ||
| 132 | <RegistrySearch Id="NETFRAMEWORK35ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1040" Name="Install" Type="raw" /> | ||
| 133 | </Property> | ||
| 134 | </Fragment> | ||
| 135 | |||
| 136 | <!-- set to #1 if the .NET Framework 3.5 Japanese language pack is installed (not set otherwise) --> | ||
| 137 | <Fragment> | ||
| 138 | <Property Id="NETFRAMEWORK35_JA_JP_LANGPACK" Secure="yes"> | ||
| 139 | <RegistrySearch Id="NETFRAMEWORK35JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1041" Name="Install" Type="raw" /> | ||
| 140 | </Property> | ||
| 141 | </Fragment> | ||
| 142 | |||
| 143 | <!-- set to #1 if the .NET Framework 3.5 Korean language pack is installed (not set otherwise) --> | ||
| 144 | <Fragment> | ||
| 145 | <Property Id="NETFRAMEWORK35_KO_KR_LANGPACK" Secure="yes"> | ||
| 146 | <RegistrySearch Id="NETFRAMEWORK35KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1042" Name="Install" Type="raw" /> | ||
| 147 | </Property> | ||
| 148 | </Fragment> | ||
| 149 | |||
| 150 | <!-- set to #1 if the .NET Framework 3.5 Norwegian language pack is installed (not set otherwise) --> | ||
| 151 | <Fragment> | ||
| 152 | <Property Id="NETFRAMEWORK35_NB_NO_LANGPACK" Secure="yes"> | ||
| 153 | <RegistrySearch Id="NETFRAMEWORK35NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1044" Name="Install" Type="raw" /> | ||
| 154 | </Property> | ||
| 155 | </Fragment> | ||
| 156 | |||
| 157 | <!-- set to #1 if the .NET Framework 3.5 Polish language pack is installed (not set otherwise) --> | ||
| 158 | <Fragment> | ||
| 159 | <Property Id="NETFRAMEWORK35_PL_PL_LANGPACK" Secure="yes"> | ||
| 160 | <RegistrySearch Id="NETFRAMEWORK35PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1045" Name="Install" Type="raw" /> | ||
| 161 | </Property> | ||
| 162 | </Fragment> | ||
| 163 | |||
| 164 | <!-- set to #1 if the .NET Framework 3.5 Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 165 | <Fragment> | ||
| 166 | <Property Id="NETFRAMEWORK35_PT_BR_LANGPACK" Secure="yes"> | ||
| 167 | <RegistrySearch Id="NETFRAMEWORK35PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1046" Name="Install" Type="raw" /> | ||
| 168 | </Property> | ||
| 169 | </Fragment> | ||
| 170 | |||
| 171 | <!-- set to #1 if the .NET Framework 3.5 Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 172 | <Fragment> | ||
| 173 | <Property Id="NETFRAMEWORK35_PT_PT_LANGPACK" Secure="yes"> | ||
| 174 | <RegistrySearch Id="NETFRAMEWORK35PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2070" Name="Install" Type="raw" /> | ||
| 175 | </Property> | ||
| 176 | </Fragment> | ||
| 177 | |||
| 178 | <!-- set to #1 if the .NET Framework 3.5 Russian language pack is installed (not set otherwise) --> | ||
| 179 | <Fragment> | ||
| 180 | <Property Id="NETFRAMEWORK35_RU_RU_LANGPACK" Secure="yes"> | ||
| 181 | <RegistrySearch Id="NETFRAMEWORK35RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1049" Name="Install" Type="raw" /> | ||
| 182 | </Property> | ||
| 183 | </Fragment> | ||
| 184 | |||
| 185 | <!-- set to #1 if the .NET Framework 3.5 Spanish language pack is installed (not set otherwise) --> | ||
| 186 | <Fragment> | ||
| 187 | <Property Id="NETFRAMEWORK35_ES_ES_LANGPACK" Secure="yes"> | ||
| 188 | <RegistrySearch Id="NETFRAMEWORK35EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\3082" Name="Install" Type="raw" /> | ||
| 189 | </Property> | ||
| 190 | </Fragment> | ||
| 191 | |||
| 192 | <!-- set to #1 if the .NET Framework 3.5 Swedish language pack is installed (not set otherwise) --> | ||
| 193 | <Fragment> | ||
| 194 | <Property Id="NETFRAMEWORK35_SV_SE_LANGPACK" Secure="yes"> | ||
| 195 | <RegistrySearch Id="NETFRAMEWORK35SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1053" Name="Install" Type="raw" /> | ||
| 196 | </Property> | ||
| 197 | </Fragment> | ||
| 198 | |||
| 199 | <!-- set to #1 if the .NET Framework 3.5 Turkish language pack is installed (not set otherwise) --> | ||
| 200 | <Fragment> | ||
| 201 | <Property Id="NETFRAMEWORK35_TR_TR_LANGPACK" Secure="yes"> | ||
| 202 | <RegistrySearch Id="NETFRAMEWORK35TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1055" Name="Install" Type="raw" /> | ||
| 203 | </Property> | ||
| 204 | </Fragment> | ||
| 205 | |||
| 206 | <!-- set to #1 if the .NET Framework 3.5 client profile is installed (not set otherwise) --> | ||
| 207 | <Fragment> | ||
| 208 | <Property Id="NETFRAMEWORK35_CLIENT" Secure="yes"> | ||
| 209 | <RegistrySearch Id="NETFRAMEWORK35ClientSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="Install" Type="raw" /> | ||
| 210 | </Property> | ||
| 211 | </Fragment> | ||
| 212 | |||
| 213 | <!-- Indicates the service pack level for the .NET Framework 3.5 client profile --> | ||
| 214 | <Fragment> | ||
| 215 | <Property Id="NETFRAMEWORK35_CLIENT_SP_LEVEL" Secure="yes"> | ||
| 216 | <RegistrySearch Id="NETFRAMEWORK35ClientSpSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="SP" Type="raw" /> | ||
| 217 | </Property> | ||
| 218 | </Fragment> | ||
| 219 | |||
| 220 | <!-- location of the Windows SDK 6.0a installation root --> | ||
| 221 | <Fragment> | ||
| 222 | <Property Id="WINDOWSSDK60ADIR" Secure="yes"> | ||
| 223 | <RegistrySearch Id="WindowsSdk60aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.0A" Name="InstallationFolder" Type="raw" /> | ||
| 224 | </Property> | ||
| 225 | </Fragment> | ||
| 226 | |||
| 227 | <!-- location of the Windows SDK 6.1 installation root --> | ||
| 228 | <Fragment> | ||
| 229 | <Property Id="WINDOWSSDK61DIR" Secure="yes"> | ||
| 230 | <RegistrySearch Id="WindowsSdk61Dir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.1" Name="InstallationFolder" Type="raw" /> | ||
| 231 | </Property> | ||
| 232 | </Fragment> | ||
| 233 | |||
| 234 | <!-- location of the Windows SDK 7.0 installation root --> | ||
| 235 | <Fragment> | ||
| 236 | <Property Id="WINDOWSSDK70ADIR" Secure="yes"> | ||
| 237 | <RegistrySearch Id="WindowsSdk70aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v7.0A" Name="InstallationFolder" Type="raw" /> | ||
| 238 | </Property> | ||
| 239 | </Fragment> | ||
| 240 | |||
| 241 | </Wix> | ||
diff --git a/src/wixlib/NetFx3.wxs b/src/wixlib/NetFx3.wxs new file mode 100644 index 00000000..12d51750 --- /dev/null +++ b/src/wixlib/NetFx3.wxs | |||
| @@ -0,0 +1,195 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 3.0 - http://msdn.microsoft.com/library/aa964979.aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <!-- set to #1 if the .NET Framework 3.0 is installed (not set otherwise) --> | ||
| 16 | <Fragment> | ||
| 17 | <Property Id="NETFRAMEWORK30" Secure="yes"> | ||
| 18 | <RegistrySearch Id="NetFramework30" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" Name="InstallSuccess" Type="raw" /> | ||
| 19 | </Property> | ||
| 20 | </Fragment> | ||
| 21 | |||
| 22 | <!-- Indicates the service pack level for the .NET Framework 3.0. --> | ||
| 23 | <!-- This value will not exist until a service pack is installed. --> | ||
| 24 | <Fragment> | ||
| 25 | <Property Id="NETFRAMEWORK30_SP_LEVEL" Secure="yes"> | ||
| 26 | <RegistrySearch Id="NetFramework30SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0" Name="SP" Type="raw" /> | ||
| 27 | </Property> | ||
| 28 | </Fragment> | ||
| 29 | |||
| 30 | <!-- Location of .NET Framework 3.0 redistributable install root directory --> | ||
| 31 | <Fragment> | ||
| 32 | <Property Id="NETFRAMEWORK30INSTALLROOTDIR" Secure="yes"> | ||
| 33 | <RegistrySearch Id="NetFxInstallRootForNetfx30Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot"> | ||
| 34 | <DirectorySearch Id="NetFx30InstallRootSearch" Path="v3.0" Depth="0" /> | ||
| 35 | </RegistrySearch> | ||
| 36 | </Property> | ||
| 37 | </Fragment> | ||
| 38 | |||
| 39 | <!-- Location of .NET Framework 3.0 (64-bit) redistributable install root directory --> | ||
| 40 | <Fragment> | ||
| 41 | <Property Id="NETFRAMEWORK30INSTALLROOTDIR64" Secure="yes"> | ||
| 42 | <RegistrySearch Id="NetFxInstallRootForNetfx30Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes"> | ||
| 43 | <DirectorySearch Id="NetFx30InstallRootSearch64" Path="v3.0" Depth="0" /> | ||
| 44 | </RegistrySearch> | ||
| 45 | </Property> | ||
| 46 | </Fragment> | ||
| 47 | |||
| 48 | <!-- set to #1 if the .NET Framework 3.0 Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 49 | <Fragment> | ||
| 50 | <Property Id="NETFRAMEWORK30_ZH_CN_LANGPACK" Secure="yes"> | ||
| 51 | <RegistrySearch Id="NETFRAMEWORK30ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2052" Name="Install" Type="raw" /> | ||
| 52 | </Property> | ||
| 53 | </Fragment> | ||
| 54 | |||
| 55 | <!-- set to #1 if the .NET Framework 3.0 Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 56 | <Fragment> | ||
| 57 | <Property Id="NETFRAMEWORK30_ZH_TW_LANGPACK" Secure="yes"> | ||
| 58 | <RegistrySearch Id="NETFRAMEWORK30ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1028" Name="Install" Type="raw" /> | ||
| 59 | </Property> | ||
| 60 | </Fragment> | ||
| 61 | |||
| 62 | <!-- set to #1 if the .NET Framework 3.0 Czech language pack is installed (not set otherwise) --> | ||
| 63 | <Fragment> | ||
| 64 | <Property Id="NETFRAMEWORK30_CS_CZ_LANGPACK" Secure="yes"> | ||
| 65 | <RegistrySearch Id="NETFRAMEWORK30CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1029" Name="Install" Type="raw" /> | ||
| 66 | </Property> | ||
| 67 | </Fragment> | ||
| 68 | |||
| 69 | <!-- set to #1 if the .NET Framework 3.0 Danish language pack is installed (not set otherwise) --> | ||
| 70 | <Fragment> | ||
| 71 | <Property Id="NETFRAMEWORK30_DA_DK_LANGPACK" Secure="yes"> | ||
| 72 | <RegistrySearch Id="NETFRAMEWORK30DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1030" Name="Install" Type="raw" /> | ||
| 73 | </Property> | ||
| 74 | </Fragment> | ||
| 75 | |||
| 76 | <!-- set to #1 if the .NET Framework 3.0 Dutch language pack is installed (not set otherwise) --> | ||
| 77 | <Fragment> | ||
| 78 | <Property Id="NETFRAMEWORK30_NL_NL_LANGPACK" Secure="yes"> | ||
| 79 | <RegistrySearch Id="NETFRAMEWORK30NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1043" Name="Install" Type="raw" /> | ||
| 80 | </Property> | ||
| 81 | </Fragment> | ||
| 82 | |||
| 83 | <!-- set to #1 if the .NET Framework 3.0 Finnish language pack is installed (not set otherwise) --> | ||
| 84 | <Fragment> | ||
| 85 | <Property Id="NETFRAMEWORK30_FI_FI_LANGPACK" Secure="yes"> | ||
| 86 | <RegistrySearch Id="NETFRAMEWORK30FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1035" Name="Install" Type="raw" /> | ||
| 87 | </Property> | ||
| 88 | </Fragment> | ||
| 89 | |||
| 90 | <!-- set to #1 if the .NET Framework 3.0 French language pack is installed (not set otherwise) --> | ||
| 91 | <Fragment> | ||
| 92 | <Property Id="NETFRAMEWORK30_FR_FR_LANGPACK" Secure="yes"> | ||
| 93 | <RegistrySearch Id="NETFRAMEWORK30FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1036" Name="Install" Type="raw" /> | ||
| 94 | </Property> | ||
| 95 | </Fragment> | ||
| 96 | |||
| 97 | <!-- set to #1 if the .NET Framework 3.0 German language pack is installed (not set otherwise) --> | ||
| 98 | <Fragment> | ||
| 99 | <Property Id="NETFRAMEWORK30_DE_DE_LANGPACK" Secure="yes"> | ||
| 100 | <RegistrySearch Id="NETFRAMEWORK30DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1031" Name="Install" Type="raw" /> | ||
| 101 | </Property> | ||
| 102 | </Fragment> | ||
| 103 | |||
| 104 | <!-- set to #1 if the .NET Framework 3.0 Greek language pack is installed (not set otherwise) --> | ||
| 105 | <Fragment> | ||
| 106 | <Property Id="NETFRAMEWORK30_EL_GR_LANGPACK" Secure="yes"> | ||
| 107 | <RegistrySearch Id="NETFRAMEWORK30ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1032" Name="Install" Type="raw" /> | ||
| 108 | </Property> | ||
| 109 | </Fragment> | ||
| 110 | |||
| 111 | <!-- set to #1 if the .NET Framework 3.0 Hungarian language pack is installed (not set otherwise) --> | ||
| 112 | <Fragment> | ||
| 113 | <Property Id="NETFRAMEWORK30_HU_HU_LANGPACK" Secure="yes"> | ||
| 114 | <RegistrySearch Id="NETFRAMEWORK30HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1038" Name="Install" Type="raw" /> | ||
| 115 | </Property> | ||
| 116 | </Fragment> | ||
| 117 | |||
| 118 | <!-- set to #1 if the .NET Framework 3.0 Italian language pack is installed (not set otherwise) --> | ||
| 119 | <Fragment> | ||
| 120 | <Property Id="NETFRAMEWORK30_IT_IT_LANGPACK" Secure="yes"> | ||
| 121 | <RegistrySearch Id="NETFRAMEWORK30ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1040" Name="Install" Type="raw" /> | ||
| 122 | </Property> | ||
| 123 | </Fragment> | ||
| 124 | |||
| 125 | <!-- set to #1 if the .NET Framework 3.0 Japanese language pack is installed (not set otherwise) --> | ||
| 126 | <Fragment> | ||
| 127 | <Property Id="NETFRAMEWORK30_JA_JP_LANGPACK" Secure="yes"> | ||
| 128 | <RegistrySearch Id="NETFRAMEWORK30JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1041" Name="Install" Type="raw" /> | ||
| 129 | </Property> | ||
| 130 | </Fragment> | ||
| 131 | |||
| 132 | <!-- set to #1 if the .NET Framework 3.0 Korean language pack is installed (not set otherwise) --> | ||
| 133 | <Fragment> | ||
| 134 | <Property Id="NETFRAMEWORK30_KO_KR_LANGPACK" Secure="yes"> | ||
| 135 | <RegistrySearch Id="NETFRAMEWORK30KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1042" Name="Install" Type="raw" /> | ||
| 136 | </Property> | ||
| 137 | </Fragment> | ||
| 138 | |||
| 139 | <!-- set to #1 if the .NET Framework 3.0 Norwegian language pack is installed (not set otherwise) --> | ||
| 140 | <Fragment> | ||
| 141 | <Property Id="NETFRAMEWORK30_NB_NO_LANGPACK" Secure="yes"> | ||
| 142 | <RegistrySearch Id="NETFRAMEWORK30NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1044" Name="Install" Type="raw" /> | ||
| 143 | </Property> | ||
| 144 | </Fragment> | ||
| 145 | |||
| 146 | <!-- set to #1 if the .NET Framework 3.0 Polish language pack is installed (not set otherwise) --> | ||
| 147 | <Fragment> | ||
| 148 | <Property Id="NETFRAMEWORK30_PL_PL_LANGPACK" Secure="yes"> | ||
| 149 | <RegistrySearch Id="NETFRAMEWORK30PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1045" Name="Install" Type="raw" /> | ||
| 150 | </Property> | ||
| 151 | </Fragment> | ||
| 152 | |||
| 153 | <!-- set to #1 if the .NET Framework 3.0 Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 154 | <Fragment> | ||
| 155 | <Property Id="NETFRAMEWORK30_PT_BR_LANGPACK" Secure="yes"> | ||
| 156 | <RegistrySearch Id="NETFRAMEWORK30PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1046" Name="Install" Type="raw" /> | ||
| 157 | </Property> | ||
| 158 | </Fragment> | ||
| 159 | |||
| 160 | <!-- set to #1 if the .NET Framework 3.0 Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 161 | <Fragment> | ||
| 162 | <Property Id="NETFRAMEWORK30_PT_PT_LANGPACK" Secure="yes"> | ||
| 163 | <RegistrySearch Id="NETFRAMEWORK30PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2070" Name="Install" Type="raw" /> | ||
| 164 | </Property> | ||
| 165 | </Fragment> | ||
| 166 | |||
| 167 | <!-- set to #1 if the .NET Framework 3.0 Russian language pack is installed (not set otherwise) --> | ||
| 168 | <Fragment> | ||
| 169 | <Property Id="NETFRAMEWORK30_RU_RU_LANGPACK" Secure="yes"> | ||
| 170 | <RegistrySearch Id="NETFRAMEWORK30RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1049" Name="Install" Type="raw" /> | ||
| 171 | </Property> | ||
| 172 | </Fragment> | ||
| 173 | |||
| 174 | <!-- set to #1 if the .NET Framework 3.0 Spanish language pack is installed (not set otherwise) --> | ||
| 175 | <Fragment> | ||
| 176 | <Property Id="NETFRAMEWORK30_ES_ES_LANGPACK" Secure="yes"> | ||
| 177 | <RegistrySearch Id="NETFRAMEWORK30EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\3082" Name="Install" Type="raw" /> | ||
| 178 | </Property> | ||
| 179 | </Fragment> | ||
| 180 | |||
| 181 | <!-- set to #1 if the .NET Framework 3.0 Swedish language pack is installed (not set otherwise) --> | ||
| 182 | <Fragment> | ||
| 183 | <Property Id="NETFRAMEWORK30_SV_SE_LANGPACK" Secure="yes"> | ||
| 184 | <RegistrySearch Id="NETFRAMEWORK30SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1053" Name="Install" Type="raw" /> | ||
| 185 | </Property> | ||
| 186 | </Fragment> | ||
| 187 | |||
| 188 | <!-- set to #1 if the .NET Framework 3.0 Turkish language pack is installed (not set otherwise) --> | ||
| 189 | <Fragment> | ||
| 190 | <Property Id="NETFRAMEWORK30_TR_TR_LANGPACK" Secure="yes"> | ||
| 191 | <RegistrySearch Id="NETFRAMEWORK30TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1055" Name="Install" Type="raw" /> | ||
| 192 | </Property> | ||
| 193 | </Fragment> | ||
| 194 | |||
| 195 | </Wix> | ||
diff --git a/src/wixlib/NetFx4.5.wxs b/src/wixlib/NetFx4.5.wxs new file mode 100644 index 00000000..f2ddd051 --- /dev/null +++ b/src/wixlib/NetFx4.5.wxs | |||
| @@ -0,0 +1,274 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 4.5 - http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx, http://msdn.microsoft.com/en-us/library/ee942965(v=VS.110).aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <?define NetFx45MinRelease = 378389?> | ||
| 16 | <?define NetFx45WebLink = http://go.microsoft.com/fwlink/?LinkId=225704 ?> | ||
| 17 | <?define NetFx45RedistLink = http://go.microsoft.com/fwlink/?LinkId=225702 ?> | ||
| 18 | |||
| 19 | <Fragment> | ||
| 20 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 21 | <Property Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 22 | <SetProperty Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 23 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx45MinRelease)" | ||
| 24 | </SetProperty> | ||
| 25 | </Fragment> | ||
| 26 | |||
| 27 | <Fragment> | ||
| 28 | <util:RegistrySearch | ||
| 29 | Id="NETFRAMEWORK45" | ||
| 30 | Variable="NETFRAMEWORK45" | ||
| 31 | Root="HKLM" | ||
| 32 | Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" | ||
| 33 | Value="Release" | ||
| 34 | Result="value" /> | ||
| 35 | </Fragment> | ||
| 36 | |||
| 37 | <Fragment> | ||
| 38 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 39 | |||
| 40 | <WixVariable Id="NetFx45WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx45MinRelease)" Overridable="yes" /> | ||
| 41 | <WixVariable Id="NetFx45WebInstallCondition" Value="" Overridable="yes" /> | ||
| 42 | <WixVariable Id="NetFx45WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 43 | |||
| 44 | <PackageGroup Id="NetFx45Web"> | ||
| 45 | <ExePackage | ||
| 46 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html"" | ||
| 47 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html"" | ||
| 48 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html"" | ||
| 49 | PerMachine="yes" | ||
| 50 | DetectCondition="!(wix.NetFx45WebDetectCondition)" | ||
| 51 | InstallCondition="!(wix.NetFx45WebInstallCondition)" | ||
| 52 | Id="NetFx45Web" | ||
| 53 | Vital="yes" | ||
| 54 | Permanent="yes" | ||
| 55 | Protocol="netfx4" | ||
| 56 | DownloadUrl="$(var.NetFx45WebLink)" | ||
| 57 | LogPathVariable="NetFx45FullWebLog" | ||
| 58 | Compressed="no" | ||
| 59 | Name="!(wix.NetFx45WebPackageDirectory)dotNetFx45_Full_setup.exe"> | ||
| 60 | <RemotePayload | ||
| 61 | Size="1005568" | ||
| 62 | Version="4.5.50709.17929" | ||
| 63 | ProductName="Microsoft .NET Framework 4.5" | ||
| 64 | Description="Microsoft .NET Framework 4.5 Setup" | ||
| 65 | CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D" | ||
| 66 | CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255" | ||
| 67 | Hash="F6BA6F03C65C3996A258F58324A917463B2D6FF4"/> | ||
| 68 | </ExePackage> | ||
| 69 | </PackageGroup> | ||
| 70 | </Fragment> | ||
| 71 | |||
| 72 | <Fragment> | ||
| 73 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 74 | |||
| 75 | <WixVariable Id="NetFx45RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx45MinRelease)" Overridable="yes" /> | ||
| 76 | <WixVariable Id="NetFx45RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 77 | <WixVariable Id="NetFx45RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 78 | |||
| 79 | <PackageGroup Id="NetFx45Redist"> | ||
| 80 | <ExePackage | ||
| 81 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html"" | ||
| 82 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html"" | ||
| 83 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html"" | ||
| 84 | PerMachine="yes" | ||
| 85 | DetectCondition="!(wix.NetFx45RedistDetectCondition)" | ||
| 86 | InstallCondition="!(wix.NetFx45RedistInstallCondition)" | ||
| 87 | Id="NetFx45Redist" | ||
| 88 | Vital="yes" | ||
| 89 | Permanent="yes" | ||
| 90 | Protocol="netfx4" | ||
| 91 | DownloadUrl="$(var.NetFx45RedistLink)" | ||
| 92 | LogPathVariable="NetFx45FullLog" | ||
| 93 | Compressed="no" | ||
| 94 | Name="!(wix.NetFx45RedistPackageDirectory)dotNetFx45_Full_x86_x64.exe"> | ||
| 95 | <RemotePayload | ||
| 96 | Size="50352408" | ||
| 97 | Version="4.5.50709.17929" | ||
| 98 | ProductName="Microsoft .NET Framework 4.5" | ||
| 99 | Description="Microsoft .NET Framework 4.5 Setup" | ||
| 100 | CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D" | ||
| 101 | CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255" | ||
| 102 | Hash="B2FF712CA0947040CA0B8E9BD7436A3C3524BB5D"/> | ||
| 103 | </ExePackage> | ||
| 104 | </PackageGroup> | ||
| 105 | </Fragment> | ||
| 106 | |||
| 107 | <!-- set to Release number of the .NET Framework 4.5 if installed (not set otherwise) --> | ||
| 108 | <Fragment> | ||
| 109 | <Property Id="NETFRAMEWORK45" Secure="yes"> | ||
| 110 | <RegistrySearch Id="NetFramework45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" /> | ||
| 111 | </Property> | ||
| 112 | </Fragment> | ||
| 113 | |||
| 114 | <!-- set to Release number of the .NET Framework 4.5 Arabic language pack if installed (not set otherwise) --> | ||
| 115 | <Fragment> | ||
| 116 | <Property Id="NETFRAMEWORK45_AR_SA_LANGPACK" Secure="yes"> | ||
| 117 | <RegistrySearch Id="NETFRAMEWORK45ArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Release" Type="raw" /> | ||
| 118 | </Property> | ||
| 119 | </Fragment> | ||
| 120 | |||
| 121 | <!-- set to Release number of the .NET Framework 4.5 Chinese (Simplified) language pack if installed (not set otherwise) --> | ||
| 122 | <Fragment> | ||
| 123 | <Property Id="NETFRAMEWORK45_ZH_CN_LANGPACK" Secure="yes"> | ||
| 124 | <RegistrySearch Id="NETFRAMEWORK45ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Release" Type="raw" /> | ||
| 125 | </Property> | ||
| 126 | </Fragment> | ||
| 127 | |||
| 128 | <!-- set to Release number of the .NET Framework 4.5 Chinese (Traditional) language pack if installed (not set otherwise) --> | ||
| 129 | <Fragment> | ||
| 130 | <Property Id="NETFRAMEWORK45_ZH_TW_LANGPACK" Secure="yes"> | ||
| 131 | <RegistrySearch Id="NETFRAMEWORK45ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Release" Type="raw" /> | ||
| 132 | </Property> | ||
| 133 | </Fragment> | ||
| 134 | |||
| 135 | <!-- set to Release number of the .NET Framework 4.5 Czech language pack if installed (not set otherwise) --> | ||
| 136 | <Fragment> | ||
| 137 | <Property Id="NETFRAMEWORK45_CS_CZ_LANGPACK" Secure="yes"> | ||
| 138 | <RegistrySearch Id="NETFRAMEWORK45CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Release" Type="raw" /> | ||
| 139 | </Property> | ||
| 140 | </Fragment> | ||
| 141 | |||
| 142 | <!-- set to Release number of the .NET Framework 4.5 Danish language pack if installed (not set otherwise) --> | ||
| 143 | <Fragment> | ||
| 144 | <Property Id="NETFRAMEWORK45_DA_DK_LANGPACK" Secure="yes"> | ||
| 145 | <RegistrySearch Id="NETFRAMEWORK45DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Release" Type="raw" /> | ||
| 146 | </Property> | ||
| 147 | </Fragment> | ||
| 148 | |||
| 149 | <!-- set to Release number of the .NET Framework 4.5 Dutch language pack if installed (not set otherwise) --> | ||
| 150 | <Fragment> | ||
| 151 | <Property Id="NETFRAMEWORK45_NL_NL_LANGPACK" Secure="yes"> | ||
| 152 | <RegistrySearch Id="NETFRAMEWORK45NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Release" Type="raw" /> | ||
| 153 | </Property> | ||
| 154 | </Fragment> | ||
| 155 | |||
| 156 | <!-- set to Release number of the .NET Framework 4.5 Finnish language pack if installed (not set otherwise) --> | ||
| 157 | <Fragment> | ||
| 158 | <Property Id="NETFRAMEWORK45_FI_FI_LANGPACK" Secure="yes"> | ||
| 159 | <RegistrySearch Id="NETFRAMEWORK45FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Release" Type="raw" /> | ||
| 160 | </Property> | ||
| 161 | </Fragment> | ||
| 162 | |||
| 163 | <!-- set to Release number of the .NET Framework 4.5 French language pack if installed (not set otherwise) --> | ||
| 164 | <Fragment> | ||
| 165 | <Property Id="NETFRAMEWORK45_FR_FR_LANGPACK" Secure="yes"> | ||
| 166 | <RegistrySearch Id="NETFRAMEWORK45FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Release" Type="raw" /> | ||
| 167 | </Property> | ||
| 168 | </Fragment> | ||
| 169 | |||
| 170 | <!-- set to Release number of the .NET Framework 4.5 German language pack if installed (not set otherwise) --> | ||
| 171 | <Fragment> | ||
| 172 | <Property Id="NETFRAMEWORK45_DE_DE_LANGPACK" Secure="yes"> | ||
| 173 | <RegistrySearch Id="NETFRAMEWORK45DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Release" Type="raw" /> | ||
| 174 | </Property> | ||
| 175 | </Fragment> | ||
| 176 | |||
| 177 | <!-- set to Release number of the .NET Framework 4.5 Greek language pack if installed (not set otherwise) --> | ||
| 178 | <Fragment> | ||
| 179 | <Property Id="NETFRAMEWORK45_EL_GR_LANGPACK" Secure="yes"> | ||
| 180 | <RegistrySearch Id="NETFRAMEWORK45ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Release" Type="raw" /> | ||
| 181 | </Property> | ||
| 182 | </Fragment> | ||
| 183 | |||
| 184 | <!-- set to Release number of the .NET Framework 4.5 Hebrew language pack if installed (not set otherwise) --> | ||
| 185 | <Fragment> | ||
| 186 | <Property Id="NETFRAMEWORK45_HE_IL_LANGPACK" Secure="yes"> | ||
| 187 | <RegistrySearch Id="NETFRAMEWORK45HeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Release" Type="raw" /> | ||
| 188 | </Property> | ||
| 189 | </Fragment> | ||
| 190 | |||
| 191 | <!-- set to Release number of the .NET Framework 4.5 Hungarian language pack if installed (not set otherwise) --> | ||
| 192 | <Fragment> | ||
| 193 | <Property Id="NETFRAMEWORK45_HU_HU_LANGPACK" Secure="yes"> | ||
| 194 | <RegistrySearch Id="NETFRAMEWORK45HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Release" Type="raw" /> | ||
| 195 | </Property> | ||
| 196 | </Fragment> | ||
| 197 | |||
| 198 | <!-- set to Release number of the .NET Framework 4.5 Italian language pack if installed (not set otherwise) --> | ||
| 199 | <Fragment> | ||
| 200 | <Property Id="NETFRAMEWORK45_IT_IT_LANGPACK" Secure="yes"> | ||
| 201 | <RegistrySearch Id="NETFRAMEWORK45ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Release" Type="raw" /> | ||
| 202 | </Property> | ||
| 203 | </Fragment> | ||
| 204 | |||
| 205 | <!-- set to Release number of the .NET Framework 4.5 Japanese language pack if installed (not set otherwise) --> | ||
| 206 | <Fragment> | ||
| 207 | <Property Id="NETFRAMEWORK45_JA_JP_LANGPACK" Secure="yes"> | ||
| 208 | <RegistrySearch Id="NETFRAMEWORK45JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Release" Type="raw" /> | ||
| 209 | </Property> | ||
| 210 | </Fragment> | ||
| 211 | |||
| 212 | <!-- set to Release number of the .NET Framework 4.5 Korean language pack if installed (not set otherwise) --> | ||
| 213 | <Fragment> | ||
| 214 | <Property Id="NETFRAMEWORK45_KO_KR_LANGPACK" Secure="yes"> | ||
| 215 | <RegistrySearch Id="NETFRAMEWORK45KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Release" Type="raw" /> | ||
| 216 | </Property> | ||
| 217 | </Fragment> | ||
| 218 | |||
| 219 | <!-- set to Release number of the .NET Framework 4.5 Norwegian language pack if installed (not set otherwise) --> | ||
| 220 | <Fragment> | ||
| 221 | <Property Id="NETFRAMEWORK45_NB_NO_LANGPACK" Secure="yes"> | ||
| 222 | <RegistrySearch Id="NETFRAMEWORK45NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Release" Type="raw" /> | ||
| 223 | </Property> | ||
| 224 | </Fragment> | ||
| 225 | |||
| 226 | <!-- set to Release number of the .NET Framework 4.5 Polish language pack if installed (not set otherwise) --> | ||
| 227 | <Fragment> | ||
| 228 | <Property Id="NETFRAMEWORK45_PL_PL_LANGPACK" Secure="yes"> | ||
| 229 | <RegistrySearch Id="NETFRAMEWORK45PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Release" Type="raw" /> | ||
| 230 | </Property> | ||
| 231 | </Fragment> | ||
| 232 | |||
| 233 | <!-- set to Release number of the .NET Framework 4.5 Portuguese (Brazil) language pack if installed (not set otherwise) --> | ||
| 234 | <Fragment> | ||
| 235 | <Property Id="NETFRAMEWORK45_PT_BR_LANGPACK" Secure="yes"> | ||
| 236 | <RegistrySearch Id="NETFRAMEWORK45PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Release" Type="raw" /> | ||
| 237 | </Property> | ||
| 238 | </Fragment> | ||
| 239 | |||
| 240 | <!-- set to Release number of the .NET Framework 4.5 Portuguese (Portugal) language pack if installed (not set otherwise) --> | ||
| 241 | <Fragment> | ||
| 242 | <Property Id="NETFRAMEWORK45_PT_PT_LANGPACK" Secure="yes"> | ||
| 243 | <RegistrySearch Id="NETFRAMEWORK45PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Release" Type="raw" /> | ||
| 244 | </Property> | ||
| 245 | </Fragment> | ||
| 246 | |||
| 247 | <!-- set to Release number of the .NET Framework 4.5 Russian language pack if installed (not set otherwise) --> | ||
| 248 | <Fragment> | ||
| 249 | <Property Id="NETFRAMEWORK45_RU_RU_LANGPACK" Secure="yes"> | ||
| 250 | <RegistrySearch Id="NETFRAMEWORK45RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Release" Type="raw" /> | ||
| 251 | </Property> | ||
| 252 | </Fragment> | ||
| 253 | |||
| 254 | <!-- set to Release number of the .NET Framework 4.5 Spanish language pack if installed (not set otherwise) --> | ||
| 255 | <Fragment> | ||
| 256 | <Property Id="NETFRAMEWORK45_ES_ES_LANGPACK" Secure="yes"> | ||
| 257 | <RegistrySearch Id="NETFRAMEWORK45EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Release" Type="raw" /> | ||
| 258 | </Property> | ||
| 259 | </Fragment> | ||
| 260 | |||
| 261 | <!-- set to Release number of the .NET Framework 4.5 Swedish language pack if installed (not set otherwise) --> | ||
| 262 | <Fragment> | ||
| 263 | <Property Id="NETFRAMEWORK45_SV_SE_LANGPACK" Secure="yes"> | ||
| 264 | <RegistrySearch Id="NETFRAMEWORK45SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Release" Type="raw" /> | ||
| 265 | </Property> | ||
| 266 | </Fragment> | ||
| 267 | |||
| 268 | <!-- set to Release number of the .NET Framework 4.5 Turkish language pack if installed (not set otherwise) --> | ||
| 269 | <Fragment> | ||
| 270 | <Property Id="NETFRAMEWORK45_TR_TR_LANGPACK" Secure="yes"> | ||
| 271 | <RegistrySearch Id="NETFRAMEWORK45TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Release" Type="raw" /> | ||
| 272 | </Property> | ||
| 273 | </Fragment> | ||
| 274 | </Wix> | ||
diff --git a/src/wixlib/NetFx4.wxs b/src/wixlib/NetFx4.wxs new file mode 100644 index 00000000..fa26435f --- /dev/null +++ b/src/wixlib/NetFx4.wxs | |||
| @@ -0,0 +1,543 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 4.0 full & client - http://msdn.microsoft.com/en-us/library/ee942965.aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <?define NetFx40WebLink = http://go.microsoft.com/fwlink/?linkid=182805 ?> | ||
| 16 | <?define NetFx40RedistLink = http://go.microsoft.com/fwlink/?LinkId=247729 ?> | ||
| 17 | <?define NetFx40ClientWebLink = http://go.microsoft.com/fwlink/?linkid=182804 ?> | ||
| 18 | <?define NetFx40ClientRedistLink = http://go.microsoft.com/fwlink/?LinkId=247730 ?> | ||
| 19 | |||
| 20 | <Fragment> | ||
| 21 | <PropertyRef Id="NETFRAMEWORK40FULL" /> | ||
| 22 | <Property Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 23 | <SetProperty Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 24 | NETFRAMEWORK40FULL | ||
| 25 | </SetProperty> | ||
| 26 | </Fragment> | ||
| 27 | |||
| 28 | <Fragment> | ||
| 29 | <util:RegistrySearch | ||
| 30 | Id="NETFRAMEWORK40" | ||
| 31 | Variable="NETFRAMEWORK40" | ||
| 32 | Root="HKLM" | ||
| 33 | Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" | ||
| 34 | Value="Install" | ||
| 35 | Result="value" /> | ||
| 36 | </Fragment> | ||
| 37 | |||
| 38 | <Fragment> | ||
| 39 | <util:RegistrySearchRef Id="NETFRAMEWORK40"/> | ||
| 40 | |||
| 41 | <PackageGroup Id="NetFx40Web"> | ||
| 42 | <ExePackage | ||
| 43 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 44 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]"" | ||
| 45 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 46 | PerMachine="yes" | ||
| 47 | DetectCondition="NETFRAMEWORK40" | ||
| 48 | Id="NetFx40Web" | ||
| 49 | Vital="yes" | ||
| 50 | Permanent="yes" | ||
| 51 | Protocol="netfx4" | ||
| 52 | DownloadUrl="$(var.NetFx40WebLink)" | ||
| 53 | Compressed="no" | ||
| 54 | Name="redist\dotNetFx40_Full_setup.exe"> | ||
| 55 | <RemotePayload | ||
| 56 | Size="889416" | ||
| 57 | Version="4.0.30319.1" | ||
| 58 | ProductName="Microsoft .NET Framework 4" | ||
| 59 | Description="Microsoft .NET Framework 4 Setup" | ||
| 60 | CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6" | ||
| 61 | CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F" | ||
| 62 | Hash="06BECADB92A5FCCA2529C0B93687C2A0C6D0D610"/> | ||
| 63 | </ExePackage> | ||
| 64 | </PackageGroup> | ||
| 65 | </Fragment> | ||
| 66 | |||
| 67 | <Fragment> | ||
| 68 | <util:RegistrySearchRef Id="NETFRAMEWORK40"/> | ||
| 69 | |||
| 70 | <PackageGroup Id="NetFx40Redist"> | ||
| 71 | <ExePackage | ||
| 72 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 73 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]"" | ||
| 74 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 75 | PerMachine="yes" | ||
| 76 | DetectCondition="NETFRAMEWORK40" | ||
| 77 | Id="NetFx40Redist" | ||
| 78 | Vital="yes" | ||
| 79 | Permanent="yes" | ||
| 80 | Protocol="netfx4" | ||
| 81 | DownloadUrl="$(var.NetFx40RedistLink)" | ||
| 82 | Compressed="no" | ||
| 83 | Name="redist\dotNetFx40_Full_x86_x64.exe"> | ||
| 84 | <RemotePayload | ||
| 85 | Size="50449456" | ||
| 86 | Version="4.0.30319.1" | ||
| 87 | ProductName="Microsoft .NET Framework 4" | ||
| 88 | Description="Microsoft .NET Framework 4 Setup" | ||
| 89 | CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6" | ||
| 90 | CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F" | ||
| 91 | Hash="58DA3D74DB353AAD03588CBB5CEA8234166D8B99"/> | ||
| 92 | </ExePackage> | ||
| 93 | </PackageGroup> | ||
| 94 | </Fragment> | ||
| 95 | |||
| 96 | <Fragment> | ||
| 97 | <util:RegistrySearch | ||
| 98 | Id="NETFRAMEWORK40CLIENT" | ||
| 99 | Variable="NETFRAMEWORK40CLIENT" | ||
| 100 | Root="HKLM" | ||
| 101 | Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" | ||
| 102 | Value="Install" | ||
| 103 | Result="value" /> | ||
| 104 | </Fragment> | ||
| 105 | |||
| 106 | |||
| 107 | <Fragment> | ||
| 108 | <util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/> | ||
| 109 | |||
| 110 | <PackageGroup Id="NetFx40ClientWeb"> | ||
| 111 | <ExePackage | ||
| 112 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 113 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]"" | ||
| 114 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 115 | PerMachine="yes" | ||
| 116 | DetectCondition="NETFRAMEWORK40CLIENT" | ||
| 117 | Id="NetFx40ClientWeb" | ||
| 118 | Vital="yes" | ||
| 119 | Permanent="yes" | ||
| 120 | Protocol="netfx4" | ||
| 121 | DownloadUrl="$(var.NetFx40ClientWebLink)" | ||
| 122 | Compressed="no" | ||
| 123 | Name="redist\dotNetFx40_Client_setup.exe"> | ||
| 124 | <RemotePayload | ||
| 125 | Size="887896" | ||
| 126 | Version="4.0.30319.1" | ||
| 127 | ProductName="Microsoft .NET Framework 4 Client Profile" | ||
| 128 | Description="Microsoft .NET Framework 4 Client Profile Setup" | ||
| 129 | CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6" | ||
| 130 | CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F" | ||
| 131 | Hash="E15AD80FC74277EF2048312E9A71AF56B2EBA622"/> | ||
| 132 | </ExePackage> | ||
| 133 | </PackageGroup> | ||
| 134 | </Fragment> | ||
| 135 | |||
| 136 | <Fragment> | ||
| 137 | <util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/> | ||
| 138 | |||
| 139 | <PackageGroup Id="NetFx40ClientRedist"> | ||
| 140 | <ExePackage | ||
| 141 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 142 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]"" | ||
| 143 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]"" | ||
| 144 | PerMachine="yes" | ||
| 145 | DetectCondition="NETFRAMEWORK40CLIENT" | ||
| 146 | Id="NetFx40ClientRedist" | ||
| 147 | Vital="yes" | ||
| 148 | Permanent="yes" | ||
| 149 | Protocol="netfx4" | ||
| 150 | DownloadUrl="$(var.NetFx40ClientRedistLink)" | ||
| 151 | Compressed="no" | ||
| 152 | Name="redist\dotNetFx40_Client_x86_x64.exe"> | ||
| 153 | <RemotePayload | ||
| 154 | Size="43000680" | ||
| 155 | Version="4.0.30319.1" | ||
| 156 | ProductName="Microsoft .NET Framework 4 Client Profile" | ||
| 157 | Description="Microsoft .NET Framework 4 Client Profile Setup" | ||
| 158 | CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6" | ||
| 159 | CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F" | ||
| 160 | Hash="4CD67F609F89D617D2B206341B8C211E1B88B287"/> | ||
| 161 | </ExePackage> | ||
| 162 | </PackageGroup> | ||
| 163 | </Fragment> | ||
| 164 | |||
| 165 | <!-- set to #1 if the .NET Framework 4.0 client is installed (not set otherwise) --> | ||
| 166 | <Fragment> | ||
| 167 | <Property Id="NETFRAMEWORK40CLIENT" Secure="yes"> | ||
| 168 | <RegistrySearch Id="NetFramework40Client" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Install" Type="raw" /> | ||
| 169 | </Property> | ||
| 170 | </Fragment> | ||
| 171 | |||
| 172 | <!-- Indicates the servicing level for the .NET Framework 4.0 client. --> | ||
| 173 | <Fragment> | ||
| 174 | <Property Id="NETFRAMEWORK40CLIENT_SERVICING_LEVEL" Secure="yes"> | ||
| 175 | <RegistrySearch Id="NetFramework40ClientServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Servicing" Type="raw" /> | ||
| 176 | </Property> | ||
| 177 | </Fragment> | ||
| 178 | |||
| 179 | <!-- Location of .NET Framework 4.0 client redistributable install root directory --> | ||
| 180 | <Fragment> | ||
| 181 | <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR" Secure="yes"> | ||
| 182 | <RegistrySearch Id="NetFxInstallRootForNetfx40Client" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" /> | ||
| 183 | </Property> | ||
| 184 | </Fragment> | ||
| 185 | |||
| 186 | <!-- Location of .NET Framework 4.0 client (64-bit) redistributable install root directory --> | ||
| 187 | <Fragment> | ||
| 188 | <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR64" Secure="yes"> | ||
| 189 | <RegistrySearch Id="NetFxInstallRootForNetfx40Client64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" Win64="yes" /> | ||
| 190 | </Property> | ||
| 191 | </Fragment> | ||
| 192 | |||
| 193 | <!-- set to #1 if the .NET Framework 4.0 full is installed (not set otherwise) --> | ||
| 194 | <Fragment> | ||
| 195 | <Property Id="NETFRAMEWORK40FULL" Secure="yes"> | ||
| 196 | <RegistrySearch Id="NetFramework40Full" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" /> | ||
| 197 | </Property> | ||
| 198 | </Fragment> | ||
| 199 | |||
| 200 | <!-- Indicates the servicing level for the .NET Framework 4.0 full. --> | ||
| 201 | <Fragment> | ||
| 202 | <Property Id="NETFRAMEWORK40FULL_SERVICING_LEVEL" Secure="yes"> | ||
| 203 | <RegistrySearch Id="NetFramework40FullServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Servicing" Type="raw" /> | ||
| 204 | </Property> | ||
| 205 | </Fragment> | ||
| 206 | |||
| 207 | <!-- Location of .NET Framework 4.0 full redistributable install root directory --> | ||
| 208 | <Fragment> | ||
| 209 | <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR" Secure="yes"> | ||
| 210 | <RegistrySearch Id="NetFxInstallRootForNetfx40Full" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" /> | ||
| 211 | </Property> | ||
| 212 | </Fragment> | ||
| 213 | |||
| 214 | <!-- Location of .NET Framework 4.0 full (64-bit) redistributable install root directory --> | ||
| 215 | <Fragment> | ||
| 216 | <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR64" Secure="yes"> | ||
| 217 | <RegistrySearch Id="NetFxInstallRootForNetfx40Full64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" Win64="yes" /> | ||
| 218 | </Property> | ||
| 219 | </Fragment> | ||
| 220 | |||
| 221 | <!-- set to #1 if the .NET Framework 4.0 Client Arabic language pack is installed (not set otherwise) --> | ||
| 222 | <Fragment> | ||
| 223 | <Property Id="NETFRAMEWORK40CLIENT_AR_SA_LANGPACK" Secure="yes"> | ||
| 224 | <RegistrySearch Id="NETFRAMEWORK40CLIENTArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1025" Name="Install" Type="raw" /> | ||
| 225 | </Property> | ||
| 226 | </Fragment> | ||
| 227 | |||
| 228 | <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 229 | <Fragment> | ||
| 230 | <Property Id="NETFRAMEWORK40CLIENT_ZH_CN_LANGPACK" Secure="yes"> | ||
| 231 | <RegistrySearch Id="NETFRAMEWORK40CLIENTZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2052" Name="Install" Type="raw" /> | ||
| 232 | </Property> | ||
| 233 | </Fragment> | ||
| 234 | |||
| 235 | <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 236 | <Fragment> | ||
| 237 | <Property Id="NETFRAMEWORK40CLIENT_ZH_TW_LANGPACK" Secure="yes"> | ||
| 238 | <RegistrySearch Id="NETFRAMEWORK40CLIENTZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1028" Name="Install" Type="raw" /> | ||
| 239 | </Property> | ||
| 240 | </Fragment> | ||
| 241 | |||
| 242 | <!-- set to #1 if the .NET Framework 4.0 Client Czech language pack is installed (not set otherwise) --> | ||
| 243 | <Fragment> | ||
| 244 | <Property Id="NETFRAMEWORK40CLIENT_CS_CZ_LANGPACK" Secure="yes"> | ||
| 245 | <RegistrySearch Id="NETFRAMEWORK40CLIENTCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1029" Name="Install" Type="raw" /> | ||
| 246 | </Property> | ||
| 247 | </Fragment> | ||
| 248 | |||
| 249 | <!-- set to #1 if the .NET Framework 4.0 Client Danish language pack is installed (not set otherwise) --> | ||
| 250 | <Fragment> | ||
| 251 | <Property Id="NETFRAMEWORK40CLIENT_DA_DK_LANGPACK" Secure="yes"> | ||
| 252 | <RegistrySearch Id="NETFRAMEWORK40CLIENTDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1030" Name="Install" Type="raw" /> | ||
| 253 | </Property> | ||
| 254 | </Fragment> | ||
| 255 | |||
| 256 | <!-- set to #1 if the .NET Framework 4.0 Client Dutch language pack is installed (not set otherwise) --> | ||
| 257 | <Fragment> | ||
| 258 | <Property Id="NETFRAMEWORK40CLIENT_NL_NL_LANGPACK" Secure="yes"> | ||
| 259 | <RegistrySearch Id="NETFRAMEWORK40CLIENTNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1043" Name="Install" Type="raw" /> | ||
| 260 | </Property> | ||
| 261 | </Fragment> | ||
| 262 | |||
| 263 | <!-- set to #1 if the .NET Framework 4.0 Client Finnish language pack is installed (not set otherwise) --> | ||
| 264 | <Fragment> | ||
| 265 | <Property Id="NETFRAMEWORK40CLIENT_FI_FI_LANGPACK" Secure="yes"> | ||
| 266 | <RegistrySearch Id="NETFRAMEWORK40CLIENTFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1035" Name="Install" Type="raw" /> | ||
| 267 | </Property> | ||
| 268 | </Fragment> | ||
| 269 | |||
| 270 | <!-- set to #1 if the .NET Framework 4.0 Client French language pack is installed (not set otherwise) --> | ||
| 271 | <Fragment> | ||
| 272 | <Property Id="NETFRAMEWORK40CLIENT_FR_FR_LANGPACK" Secure="yes"> | ||
| 273 | <RegistrySearch Id="NETFRAMEWORK40CLIENTFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1036" Name="Install" Type="raw" /> | ||
| 274 | </Property> | ||
| 275 | </Fragment> | ||
| 276 | |||
| 277 | <!-- set to #1 if the .NET Framework 4.0 Client German language pack is installed (not set otherwise) --> | ||
| 278 | <Fragment> | ||
| 279 | <Property Id="NETFRAMEWORK40CLIENT_DE_DE_LANGPACK" Secure="yes"> | ||
| 280 | <RegistrySearch Id="NETFRAMEWORK40CLIENTDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1031" Name="Install" Type="raw" /> | ||
| 281 | </Property> | ||
| 282 | </Fragment> | ||
| 283 | |||
| 284 | <!-- set to #1 if the .NET Framework 4.0 Client Greek language pack is installed (not set otherwise) --> | ||
| 285 | <Fragment> | ||
| 286 | <Property Id="NETFRAMEWORK40CLIENT_EL_GR_LANGPACK" Secure="yes"> | ||
| 287 | <RegistrySearch Id="NETFRAMEWORK40CLIENTElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1032" Name="Install" Type="raw" /> | ||
| 288 | </Property> | ||
| 289 | </Fragment> | ||
| 290 | |||
| 291 | <!-- set to #1 if the .NET Framework 4.0 Client Hebrew language pack is installed (not set otherwise) --> | ||
| 292 | <Fragment> | ||
| 293 | <Property Id="NETFRAMEWORK40CLIENT_HE_IL_LANGPACK" Secure="yes"> | ||
| 294 | <RegistrySearch Id="NETFRAMEWORK40CLIENTHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1037" Name="Install" Type="raw" /> | ||
| 295 | </Property> | ||
| 296 | </Fragment> | ||
| 297 | |||
| 298 | <!-- set to #1 if the .NET Framework 4.0 Client Hungarian language pack is installed (not set otherwise) --> | ||
| 299 | <Fragment> | ||
| 300 | <Property Id="NETFRAMEWORK40CLIENT_HU_HU_LANGPACK" Secure="yes"> | ||
| 301 | <RegistrySearch Id="NETFRAMEWORK40CLIENTHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1038" Name="Install" Type="raw" /> | ||
| 302 | </Property> | ||
| 303 | </Fragment> | ||
| 304 | |||
| 305 | <!-- set to #1 if the .NET Framework 4.0 Client Italian language pack is installed (not set otherwise) --> | ||
| 306 | <Fragment> | ||
| 307 | <Property Id="NETFRAMEWORK40CLIENT_IT_IT_LANGPACK" Secure="yes"> | ||
| 308 | <RegistrySearch Id="NETFRAMEWORK40CLIENTItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1040" Name="Install" Type="raw" /> | ||
| 309 | </Property> | ||
| 310 | </Fragment> | ||
| 311 | |||
| 312 | <!-- set to #1 if the .NET Framework 4.0 Client Japanese language pack is installed (not set otherwise) --> | ||
| 313 | <Fragment> | ||
| 314 | <Property Id="NETFRAMEWORK40CLIENT_JA_JP_LANGPACK" Secure="yes"> | ||
| 315 | <RegistrySearch Id="NETFRAMEWORK40CLIENTJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1041" Name="Install" Type="raw" /> | ||
| 316 | </Property> | ||
| 317 | </Fragment> | ||
| 318 | |||
| 319 | <!-- set to #1 if the .NET Framework 4.0 Client Korean language pack is installed (not set otherwise) --> | ||
| 320 | <Fragment> | ||
| 321 | <Property Id="NETFRAMEWORK40CLIENT_KO_KR_LANGPACK" Secure="yes"> | ||
| 322 | <RegistrySearch Id="NETFRAMEWORK40CLIENTKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1042" Name="Install" Type="raw" /> | ||
| 323 | </Property> | ||
| 324 | </Fragment> | ||
| 325 | |||
| 326 | <!-- set to #1 if the .NET Framework 4.0 Client Norwegian language pack is installed (not set otherwise) --> | ||
| 327 | <Fragment> | ||
| 328 | <Property Id="NETFRAMEWORK40CLIENT_NB_NO_LANGPACK" Secure="yes"> | ||
| 329 | <RegistrySearch Id="NETFRAMEWORK40CLIENTNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1044" Name="Install" Type="raw" /> | ||
| 330 | </Property> | ||
| 331 | </Fragment> | ||
| 332 | |||
| 333 | <!-- set to #1 if the .NET Framework 4.0 Client Polish language pack is installed (not set otherwise) --> | ||
| 334 | <Fragment> | ||
| 335 | <Property Id="NETFRAMEWORK40CLIENT_PL_PL_LANGPACK" Secure="yes"> | ||
| 336 | <RegistrySearch Id="NETFRAMEWORK40CLIENTPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1045" Name="Install" Type="raw" /> | ||
| 337 | </Property> | ||
| 338 | </Fragment> | ||
| 339 | |||
| 340 | <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 341 | <Fragment> | ||
| 342 | <Property Id="NETFRAMEWORK40CLIENT_PT_BR_LANGPACK" Secure="yes"> | ||
| 343 | <RegistrySearch Id="NETFRAMEWORK40CLIENTPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1046" Name="Install" Type="raw" /> | ||
| 344 | </Property> | ||
| 345 | </Fragment> | ||
| 346 | |||
| 347 | <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 348 | <Fragment> | ||
| 349 | <Property Id="NETFRAMEWORK40CLIENT_PT_PT_LANGPACK" Secure="yes"> | ||
| 350 | <RegistrySearch Id="NETFRAMEWORK40CLIENTPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2070" Name="Install" Type="raw" /> | ||
| 351 | </Property> | ||
| 352 | </Fragment> | ||
| 353 | |||
| 354 | <!-- set to #1 if the .NET Framework 4.0 Client Russian language pack is installed (not set otherwise) --> | ||
| 355 | <Fragment> | ||
| 356 | <Property Id="NETFRAMEWORK40CLIENT_RU_RU_LANGPACK" Secure="yes"> | ||
| 357 | <RegistrySearch Id="NETFRAMEWORK40CLIENTRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1049" Name="Install" Type="raw" /> | ||
| 358 | </Property> | ||
| 359 | </Fragment> | ||
| 360 | |||
| 361 | <!-- set to #1 if the .NET Framework 4.0 Client Spanish language pack is installed (not set otherwise) --> | ||
| 362 | <Fragment> | ||
| 363 | <Property Id="NETFRAMEWORK40CLIENT_ES_ES_LANGPACK" Secure="yes"> | ||
| 364 | <RegistrySearch Id="NETFRAMEWORK40CLIENTEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\3082" Name="Install" Type="raw" /> | ||
| 365 | </Property> | ||
| 366 | </Fragment> | ||
| 367 | |||
| 368 | <!-- set to #1 if the .NET Framework 4.0 Client Swedish language pack is installed (not set otherwise) --> | ||
| 369 | <Fragment> | ||
| 370 | <Property Id="NETFRAMEWORK40CLIENT_SV_SE_LANGPACK" Secure="yes"> | ||
| 371 | <RegistrySearch Id="NETFRAMEWORK40CLIENTSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1053" Name="Install" Type="raw" /> | ||
| 372 | </Property> | ||
| 373 | </Fragment> | ||
| 374 | |||
| 375 | <!-- set to #1 if the .NET Framework 4.0 Client Turkish language pack is installed (not set otherwise) --> | ||
| 376 | <Fragment> | ||
| 377 | <Property Id="NETFRAMEWORK40CLIENT_TR_TR_LANGPACK" Secure="yes"> | ||
| 378 | <RegistrySearch Id="NETFRAMEWORK40CLIENTTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1055" Name="Install" Type="raw" /> | ||
| 379 | </Property> | ||
| 380 | </Fragment> | ||
| 381 | |||
| 382 | <!-- set to #1 if the .NET Framework 4.0 Full Arabic language pack is installed (not set otherwise) --> | ||
| 383 | <Fragment> | ||
| 384 | <Property Id="NETFRAMEWORK40FULL_AR_SA_LANGPACK" Secure="yes"> | ||
| 385 | <RegistrySearch Id="NETFRAMEWORK40FULLArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Install" Type="raw" /> | ||
| 386 | </Property> | ||
| 387 | </Fragment> | ||
| 388 | |||
| 389 | <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Simplified) language pack is installed (not set otherwise) --> | ||
| 390 | <Fragment> | ||
| 391 | <Property Id="NETFRAMEWORK40FULL_ZH_CN_LANGPACK" Secure="yes"> | ||
| 392 | <RegistrySearch Id="NETFRAMEWORK40FULLZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Install" Type="raw" /> | ||
| 393 | </Property> | ||
| 394 | </Fragment> | ||
| 395 | |||
| 396 | <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Traditional) language pack is installed (not set otherwise) --> | ||
| 397 | <Fragment> | ||
| 398 | <Property Id="NETFRAMEWORK40FULL_ZH_TW_LANGPACK" Secure="yes"> | ||
| 399 | <RegistrySearch Id="NETFRAMEWORK40FULLZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Install" Type="raw" /> | ||
| 400 | </Property> | ||
| 401 | </Fragment> | ||
| 402 | |||
| 403 | <!-- set to #1 if the .NET Framework 4.0 Full Czech language pack is installed (not set otherwise) --> | ||
| 404 | <Fragment> | ||
| 405 | <Property Id="NETFRAMEWORK40FULL_CS_CZ_LANGPACK" Secure="yes"> | ||
| 406 | <RegistrySearch Id="NETFRAMEWORK40FULLCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Install" Type="raw" /> | ||
| 407 | </Property> | ||
| 408 | </Fragment> | ||
| 409 | |||
| 410 | <!-- set to #1 if the .NET Framework 4.0 Full Danish language pack is installed (not set otherwise) --> | ||
| 411 | <Fragment> | ||
| 412 | <Property Id="NETFRAMEWORK40FULL_DA_DK_LANGPACK" Secure="yes"> | ||
| 413 | <RegistrySearch Id="NETFRAMEWORK40FULLDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Install" Type="raw" /> | ||
| 414 | </Property> | ||
| 415 | </Fragment> | ||
| 416 | |||
| 417 | <!-- set to #1 if the .NET Framework 4.0 Full Dutch language pack is installed (not set otherwise) --> | ||
| 418 | <Fragment> | ||
| 419 | <Property Id="NETFRAMEWORK40FULL_NL_NL_LANGPACK" Secure="yes"> | ||
| 420 | <RegistrySearch Id="NETFRAMEWORK40FULLNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Install" Type="raw" /> | ||
| 421 | </Property> | ||
| 422 | </Fragment> | ||
| 423 | |||
| 424 | <!-- set to #1 if the .NET Framework 4.0 Full Finnish language pack is installed (not set otherwise) --> | ||
| 425 | <Fragment> | ||
| 426 | <Property Id="NETFRAMEWORK40FULL_FI_FI_LANGPACK" Secure="yes"> | ||
| 427 | <RegistrySearch Id="NETFRAMEWORK40FULLFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Install" Type="raw" /> | ||
| 428 | </Property> | ||
| 429 | </Fragment> | ||
| 430 | |||
| 431 | <!-- set to #1 if the .NET Framework 4.0 Full French language pack is installed (not set otherwise) --> | ||
| 432 | <Fragment> | ||
| 433 | <Property Id="NETFRAMEWORK40FULL_FR_FR_LANGPACK" Secure="yes"> | ||
| 434 | <RegistrySearch Id="NETFRAMEWORK40FULLFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Install" Type="raw" /> | ||
| 435 | </Property> | ||
| 436 | </Fragment> | ||
| 437 | |||
| 438 | <!-- set to #1 if the .NET Framework 4.0 Full German language pack is installed (not set otherwise) --> | ||
| 439 | <Fragment> | ||
| 440 | <Property Id="NETFRAMEWORK40FULL_DE_DE_LANGPACK" Secure="yes"> | ||
| 441 | <RegistrySearch Id="NETFRAMEWORK40FULLDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Install" Type="raw" /> | ||
| 442 | </Property> | ||
| 443 | </Fragment> | ||
| 444 | |||
| 445 | <!-- set to #1 if the .NET Framework 4.0 Full Greek language pack is installed (not set otherwise) --> | ||
| 446 | <Fragment> | ||
| 447 | <Property Id="NETFRAMEWORK40FULL_EL_GR_LANGPACK" Secure="yes"> | ||
| 448 | <RegistrySearch Id="NETFRAMEWORK40FULLElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Install" Type="raw" /> | ||
| 449 | </Property> | ||
| 450 | </Fragment> | ||
| 451 | |||
| 452 | <!-- set to #1 if the .NET Framework 4.0 Full Hebrew language pack is installed (not set otherwise) --> | ||
| 453 | <Fragment> | ||
| 454 | <Property Id="NETFRAMEWORK40FULL_HE_IL_LANGPACK" Secure="yes"> | ||
| 455 | <RegistrySearch Id="NETFRAMEWORK40FULLHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Install" Type="raw" /> | ||
| 456 | </Property> | ||
| 457 | </Fragment> | ||
| 458 | |||
| 459 | <!-- set to #1 if the .NET Framework 4.0 Full Hungarian language pack is installed (not set otherwise) --> | ||
| 460 | <Fragment> | ||
| 461 | <Property Id="NETFRAMEWORK40FULL_HU_HU_LANGPACK" Secure="yes"> | ||
| 462 | <RegistrySearch Id="NETFRAMEWORK40FULLHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Install" Type="raw" /> | ||
| 463 | </Property> | ||
| 464 | </Fragment> | ||
| 465 | |||
| 466 | <!-- set to #1 if the .NET Framework 4.0 Full Italian language pack is installed (not set otherwise) --> | ||
| 467 | <Fragment> | ||
| 468 | <Property Id="NETFRAMEWORK40FULL_IT_IT_LANGPACK" Secure="yes"> | ||
| 469 | <RegistrySearch Id="NETFRAMEWORK40FULLItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Install" Type="raw" /> | ||
| 470 | </Property> | ||
| 471 | </Fragment> | ||
| 472 | |||
| 473 | <!-- set to #1 if the .NET Framework 4.0 Full Japanese language pack is installed (not set otherwise) --> | ||
| 474 | <Fragment> | ||
| 475 | <Property Id="NETFRAMEWORK40FULL_JA_JP_LANGPACK" Secure="yes"> | ||
| 476 | <RegistrySearch Id="NETFRAMEWORK40FULLJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Install" Type="raw" /> | ||
| 477 | </Property> | ||
| 478 | </Fragment> | ||
| 479 | |||
| 480 | <!-- set to #1 if the .NET Framework 4.0 Full Korean language pack is installed (not set otherwise) --> | ||
| 481 | <Fragment> | ||
| 482 | <Property Id="NETFRAMEWORK40FULL_KO_KR_LANGPACK" Secure="yes"> | ||
| 483 | <RegistrySearch Id="NETFRAMEWORK40FULLKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Install" Type="raw" /> | ||
| 484 | </Property> | ||
| 485 | </Fragment> | ||
| 486 | |||
| 487 | <!-- set to #1 if the .NET Framework 4.0 Full Norwegian language pack is installed (not set otherwise) --> | ||
| 488 | <Fragment> | ||
| 489 | <Property Id="NETFRAMEWORK40FULL_NB_NO_LANGPACK" Secure="yes"> | ||
| 490 | <RegistrySearch Id="NETFRAMEWORK40FULLNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Install" Type="raw" /> | ||
| 491 | </Property> | ||
| 492 | </Fragment> | ||
| 493 | |||
| 494 | <!-- set to #1 if the .NET Framework 4.0 Full Polish language pack is installed (not set otherwise) --> | ||
| 495 | <Fragment> | ||
| 496 | <Property Id="NETFRAMEWORK40FULL_PL_PL_LANGPACK" Secure="yes"> | ||
| 497 | <RegistrySearch Id="NETFRAMEWORK40FULLPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Install" Type="raw" /> | ||
| 498 | </Property> | ||
| 499 | </Fragment> | ||
| 500 | |||
| 501 | <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Brazil) language pack is installed (not set otherwise) --> | ||
| 502 | <Fragment> | ||
| 503 | <Property Id="NETFRAMEWORK40FULL_PT_BR_LANGPACK" Secure="yes"> | ||
| 504 | <RegistrySearch Id="NETFRAMEWORK40FULLPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Install" Type="raw" /> | ||
| 505 | </Property> | ||
| 506 | </Fragment> | ||
| 507 | |||
| 508 | <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Portugal) language pack is installed (not set otherwise) --> | ||
| 509 | <Fragment> | ||
| 510 | <Property Id="NETFRAMEWORK40FULL_PT_PT_LANGPACK" Secure="yes"> | ||
| 511 | <RegistrySearch Id="NETFRAMEWORK40FULLPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Install" Type="raw" /> | ||
| 512 | </Property> | ||
| 513 | </Fragment> | ||
| 514 | |||
| 515 | <!-- set to #1 if the .NET Framework 4.0 Full Russian language pack is installed (not set otherwise) --> | ||
| 516 | <Fragment> | ||
| 517 | <Property Id="NETFRAMEWORK40FULL_RU_RU_LANGPACK" Secure="yes"> | ||
| 518 | <RegistrySearch Id="NETFRAMEWORK40FULLRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Install" Type="raw" /> | ||
| 519 | </Property> | ||
| 520 | </Fragment> | ||
| 521 | |||
| 522 | <!-- set to #1 if the .NET Framework 4.0 Full Spanish language pack is installed (not set otherwise) --> | ||
| 523 | <Fragment> | ||
| 524 | <Property Id="NETFRAMEWORK40FULL_ES_ES_LANGPACK" Secure="yes"> | ||
| 525 | <RegistrySearch Id="NETFRAMEWORK40FULLEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Install" Type="raw" /> | ||
| 526 | </Property> | ||
| 527 | </Fragment> | ||
| 528 | |||
| 529 | <!-- set to #1 if the .NET Framework 4.0 Full Swedish language pack is installed (not set otherwise) --> | ||
| 530 | <Fragment> | ||
| 531 | <Property Id="NETFRAMEWORK40FULL_SV_SE_LANGPACK" Secure="yes"> | ||
| 532 | <RegistrySearch Id="NETFRAMEWORK40FULLSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Install" Type="raw" /> | ||
| 533 | </Property> | ||
| 534 | </Fragment> | ||
| 535 | |||
| 536 | <!-- set to #1 if the .NET Framework 4.0 Full Turkish language pack is installed (not set otherwise) --> | ||
| 537 | <Fragment> | ||
| 538 | <Property Id="NETFRAMEWORK40FULL_TR_TR_LANGPACK" Secure="yes"> | ||
| 539 | <RegistrySearch Id="NETFRAMEWORK40FULLTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Install" Type="raw" /> | ||
| 540 | </Property> | ||
| 541 | </Fragment> | ||
| 542 | |||
| 543 | </Wix> | ||
diff --git a/src/wixlib/NetFx451.wxs b/src/wixlib/NetFx451.wxs new file mode 100644 index 00000000..7feff124 --- /dev/null +++ b/src/wixlib/NetFx451.wxs | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 4.5/4.5.1 - http://msdn.microsoft.com/en-us/library/5a4x27ek.aspx, http://msdn.microsoft.com/en-us/library/ee942965(v=VS.110).aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <?define NetFx451MinRelease = 378675 ?> | ||
| 16 | <?define NetFx451WebLink = http://go.microsoft.com/fwlink/?LinkId=322115 ?> | ||
| 17 | <?define NetFx451RedistLink = http://go.microsoft.com/fwlink/?LinkId=322116 ?> | ||
| 18 | |||
| 19 | <Fragment> | ||
| 20 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 21 | <Property Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 22 | <SetProperty Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 23 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx451MinRelease)" | ||
| 24 | </SetProperty> | ||
| 25 | </Fragment> | ||
| 26 | |||
| 27 | <Fragment> | ||
| 28 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 29 | |||
| 30 | <WixVariable Id="NetFx451WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx451MinRelease)" Overridable="yes" /> | ||
| 31 | <WixVariable Id="NetFx451WebInstallCondition" Value="" Overridable="yes" /> | ||
| 32 | <WixVariable Id="NetFx451WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 33 | |||
| 34 | <PackageGroup Id="NetFx451Web"> | ||
| 35 | <ExePackage | ||
| 36 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html"" | ||
| 37 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html"" | ||
| 38 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html"" | ||
| 39 | PerMachine="yes" | ||
| 40 | DetectCondition="!(wix.NetFx451WebDetectCondition)" | ||
| 41 | InstallCondition="!(wix.NetFx451WebInstallCondition)" | ||
| 42 | Id="NetFx451Web" | ||
| 43 | Vital="yes" | ||
| 44 | Permanent="yes" | ||
| 45 | Protocol="netfx4" | ||
| 46 | DownloadUrl="$(var.NetFx451WebLink)" | ||
| 47 | LogPathVariable="NetFx451FullWebLog" | ||
| 48 | Compressed="no" | ||
| 49 | Name="!(wix.NetFx451WebPackageDirectory)NDP451-KB2859818-Web.exe"> | ||
| 50 | <RemotePayload | ||
| 51 | Size="1021432" | ||
| 52 | Version="4.5.50938.18408" | ||
| 53 | ProductName="Microsoft .NET Framework 4.5.1" | ||
| 54 | Description="Microsoft .NET Framework 4.5.1 Setup" | ||
| 55 | CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41" | ||
| 56 | CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE" | ||
| 57 | Hash="4CBEA1E408DB5B423E130931B9478972E6798431" /> | ||
| 58 | </ExePackage> | ||
| 59 | </PackageGroup> | ||
| 60 | </Fragment> | ||
| 61 | |||
| 62 | <Fragment> | ||
| 63 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 64 | |||
| 65 | <WixVariable Id="NetFx451RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx451MinRelease)" Overridable="yes" /> | ||
| 66 | <WixVariable Id="NetFx451RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 67 | <WixVariable Id="NetFx451RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 68 | |||
| 69 | <PackageGroup Id="NetFx451Redist"> | ||
| 70 | <ExePackage | ||
| 71 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html"" | ||
| 72 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html"" | ||
| 73 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html"" | ||
| 74 | PerMachine="yes" | ||
| 75 | DetectCondition="!(wix.NetFx451RedistDetectCondition)" | ||
| 76 | InstallCondition="!(wix.NetFx451RedistInstallCondition)" | ||
| 77 | Id="NetFx451Redist" | ||
| 78 | Vital="yes" | ||
| 79 | Permanent="yes" | ||
| 80 | Protocol="netfx4" | ||
| 81 | DownloadUrl="$(var.NetFx451RedistLink)" | ||
| 82 | LogPathVariable="NetFx451FullLog" | ||
| 83 | Compressed="no" | ||
| 84 | Name="!(wix.NetFx451RedistPackageDirectory)NDP451-KB2858728-x86-x64-AllOS-ENU.exe"> | ||
| 85 | <RemotePayload | ||
| 86 | Size="70087104" | ||
| 87 | Version="4.5.50938.18408" | ||
| 88 | ProductName="Microsoft .NET Framework 4.5.1" | ||
| 89 | Description="Microsoft .NET Framework 4.5.1 Setup" | ||
| 90 | CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41" | ||
| 91 | CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE" | ||
| 92 | Hash="5934DD101414BBC0B7F1EE2780D2FC8B9BEC5C4D" /> | ||
| 93 | </ExePackage> | ||
| 94 | </PackageGroup> | ||
| 95 | </Fragment> | ||
| 96 | </Wix> | ||
diff --git a/src/wixlib/NetFx452.wxs b/src/wixlib/NetFx452.wxs new file mode 100644 index 00000000..16c55aac --- /dev/null +++ b/src/wixlib/NetFx452.wxs | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 4.5/4.5.1/4.5.2 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <?define NetFx452MinRelease = 379893 ?> | ||
| 16 | <?define NetFx452WebLink = http://go.microsoft.com/fwlink/?LinkId=397707 ?> | ||
| 17 | <?define NetFx452RedistLink = http://go.microsoft.com/fwlink/?LinkId=397708 ?> | ||
| 18 | |||
| 19 | <Fragment> | ||
| 20 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 21 | <Property Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 22 | <SetProperty Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 23 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx452MinRelease)" | ||
| 24 | </SetProperty> | ||
| 25 | </Fragment> | ||
| 26 | |||
| 27 | <Fragment> | ||
| 28 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 29 | |||
| 30 | <WixVariable Id="NetFx452WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx452MinRelease)" Overridable="yes" /> | ||
| 31 | <WixVariable Id="NetFx452WebInstallCondition" Value="" Overridable="yes" /> | ||
| 32 | <WixVariable Id="NetFx452WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 33 | |||
| 34 | <PackageGroup Id="NetFx452Web"> | ||
| 35 | <ExePackage | ||
| 36 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html"" | ||
| 37 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html"" | ||
| 38 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html"" | ||
| 39 | PerMachine="yes" | ||
| 40 | DetectCondition="!(wix.NetFx452WebDetectCondition)" | ||
| 41 | InstallCondition="!(wix.NetFx452WebInstallCondition)" | ||
| 42 | Id="NetFx452Web" | ||
| 43 | Vital="yes" | ||
| 44 | Permanent="yes" | ||
| 45 | Protocol="netfx4" | ||
| 46 | DownloadUrl="$(var.NetFx452WebLink)" | ||
| 47 | LogPathVariable="NetFx452FullWebLog" | ||
| 48 | Compressed="no" | ||
| 49 | Name="!(wix.NetFx452WebPackageDirectory)NDP452-KB2901954-Web.exe"> | ||
| 50 | <RemotePayload CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0" | ||
| 51 | CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080" | ||
| 52 | Description="Microsoft .NET Framework 4.5.2 Setup" | ||
| 53 | Hash="5B71B20A455F6EEAB79DD1EDCAB0BA66AD0D2208" | ||
| 54 | ProductName="Microsoft .NET Framework 4.5.2" | ||
| 55 | Size="1118920" | ||
| 56 | Version="4.5.51209.34209" /> | ||
| 57 | </ExePackage> | ||
| 58 | </PackageGroup> | ||
| 59 | </Fragment> | ||
| 60 | |||
| 61 | <Fragment> | ||
| 62 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 63 | |||
| 64 | <WixVariable Id="NetFx452RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx452MinRelease)" Overridable="yes" /> | ||
| 65 | <WixVariable Id="NetFx452RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 66 | <WixVariable Id="NetFx452RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 67 | |||
| 68 | <PackageGroup Id="NetFx452Redist"> | ||
| 69 | <ExePackage | ||
| 70 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html"" | ||
| 71 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html"" | ||
| 72 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html"" | ||
| 73 | PerMachine="yes" | ||
| 74 | DetectCondition="!(wix.NetFx452RedistDetectCondition)" | ||
| 75 | InstallCondition="!(wix.NetFx452RedistInstallCondition)" | ||
| 76 | Id="NetFx452Redist" | ||
| 77 | Vital="yes" | ||
| 78 | Permanent="yes" | ||
| 79 | Protocol="netfx4" | ||
| 80 | DownloadUrl="$(var.NetFx452RedistLink)" | ||
| 81 | LogPathVariable="NetFx452FullLog" | ||
| 82 | Compressed="no" | ||
| 83 | Name="!(wix.NetFx452RedistPackageDirectory)NDP452-KB2901907-x86-x64-AllOS-ENU.exe"> | ||
| 84 | <RemotePayload | ||
| 85 | CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0" | ||
| 86 | CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080" | ||
| 87 | Description="Microsoft .NET Framework 4.5.2 Setup" | ||
| 88 | Hash="89F86F9522DC7A8A965FACCE839ABB790A285A63" | ||
| 89 | ProductName="Microsoft .NET Framework 4.5.2" | ||
| 90 | Size="69999448" | ||
| 91 | Version="4.5.51209.34209" /> | ||
| 92 | </ExePackage> | ||
| 93 | </PackageGroup> | ||
| 94 | </Fragment> | ||
| 95 | </Wix> | ||
diff --git a/src/wixlib/NetFx46.wxs b/src/wixlib/NetFx46.wxs new file mode 100644 index 00000000..c4120e90 --- /dev/null +++ b/src/wixlib/NetFx46.wxs | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | |||
| 10 | Official documentation can be found at the following location: | ||
| 11 | |||
| 12 | .NET Framework 4.5/4.5.1/4.5.2/4.6 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx | ||
| 13 | --> | ||
| 14 | |||
| 15 | <?define NetFx46MinRelease = 393295 ?> | ||
| 16 | <?define NetFx46WebLink = http://go.microsoft.com/fwlink/?LinkId=560371 ?> | ||
| 17 | <?define NetFx46RedistLink = http://go.microsoft.com/fwlink/?LinkId=560369 ?> | ||
| 18 | |||
| 19 | <Fragment> | ||
| 20 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 21 | <Property Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 22 | <SetProperty Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 23 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx46MinRelease)" | ||
| 24 | </SetProperty> | ||
| 25 | </Fragment> | ||
| 26 | |||
| 27 | <Fragment> | ||
| 28 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 29 | |||
| 30 | <WixVariable Id="NetFx46WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx46MinRelease)" Overridable="yes" /> | ||
| 31 | <WixVariable Id="NetFx46WebInstallCondition" Value="" Overridable="yes" /> | ||
| 32 | <WixVariable Id="NetFx46WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 33 | |||
| 34 | <PackageGroup Id="NetFx46Web"> | ||
| 35 | <ExePackage | ||
| 36 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 37 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 38 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 39 | PerMachine="yes" | ||
| 40 | DetectCondition="!(wix.NetFx46WebDetectCondition)" | ||
| 41 | InstallCondition="!(wix.NetFx46WebInstallCondition)" | ||
| 42 | Id="NetFx46Web" | ||
| 43 | Vital="yes" | ||
| 44 | Permanent="yes" | ||
| 45 | Protocol="netfx4" | ||
| 46 | DownloadUrl="$(var.NetFx46WebLink)" | ||
| 47 | LogPathVariable="NetFx46FullLog" | ||
| 48 | Compressed="no" | ||
| 49 | Name="!(wix.NetFx46WebPackageDirectory)NDP46-KB3045560-Web.exe"> | ||
| 50 | <RemotePayload | ||
| 51 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 52 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 53 | Description="Microsoft .NET Framework 4.6 Setup" | ||
| 54 | Hash="480CA134B9E3F2437DF10719D5A8C77DDEC0A4F1" | ||
| 55 | ProductName="Microsoft .NET Framework 4.6" | ||
| 56 | Size="1497400" | ||
| 57 | Version="4.6.81.0" /> | ||
| 58 | </ExePackage> | ||
| 59 | </PackageGroup> | ||
| 60 | </Fragment> | ||
| 61 | |||
| 62 | <Fragment> | ||
| 63 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 64 | |||
| 65 | <WixVariable Id="NetFx46RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx46MinRelease)" Overridable="yes" /> | ||
| 66 | <WixVariable Id="NetFx46RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 67 | <WixVariable Id="NetFx46RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 68 | |||
| 69 | <PackageGroup Id="NetFx46Redist"> | ||
| 70 | <ExePackage | ||
| 71 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 72 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 73 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html"" | ||
| 74 | PerMachine="yes" | ||
| 75 | DetectCondition="!(wix.NetFx46RedistDetectCondition)" | ||
| 76 | InstallCondition="!(wix.NetFx46RedistInstallCondition)" | ||
| 77 | Id="NetFx46Redist" | ||
| 78 | Vital="yes" | ||
| 79 | Permanent="yes" | ||
| 80 | Protocol="netfx4" | ||
| 81 | DownloadUrl="$(var.NetFx46RedistLink)" | ||
| 82 | LogPathVariable="NetFx46FullLog" | ||
| 83 | Compressed="no" | ||
| 84 | Name="!(wix.NetFx46RedistPackageDirectory)NDP46-KB3045557-x86-x64-AllOS-ENU.exe"> | ||
| 85 | <RemotePayload | ||
| 86 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 87 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 88 | Description="Microsoft .NET Framework 4.6 Setup" | ||
| 89 | Hash="3049A85843EAF65E89E2336D5FE6E85E416797BE" | ||
| 90 | ProductName="Microsoft .NET Framework 4.6" | ||
| 91 | Size="65444688" | ||
| 92 | Version="4.6.81.0" /> | ||
| 93 | </ExePackage> | ||
| 94 | </PackageGroup> | ||
| 95 | </Fragment> | ||
| 96 | </Wix> | ||
diff --git a/src/wixlib/NetFx461.wxs b/src/wixlib/NetFx461.wxs new file mode 100644 index 00000000..907c2a35 --- /dev/null +++ b/src/wixlib/NetFx461.wxs | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 5 | |||
| 6 | <!-- | ||
| 7 | .NET Framework installation state properties | ||
| 8 | |||
| 9 | Official documentation can be found at the following location: | ||
| 10 | |||
| 11 | .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx | ||
| 12 | --> | ||
| 13 | |||
| 14 | <?define NetFx461MinRelease = 394254 ?> | ||
| 15 | <?define NetFx461WebLink = http://go.microsoft.com/fwlink/?LinkId=671728 ?> | ||
| 16 | <?define NetFx461RedistLink = http://go.microsoft.com/fwlink/?LinkId=671743 ?> | ||
| 17 | |||
| 18 | <Fragment> | ||
| 19 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 20 | <Property Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 21 | <SetProperty Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 22 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx461MinRelease)" | ||
| 23 | </SetProperty> | ||
| 24 | </Fragment> | ||
| 25 | |||
| 26 | <Fragment> | ||
| 27 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 28 | |||
| 29 | <WixVariable Id="NetFx461WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx461MinRelease)" Overridable="yes" /> | ||
| 30 | <WixVariable Id="NetFx461WebInstallCondition" Value="" Overridable="yes" /> | ||
| 31 | <WixVariable Id="NetFx461WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 32 | |||
| 33 | <PackageGroup Id="NetFx461Web"> | ||
| 34 | <ExePackage | ||
| 35 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 36 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 37 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 38 | PerMachine="yes" | ||
| 39 | DetectCondition="!(wix.NetFx461WebDetectCondition)" | ||
| 40 | InstallCondition="!(wix.NetFx461WebInstallCondition)" | ||
| 41 | Id="NetFx461Web" | ||
| 42 | Vital="yes" | ||
| 43 | Permanent="yes" | ||
| 44 | Protocol="netfx4" | ||
| 45 | DownloadUrl="$(var.NetFx461WebLink)" | ||
| 46 | LogPathVariable="NetFx461FullLog" | ||
| 47 | Compressed="no" | ||
| 48 | Name="!(wix.NetFx461WebPackageDirectory)NDP461-KB3102438-Web.exe"> | ||
| 49 | <RemotePayload | ||
| 50 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 51 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 52 | Description="Microsoft .NET Framework 4.6.1 Setup" | ||
| 53 | Hash="EE88B05232F43B517D4A368F7EE5065CDE7F67FA" | ||
| 54 | ProductName="Microsoft .NET Framework 4.6.1" | ||
| 55 | Size="1424328" | ||
| 56 | Version="4.6.1055.0" /> | ||
| 57 | </ExePackage> | ||
| 58 | </PackageGroup> | ||
| 59 | </Fragment> | ||
| 60 | |||
| 61 | <Fragment> | ||
| 62 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 63 | |||
| 64 | <WixVariable Id="NetFx461RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx461MinRelease)" Overridable="yes" /> | ||
| 65 | <WixVariable Id="NetFx461RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 66 | <WixVariable Id="NetFx461RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 67 | |||
| 68 | <PackageGroup Id="NetFx461Redist"> | ||
| 69 | <ExePackage | ||
| 70 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 71 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 72 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html"" | ||
| 73 | PerMachine="yes" | ||
| 74 | DetectCondition="!(wix.NetFx461RedistDetectCondition)" | ||
| 75 | InstallCondition="!(wix.NetFx461RedistInstallCondition)" | ||
| 76 | Id="NetFx461Redist" | ||
| 77 | Vital="yes" | ||
| 78 | Permanent="yes" | ||
| 79 | Protocol="netfx4" | ||
| 80 | DownloadUrl="$(var.NetFx461RedistLink)" | ||
| 81 | LogPathVariable="NetFx461FullLog" | ||
| 82 | Compressed="no" | ||
| 83 | Name="!(wix.NetFx461RedistPackageDirectory)NDP461-KB3102436-x86-x64-AllOS-ENU.exe"> | ||
| 84 | <RemotePayload | ||
| 85 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 86 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 87 | Description="Microsoft .NET Framework 4.6.1 Setup" | ||
| 88 | Hash="83D048D171FF44A3CAD9B422137656F585295866" | ||
| 89 | ProductName="Microsoft .NET Framework 4.6.1" | ||
| 90 | Size="67681000" | ||
| 91 | Version="4.6.1055.0" /> | ||
| 92 | </ExePackage> | ||
| 93 | </PackageGroup> | ||
| 94 | </Fragment> | ||
| 95 | </Wix> | ||
diff --git a/src/wixlib/NetFx462.wxs b/src/wixlib/NetFx462.wxs new file mode 100644 index 00000000..08f5bd53 --- /dev/null +++ b/src/wixlib/NetFx462.wxs | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util"> | ||
| 5 | |||
| 6 | <!-- | ||
| 7 | .NET Framework installation state properties | ||
| 8 | |||
| 9 | Official documentation can be found at the following location: | ||
| 10 | |||
| 11 | .NET Framework 4.5/4.5.1/4.5.2/4.6/4.6.1/4.6.2 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx | ||
| 12 | --> | ||
| 13 | |||
| 14 | <?define NetFx462MinRelease = 394802 ?> | ||
| 15 | <?define NetFx462WebLink = http://go.microsoft.com/fwlink/?LinkId=780596 ?> | ||
| 16 | <?define NetFx462RedistLink = http://go.microsoft.com/fwlink/?LinkId=780600 ?> | ||
| 17 | |||
| 18 | <Fragment> | ||
| 19 | <PropertyRef Id="WIXNETFX4RELEASEINSTALLED" /> | ||
| 20 | <Property Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Secure="yes" /> | ||
| 21 | <SetProperty Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Value="1" After="AppSearch"> | ||
| 22 | WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx462MinRelease)" | ||
| 23 | </SetProperty> | ||
| 24 | </Fragment> | ||
| 25 | |||
| 26 | <Fragment> | ||
| 27 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 28 | |||
| 29 | <WixVariable Id="NetFx462WebDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx462MinRelease)" Overridable="yes" /> | ||
| 30 | <WixVariable Id="NetFx462WebInstallCondition" Value="" Overridable="yes" /> | ||
| 31 | <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 32 | |||
| 33 | <PackageGroup Id="NetFx462Web"> | ||
| 34 | <ExePackage | ||
| 35 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 36 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 37 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 38 | PerMachine="yes" | ||
| 39 | DetectCondition="!(wix.NetFx462WebDetectCondition)" | ||
| 40 | InstallCondition="!(wix.NetFx462WebInstallCondition)" | ||
| 41 | Id="NetFx462Web" | ||
| 42 | Vital="yes" | ||
| 43 | Permanent="yes" | ||
| 44 | Protocol="netfx4" | ||
| 45 | DownloadUrl="$(var.NetFx462WebLink)" | ||
| 46 | LogPathVariable="NetFx462FullLog" | ||
| 47 | Compressed="no" | ||
| 48 | Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe"> | ||
| 49 | <RemotePayload | ||
| 50 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 51 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 52 | Description="Microsoft .NET Framework 4.6.2 Setup" | ||
| 53 | Hash="C42E6ED280290648BBD59F664008852F4CFE4548" | ||
| 54 | ProductName="Microsoft .NET Framework 4.6.2" | ||
| 55 | Size="1429344" | ||
| 56 | Version="4.6.1590.0" /> | ||
| 57 | </ExePackage> | ||
| 58 | </PackageGroup> | ||
| 59 | </Fragment> | ||
| 60 | |||
| 61 | <Fragment> | ||
| 62 | <util:RegistrySearchRef Id="NETFRAMEWORK45"/> | ||
| 63 | |||
| 64 | <WixVariable Id="NetFx462RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx462MinRelease)" Overridable="yes" /> | ||
| 65 | <WixVariable Id="NetFx462RedistInstallCondition" Value="" Overridable="yes" /> | ||
| 66 | <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" /> | ||
| 67 | |||
| 68 | <PackageGroup Id="NetFx462Redist"> | ||
| 69 | <ExePackage | ||
| 70 | InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 71 | RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 72 | UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html"" | ||
| 73 | PerMachine="yes" | ||
| 74 | DetectCondition="!(wix.NetFx462RedistDetectCondition)" | ||
| 75 | InstallCondition="!(wix.NetFx462RedistInstallCondition)" | ||
| 76 | Id="NetFx462Redist" | ||
| 77 | Vital="yes" | ||
| 78 | Permanent="yes" | ||
| 79 | Protocol="netfx4" | ||
| 80 | DownloadUrl="$(var.NetFx462RedistLink)" | ||
| 81 | LogPathVariable="NetFx462FullLog" | ||
| 82 | Compressed="no" | ||
| 83 | Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe"> | ||
| 84 | <RemotePayload | ||
| 85 | CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0" | ||
| 86 | CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC" | ||
| 87 | Description="Microsoft .NET Framework 4.6.2 Setup" | ||
| 88 | Hash="A70F856BDA33D45AD0A8AD035F73092441715431" | ||
| 89 | ProductName="Microsoft .NET Framework 4.6.2" | ||
| 90 | Size="62008080" | ||
| 91 | Version="4.6.1590.0" /> | ||
| 92 | </ExePackage> | ||
| 93 | </PackageGroup> | ||
| 94 | </Fragment> | ||
| 95 | </Wix> | ||
diff --git a/src/wixlib/NetFxExtension.wxs b/src/wixlib/NetFxExtension.wxs new file mode 100644 index 00000000..b64dc004 --- /dev/null +++ b/src/wixlib/NetFxExtension.wxs | |||
| @@ -0,0 +1,39 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <!-- | ||
| 8 | .NET Framework installation state properties | ||
| 9 | --> | ||
| 10 | |||
| 11 | <!-- Location of .NET Framework redistributable install root directory --> | ||
| 12 | <Fragment> | ||
| 13 | <Property Id="NETFRAMEWORKINSTALLROOTDIR" Secure="yes"> | ||
| 14 | <RegistrySearch Id="NetFxInstallRootSearch" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" /> | ||
| 15 | </Property> | ||
| 16 | </Fragment> | ||
| 17 | |||
| 18 | <!-- location of the Windows SDK current active version installation root --> | ||
| 19 | <Fragment> | ||
| 20 | <Property Id="WINDOWSSDKCURRENTVERSIONDIR" Secure="yes"> | ||
| 21 | <RegistrySearch Id="WindowsSdkCurrentVersionDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentInstallFolder" Type="raw" /> | ||
| 22 | </Property> | ||
| 23 | </Fragment> | ||
| 24 | |||
| 25 | <!-- The Windows SDK current active version --> | ||
| 26 | <Fragment> | ||
| 27 | <Property Id="WINDOWSSDKCURRENTVERSION" Secure="yes"> | ||
| 28 | <RegistrySearch Id="WindowsSdkCurrentVersion" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentVersion" Type="raw" /> | ||
| 29 | </Property> | ||
| 30 | </Fragment> | ||
| 31 | |||
| 32 | <!-- Release value of .NET 4.5 and later --> | ||
| 33 | <Fragment> | ||
| 34 | <Property Id="WIXNETFX4RELEASEINSTALLED" Secure="yes"> | ||
| 35 | <RegistrySearch Id="NetFx4ReleaseInstalled" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" /> | ||
| 36 | </Property> | ||
| 37 | </Fragment> | ||
| 38 | |||
| 39 | </Wix> | ||
diff --git a/src/wixlib/NetFxExtension_Platform.wxi b/src/wixlib/NetFxExtension_Platform.wxi new file mode 100644 index 00000000..9236f316 --- /dev/null +++ b/src/wixlib/NetFxExtension_Platform.wxi | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | <?xml version="1.0"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | |||
| 7 | <?include caSuffix.wxi ?> | ||
| 8 | <Fragment> | ||
| 9 | <CustomAction Id="NetFxScheduleNativeImage$(var.Suffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="SchedNetFx" Execute="immediate" Return="check" SuppressModularization="yes" /> | ||
| 10 | <CustomAction Id="NetFxExecuteNativeImageInstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" /> | ||
| 11 | <CustomAction Id="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" /> | ||
| 12 | <CustomAction Id="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" /> | ||
| 13 | <CustomAction Id="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" /> | ||
| 14 | |||
| 15 | <InstallExecuteSequence> | ||
| 16 | <Custom Action="NetFxScheduleNativeImage$(var.Suffix)" Before="InstallFiles" Overridable="yes" /> | ||
| 17 | <Custom Action="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" After="MsiPublishAssemblies" Overridable="yes">RollbackDisabled <> 1</Custom> | ||
| 18 | <Custom Action="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom> | ||
| 19 | <Custom Action="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled <> 1</Custom> | ||
| 20 | <Custom Action="NetFxExecuteNativeImageInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom> | ||
| 21 | </InstallExecuteSequence> | ||
| 22 | </Fragment> | ||
| 23 | |||
| 24 | <!-- NetFx Custom Action DLL Definitions --> | ||
| 25 | <Fragment> | ||
| 26 | <Binary Id="NetFxCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))netfxca.dll" /> | ||
| 27 | </Fragment> | ||
| 28 | </Include> | ||
diff --git a/src/wixlib/NetFxExtension_x86.wxs b/src/wixlib/NetFxExtension_x86.wxs new file mode 100644 index 00000000..7245a4dd --- /dev/null +++ b/src/wixlib/NetFxExtension_x86.wxs | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | <?xml version="1.0"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | |||
| 5 | <Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 6 | <?define platform=x86 ?> | ||
| 7 | <?include NetfxExtension_Platform.wxi ?> | ||
| 8 | </Wix> | ||
diff --git a/src/wixlib/caSuffix.wxi b/src/wixlib/caSuffix.wxi new file mode 100644 index 00000000..a56a2393 --- /dev/null +++ b/src/wixlib/caSuffix.wxi | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | |||
| 4 | <Include xmlns="http://wixtoolset.org/schemas/v4/wxs"> | ||
| 5 | <?ifndef platform ?> | ||
| 6 | <?error Required value "platform" not defined in include caSuffix.wxi ?> | ||
| 7 | <?endif ?> | ||
| 8 | |||
| 9 | <?ifdef Suffix ?> | ||
| 10 | <?undef Suffix ?> | ||
| 11 | <?undef DeferredSuffix ?> | ||
| 12 | <?endif ?> | ||
| 13 | |||
| 14 | <?if $(var.platform)="x86" ?> | ||
| 15 | <?define Suffix="" ?> | ||
| 16 | <?define DeferredSuffix="" ?> | ||
| 17 | <?endif ?> | ||
| 18 | |||
| 19 | <?if $(var.platform)="x64" ?> | ||
| 20 | <?define Suffix="_x64" ?> | ||
| 21 | <?define DeferredSuffix="_64" ?> | ||
| 22 | <?endif ?> | ||
| 23 | |||
| 24 | <?if $(var.platform)="arm" ?> | ||
| 25 | <?define Suffix="_ARM" ?> | ||
| 26 | <?define DeferredSuffix="_ARM" ?> | ||
| 27 | <?endif ?> | ||
| 28 | </Include> | ||
diff --git a/src/wixlib/netfx.wixproj b/src/wixlib/netfx.wixproj new file mode 100644 index 00000000..8a734c84 --- /dev/null +++ b/src/wixlib/netfx.wixproj | |||
| @@ -0,0 +1,53 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. --> | ||
| 3 | <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0"> | ||
| 4 | <Import Project="..\..\packages\WixToolset.Core.InternalPackage.4.0.64\build\WixToolset.Core.InternalPackage.props" Condition="Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.64\build\WixToolset.Core.InternalPackage.props')" /> | ||
| 5 | <Import Project="..\FindLocalWix.props" /> | ||
| 6 | <PropertyGroup> | ||
| 7 | <ProjectGuid>{45e4a6ac-3190-4e17-83f0-9935ffa5dc2b}</ProjectGuid> | ||
| 8 | <OutputName>netfx</OutputName> | ||
| 9 | <OutputType>Library</OutputType> | ||
| 10 | <BindFiles>true</BindFiles> | ||
| 11 | <Pedantic>true</Pedantic> | ||
| 12 | </PropertyGroup> | ||
| 13 | <ItemGroup> | ||
| 14 | <Compile Include="NetFxExtension.wxs" /> | ||
| 15 | <Compile Include="NetFx1.wxs" /> | ||
| 16 | <Compile Include="NetFx1.1.wxs" /> | ||
| 17 | <Compile Include="NetFx2.wxs" /> | ||
| 18 | <Compile Include="NetFx3.wxs" /> | ||
| 19 | <Compile Include="NetFx3.5.wxs" /> | ||
| 20 | <Compile Include="NetFx4.wxs" /> | ||
| 21 | <Compile Include="NetFx4.5.wxs" /> | ||
| 22 | <Compile Include="NetFx451.wxs" /> | ||
| 23 | <Compile Include="NetFx452.wxs" /> | ||
| 24 | <Compile Include="NetFx46.wxs" /> | ||
| 25 | <Compile Include="NetFx461.wxs" /> | ||
| 26 | <Compile Include="NetFx462.wxs" /> | ||
| 27 | <Compile Include="NetFxExtension_x86.wxs" /> | ||
| 28 | </ItemGroup> | ||
| 29 | <ItemGroup> | ||
| 30 | <None Include="packages.config" /> | ||
| 31 | </ItemGroup> | ||
| 32 | <ItemGroup> | ||
| 33 | <ProjectReference Include="..\ca\netfxca.vcxproj"> | ||
| 34 | <Name>netfxca</Name> | ||
| 35 | <Project>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</Project> | ||
| 36 | </ProjectReference> | ||
| 37 | </ItemGroup> | ||
| 38 | <Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' AND Exists('$(WixTargetsPath)') " /> | ||
| 39 | <Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets') " /> | ||
| 40 | <Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' "> | ||
| 41 | <Error Text="FG-WiX or WiX Toolset build tools (v3.11 or later) must be installed to build this project. To download FG-WiX, go to https://www.firegiant.com/downloads/. To download the WiX Toolset, go to http://wixtoolset.org/releases/." /> | ||
| 42 | </Target> | ||
| 43 | <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> | ||
| 44 | <PropertyGroup> | ||
| 45 | <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> | ||
| 46 | </PropertyGroup> | ||
| 47 | <Error Condition="!Exists('..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets'))" /> | ||
| 48 | <Error Condition="!Exists('..\..\packages\WixToolset.Util.wixext.4.0.1\build\WixToolset.Util.wixext.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.Util.wixext.4.0.1\build\WixToolset.Util.wixext.targets'))" /> | ||
| 49 | <Error Condition="!Exists('..\..\packages\WixToolset.Core.InternalPackage.4.0.64\build\WixToolset.Core.InternalPackage.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\WixToolset.Core.InternalPackage.4.0.64\build\WixToolset.Core.InternalPackage.props'))" /> | ||
| 50 | </Target> | ||
| 51 | <Import Project="..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets')" /> | ||
| 52 | <Import Project="..\..\packages\WixToolset.Util.wixext.4.0.1\build\WixToolset.Util.wixext.targets" Condition="Exists('..\..\packages\WixToolset.Util.wixext.4.0.1\build\WixToolset.Util.wixext.targets')" /> | ||
| 53 | </Project> \ No newline at end of file | ||
diff --git a/src/wixlib/packages.config b/src/wixlib/packages.config new file mode 100644 index 00000000..ba130574 --- /dev/null +++ b/src/wixlib/packages.config | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | <?xml version="1.0" encoding="utf-8"?> | ||
| 2 | <packages> | ||
| 3 | <package id="Nerdbank.GitVersioning" version="2.1.7" developmentDependency="true" targetFramework="net40" /> | ||
| 4 | <package id="WixToolset.Core.InternalPackage" version="4.0.64" targetFramework="net40" developmentDependency="true" /> | ||
| 5 | <package id="WixToolset.Util.wixext" version="4.0.1" targetFramework="net40" /> | ||
| 6 | </packages> \ No newline at end of file | ||
