@joebigelow / wix / commits / 60d7baef

Initial code commit

Rob Mensching committed Jan 1, 2018 at 10:30 UTC 60d7baefb4e87bf0ddaae58a653faee0be0429f6
49 files changed +4391
NetFx.wixext.sln new
+59
@@ -0,0 +1,59 @@
1 +
2 +Microsoft Visual Studio Solution File, Format Version 12.00
3 +# Visual Studio 15
4 +VisualStudioVersion = 15.0.27130.2010
5 +MinimumVisualStudioVersion = 15.0.26124.0
6 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netfxca", "src\ca\netfxca.vcxproj", "{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}"
7 +EndProject
8 +Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "netfx", "src\wixlib\netfx.wixproj", "{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}"
9 +EndProject
10 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Netfx.wixext", "src\wixext\WixToolset.Netfx.wixext.csproj", "{F774E291-0563-4DDD-B873-F5C31683CF4B}"
11 +EndProject
12 +Global
13 + GlobalSection(SolutionConfigurationPlatforms) = preSolution
14 + Debug|Any CPU = Debug|Any CPU
15 + Debug|x64 = Debug|x64
16 + Debug|x86 = Debug|x86
17 + Release|Any CPU = Release|Any CPU
18 + Release|x64 = Release|x64
19 + Release|x86 = Release|x86
20 + EndGlobalSection
21 + GlobalSection(ProjectConfigurationPlatforms) = postSolution
22 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.ActiveCfg = Debug|Win32
23 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x64.ActiveCfg = Debug|Win32
24 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.ActiveCfg = Debug|Win32
25 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.Build.0 = Debug|Win32
26 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.ActiveCfg = Release|Win32
27 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x64.ActiveCfg = Release|Win32
28 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.ActiveCfg = Release|Win32
29 + {F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.Build.0 = Release|Win32
30 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|x86
31 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x64.ActiveCfg = Debug|x64
32 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x64.Build.0 = Debug|x64
33 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.ActiveCfg = Debug|x86
34 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.Build.0 = Debug|x86
35 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|Any CPU.ActiveCfg = Release|x86
36 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x64.ActiveCfg = Release|x64
37 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x64.Build.0 = Release|x64
38 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.ActiveCfg = Release|x86
39 + {45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.Build.0 = Release|x86
40 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
41 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
42 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.ActiveCfg = Debug|Any CPU
43 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.Build.0 = Debug|Any CPU
44 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.ActiveCfg = Debug|Any CPU
45 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.Build.0 = Debug|Any CPU
46 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
47 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.Build.0 = Release|Any CPU
48 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.ActiveCfg = Release|Any CPU
49 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.Build.0 = Release|Any CPU
50 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.ActiveCfg = Release|Any CPU
51 + {F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.Build.0 = Release|Any CPU
52 + EndGlobalSection
53 + GlobalSection(SolutionProperties) = preSolution
54 + HideSolutionNode = FALSE
55 + EndGlobalSection
56 + GlobalSection(ExtensibilityGlobals) = postSolution
57 + SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D}
58 + EndGlobalSection
59 +EndGlobal
appveyor.cmd new
+13
@@ -0,0 +1,13 @@
1 +@setlocal
2 +@pushd %~dp0
3 +
4 +nuget restore
5 +
6 +msbuild -p:Configuration=Release -t:Restore
7 +
8 +msbuild -p:Configuration=Release src\test\WixToolsetTest.NetFx\WixToolsetTest.NetFx.csproj
9 +
10 +msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.NetFx.wixext.csproj
11 +
12 +@popd
13 +@endlocal
\ No newline at end of file
appveyor.yml new
+29
@@ -0,0 +1,29 @@
1 +image: Visual Studio 2017
2 +
3 +version: 0.0.0.{build}
4 +configuration: Release
5 +
6 +environment:
7 + DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
8 + DOTNET_CLI_TELEMETRY_OPTOUT: 1
9 + NUGET_XMLDOC_MODE: skip
10 +
11 +build_script:
12 + - appveyor.cmd
13 +
14 +pull_requests:
15 + do_not_increment_build_number: true
16 +
17 +nuget:
18 + disable_publish_on_pr: true
19 +
20 +skip_tags: true
21 +
22 +artifacts:
23 +- path: build\Release\**\*.nupkg
24 + name: nuget
25 +
26 +notifications:
27 +- provider: Slack
28 + incoming_webhook:
29 + secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=
nuget.config new
+16
@@ -0,0 +1,16 @@
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<configuration>
3 + <packageSources>
4 + <clear />
5 + <add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
6 + <add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
7 + <add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
8 + <add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
9 + <add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
10 + <add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
11 + <add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
12 + <add key="wixtoolset-util-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-util-wixext" />
13 + <add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
14 + <add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
15 + </packageSources>
16 +</configuration>
\ No newline at end of file
src/Cpp.Build.props new
+101
@@ -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) &gt; 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>
src/Directory.Build.props new
+22
@@ -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>
src/FindLocalWix.props new
+10
@@ -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>
src/ca/cost.h new
+7
@@ -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 +
src/ca/dllmain.cpp new
+26
@@ -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 +}
src/ca/netfxca.cpp new
+823
@@ -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 +
src/ca/netfxca.def new
+8
@@ -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
src/ca/netfxca.vcxproj new
+70
@@ -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
src/ca/packages.config new
+6
@@ -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
src/ca/precomp.h new
+13
@@ -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"
src/test/WixToolsetTest.Netfx/NetfxExtensionFixture.cs new
+33
@@ -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 +}
src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.en-us.wxl new
+11
@@ -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>
src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/Package.wxs new
+22
@@ -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>
src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/PackageComponents.wxs new
+13
@@ -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>
src/test/WixToolsetTest.Netfx/TestData/UsingNativeImage/example.txt new
+1
@@ -0,0 +1 @@
1 +This is example.txt.
\ No newline at end of file
src/test/WixToolsetTest.Netfx/WixToolsetTest.Netfx.csproj new
+40
@@ -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>
src/wixext/NetFxCompiler.cs new
+159
@@ -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 +}
src/wixext/NetFxDecompiler.cs new
+139
@@ -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 +}
src/wixext/NetFxExtensionData.cs new
+25
@@ -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 +}
src/wixext/NetfxExtensionFactory.cs new
+18
@@ -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 +}
src/wixext/NetfxWindowsInstallerBackendExtension.cs new
+27
@@ -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 +}
src/wixext/Tuples/NetFxNativeImageTuple.cs new
+65
@@ -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
src/wixext/Tuples/NetfxTupleDefinitions.cs new
+27
@@ -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 +}
src/wixext/WixToolset.Netfx.wixext.csproj new
+35
@@ -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>
src/wixext/WixToolset.Netfx.wixext.targets new
+11
@@ -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>
src/wixext/netfx.xsd new
+235
@@ -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>
src/wixlib/NetFx1.1.wxs new
+192
@@ -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>
src/wixlib/NetFx1.wxs new
+31
@@ -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>
src/wixlib/NetFx2.wxs new
+201
@@ -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>
src/wixlib/NetFx3.5.wxs new
+241
@@ -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>
src/wixlib/NetFx3.wxs new
+195
@@ -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>
src/wixlib/NetFx4.5.wxs new
+274
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
47 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
48 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
82 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
83 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
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>
src/wixlib/NetFx4.wxs new
+543
@@ -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 &quot;[WixBundleName]&quot;"
44 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
45 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
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 &quot;[WixBundleName]&quot;"
73 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
74 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
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 &quot;[WixBundleName]&quot;"
113 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
114 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
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 &quot;[WixBundleName]&quot;"
142 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
143 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
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>
src/wixlib/NetFx451.wxs new
+96
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
37 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
38 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
72 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
73 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
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>
src/wixlib/NetFx452.wxs new
+95
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
37 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
38 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
71 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
72 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
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>
src/wixlib/NetFx46.wxs new
+96
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
37 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
38 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
72 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
73 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
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>
src/wixlib/NetFx461.wxs new
+95
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
36 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
37 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
71 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
72 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
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>
src/wixlib/NetFx462.wxs new
+95
@@ -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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
36 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
37 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
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 &gt;= $(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 &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
71 + RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
72 + UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
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>
src/wixlib/NetFxExtension.wxs new
+39
@@ -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>
src/wixlib/NetFxExtension_Platform.wxi new
+28
@@ -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 &lt;&gt; 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 &lt;&gt; 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>
src/wixlib/NetFxExtension_x86.wxs new
+8
@@ -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>
src/wixlib/caSuffix.wxi new
+28
@@ -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>
src/wixlib/netfx.wixproj new
+53
@@ -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
src/wixlib/packages.config new
+6
@@ -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
version.json new
+11
@@ -0,0 +1,11 @@
1 +{
2 + "version": "4.0",
3 + "publicReleaseRefSpec": [
4 + "^refs/heads/master$"
5 + ],
6 + "cloudBuild": {
7 + "buildNumber": {
8 + "enabled": true
9 + }
10 + }
11 +}