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) > 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 >= $(var.NetFx45MinRelease)" Overridable="yes" />
41
+ <WixVariable Id="NetFx45WebInstallCondition" Value="" Overridable="yes" />
42
+ <WixVariable Id="NetFx45WebPackageDirectory" Value="redist\" Overridable="yes" />
43
+
44
+ <PackageGroup Id="NetFx45Web">
45
+ <ExePackage
46
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html""
47
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html""
48
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullWebLog].html""
49
+ PerMachine="yes"
50
+ DetectCondition="!(wix.NetFx45WebDetectCondition)"
51
+ InstallCondition="!(wix.NetFx45WebInstallCondition)"
52
+ Id="NetFx45Web"
53
+ Vital="yes"
54
+ Permanent="yes"
55
+ Protocol="netfx4"
56
+ DownloadUrl="$(var.NetFx45WebLink)"
57
+ LogPathVariable="NetFx45FullWebLog"
58
+ Compressed="no"
59
+ Name="!(wix.NetFx45WebPackageDirectory)dotNetFx45_Full_setup.exe">
60
+ <RemotePayload
61
+ Size="1005568"
62
+ Version="4.5.50709.17929"
63
+ ProductName="Microsoft .NET Framework 4.5"
64
+ Description="Microsoft .NET Framework 4.5 Setup"
65
+ CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D"
66
+ CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255"
67
+ Hash="F6BA6F03C65C3996A258F58324A917463B2D6FF4"/>
68
+ </ExePackage>
69
+ </PackageGroup>
70
+ </Fragment>
71
+
72
+ <Fragment>
73
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
74
+
75
+ <WixVariable Id="NetFx45RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx45MinRelease)" Overridable="yes" />
76
+ <WixVariable Id="NetFx45RedistInstallCondition" Value="" Overridable="yes" />
77
+ <WixVariable Id="NetFx45RedistPackageDirectory" Value="redist\" Overridable="yes" />
78
+
79
+ <PackageGroup Id="NetFx45Redist">
80
+ <ExePackage
81
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html""
82
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html""
83
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx45FullLog].html""
84
+ PerMachine="yes"
85
+ DetectCondition="!(wix.NetFx45RedistDetectCondition)"
86
+ InstallCondition="!(wix.NetFx45RedistInstallCondition)"
87
+ Id="NetFx45Redist"
88
+ Vital="yes"
89
+ Permanent="yes"
90
+ Protocol="netfx4"
91
+ DownloadUrl="$(var.NetFx45RedistLink)"
92
+ LogPathVariable="NetFx45FullLog"
93
+ Compressed="no"
94
+ Name="!(wix.NetFx45RedistPackageDirectory)dotNetFx45_Full_x86_x64.exe">
95
+ <RemotePayload
96
+ Size="50352408"
97
+ Version="4.5.50709.17929"
98
+ ProductName="Microsoft .NET Framework 4.5"
99
+ Description="Microsoft .NET Framework 4.5 Setup"
100
+ CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D"
101
+ CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255"
102
+ Hash="B2FF712CA0947040CA0B8E9BD7436A3C3524BB5D"/>
103
+ </ExePackage>
104
+ </PackageGroup>
105
+ </Fragment>
106
+
107
+ <!-- set to Release number of the .NET Framework 4.5 if installed (not set otherwise) -->
108
+ <Fragment>
109
+ <Property Id="NETFRAMEWORK45" Secure="yes">
110
+ <RegistrySearch Id="NetFramework45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" />
111
+ </Property>
112
+ </Fragment>
113
+
114
+ <!-- set to Release number of the .NET Framework 4.5 Arabic language pack if installed (not set otherwise) -->
115
+ <Fragment>
116
+ <Property Id="NETFRAMEWORK45_AR_SA_LANGPACK" Secure="yes">
117
+ <RegistrySearch Id="NETFRAMEWORK45ArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Release" Type="raw" />
118
+ </Property>
119
+ </Fragment>
120
+
121
+ <!-- set to Release number of the .NET Framework 4.5 Chinese (Simplified) language pack if installed (not set otherwise) -->
122
+ <Fragment>
123
+ <Property Id="NETFRAMEWORK45_ZH_CN_LANGPACK" Secure="yes">
124
+ <RegistrySearch Id="NETFRAMEWORK45ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Release" Type="raw" />
125
+ </Property>
126
+ </Fragment>
127
+
128
+ <!-- set to Release number of the .NET Framework 4.5 Chinese (Traditional) language pack if installed (not set otherwise) -->
129
+ <Fragment>
130
+ <Property Id="NETFRAMEWORK45_ZH_TW_LANGPACK" Secure="yes">
131
+ <RegistrySearch Id="NETFRAMEWORK45ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Release" Type="raw" />
132
+ </Property>
133
+ </Fragment>
134
+
135
+ <!-- set to Release number of the .NET Framework 4.5 Czech language pack if installed (not set otherwise) -->
136
+ <Fragment>
137
+ <Property Id="NETFRAMEWORK45_CS_CZ_LANGPACK" Secure="yes">
138
+ <RegistrySearch Id="NETFRAMEWORK45CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Release" Type="raw" />
139
+ </Property>
140
+ </Fragment>
141
+
142
+ <!-- set to Release number of the .NET Framework 4.5 Danish language pack if installed (not set otherwise) -->
143
+ <Fragment>
144
+ <Property Id="NETFRAMEWORK45_DA_DK_LANGPACK" Secure="yes">
145
+ <RegistrySearch Id="NETFRAMEWORK45DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Release" Type="raw" />
146
+ </Property>
147
+ </Fragment>
148
+
149
+ <!-- set to Release number of the .NET Framework 4.5 Dutch language pack if installed (not set otherwise) -->
150
+ <Fragment>
151
+ <Property Id="NETFRAMEWORK45_NL_NL_LANGPACK" Secure="yes">
152
+ <RegistrySearch Id="NETFRAMEWORK45NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Release" Type="raw" />
153
+ </Property>
154
+ </Fragment>
155
+
156
+ <!-- set to Release number of the .NET Framework 4.5 Finnish language pack if installed (not set otherwise) -->
157
+ <Fragment>
158
+ <Property Id="NETFRAMEWORK45_FI_FI_LANGPACK" Secure="yes">
159
+ <RegistrySearch Id="NETFRAMEWORK45FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Release" Type="raw" />
160
+ </Property>
161
+ </Fragment>
162
+
163
+ <!-- set to Release number of the .NET Framework 4.5 French language pack if installed (not set otherwise) -->
164
+ <Fragment>
165
+ <Property Id="NETFRAMEWORK45_FR_FR_LANGPACK" Secure="yes">
166
+ <RegistrySearch Id="NETFRAMEWORK45FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Release" Type="raw" />
167
+ </Property>
168
+ </Fragment>
169
+
170
+ <!-- set to Release number of the .NET Framework 4.5 German language pack if installed (not set otherwise) -->
171
+ <Fragment>
172
+ <Property Id="NETFRAMEWORK45_DE_DE_LANGPACK" Secure="yes">
173
+ <RegistrySearch Id="NETFRAMEWORK45DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Release" Type="raw" />
174
+ </Property>
175
+ </Fragment>
176
+
177
+ <!-- set to Release number of the .NET Framework 4.5 Greek language pack if installed (not set otherwise) -->
178
+ <Fragment>
179
+ <Property Id="NETFRAMEWORK45_EL_GR_LANGPACK" Secure="yes">
180
+ <RegistrySearch Id="NETFRAMEWORK45ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Release" Type="raw" />
181
+ </Property>
182
+ </Fragment>
183
+
184
+ <!-- set to Release number of the .NET Framework 4.5 Hebrew language pack if installed (not set otherwise) -->
185
+ <Fragment>
186
+ <Property Id="NETFRAMEWORK45_HE_IL_LANGPACK" Secure="yes">
187
+ <RegistrySearch Id="NETFRAMEWORK45HeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Release" Type="raw" />
188
+ </Property>
189
+ </Fragment>
190
+
191
+ <!-- set to Release number of the .NET Framework 4.5 Hungarian language pack if installed (not set otherwise) -->
192
+ <Fragment>
193
+ <Property Id="NETFRAMEWORK45_HU_HU_LANGPACK" Secure="yes">
194
+ <RegistrySearch Id="NETFRAMEWORK45HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Release" Type="raw" />
195
+ </Property>
196
+ </Fragment>
197
+
198
+ <!-- set to Release number of the .NET Framework 4.5 Italian language pack if installed (not set otherwise) -->
199
+ <Fragment>
200
+ <Property Id="NETFRAMEWORK45_IT_IT_LANGPACK" Secure="yes">
201
+ <RegistrySearch Id="NETFRAMEWORK45ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Release" Type="raw" />
202
+ </Property>
203
+ </Fragment>
204
+
205
+ <!-- set to Release number of the .NET Framework 4.5 Japanese language pack if installed (not set otherwise) -->
206
+ <Fragment>
207
+ <Property Id="NETFRAMEWORK45_JA_JP_LANGPACK" Secure="yes">
208
+ <RegistrySearch Id="NETFRAMEWORK45JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Release" Type="raw" />
209
+ </Property>
210
+ </Fragment>
211
+
212
+ <!-- set to Release number of the .NET Framework 4.5 Korean language pack if installed (not set otherwise) -->
213
+ <Fragment>
214
+ <Property Id="NETFRAMEWORK45_KO_KR_LANGPACK" Secure="yes">
215
+ <RegistrySearch Id="NETFRAMEWORK45KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Release" Type="raw" />
216
+ </Property>
217
+ </Fragment>
218
+
219
+ <!-- set to Release number of the .NET Framework 4.5 Norwegian language pack if installed (not set otherwise) -->
220
+ <Fragment>
221
+ <Property Id="NETFRAMEWORK45_NB_NO_LANGPACK" Secure="yes">
222
+ <RegistrySearch Id="NETFRAMEWORK45NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Release" Type="raw" />
223
+ </Property>
224
+ </Fragment>
225
+
226
+ <!-- set to Release number of the .NET Framework 4.5 Polish language pack if installed (not set otherwise) -->
227
+ <Fragment>
228
+ <Property Id="NETFRAMEWORK45_PL_PL_LANGPACK" Secure="yes">
229
+ <RegistrySearch Id="NETFRAMEWORK45PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Release" Type="raw" />
230
+ </Property>
231
+ </Fragment>
232
+
233
+ <!-- set to Release number of the .NET Framework 4.5 Portuguese (Brazil) language pack if installed (not set otherwise) -->
234
+ <Fragment>
235
+ <Property Id="NETFRAMEWORK45_PT_BR_LANGPACK" Secure="yes">
236
+ <RegistrySearch Id="NETFRAMEWORK45PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Release" Type="raw" />
237
+ </Property>
238
+ </Fragment>
239
+
240
+ <!-- set to Release number of the .NET Framework 4.5 Portuguese (Portugal) language pack if installed (not set otherwise) -->
241
+ <Fragment>
242
+ <Property Id="NETFRAMEWORK45_PT_PT_LANGPACK" Secure="yes">
243
+ <RegistrySearch Id="NETFRAMEWORK45PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Release" Type="raw" />
244
+ </Property>
245
+ </Fragment>
246
+
247
+ <!-- set to Release number of the .NET Framework 4.5 Russian language pack if installed (not set otherwise) -->
248
+ <Fragment>
249
+ <Property Id="NETFRAMEWORK45_RU_RU_LANGPACK" Secure="yes">
250
+ <RegistrySearch Id="NETFRAMEWORK45RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Release" Type="raw" />
251
+ </Property>
252
+ </Fragment>
253
+
254
+ <!-- set to Release number of the .NET Framework 4.5 Spanish language pack if installed (not set otherwise) -->
255
+ <Fragment>
256
+ <Property Id="NETFRAMEWORK45_ES_ES_LANGPACK" Secure="yes">
257
+ <RegistrySearch Id="NETFRAMEWORK45EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Release" Type="raw" />
258
+ </Property>
259
+ </Fragment>
260
+
261
+ <!-- set to Release number of the .NET Framework 4.5 Swedish language pack if installed (not set otherwise) -->
262
+ <Fragment>
263
+ <Property Id="NETFRAMEWORK45_SV_SE_LANGPACK" Secure="yes">
264
+ <RegistrySearch Id="NETFRAMEWORK45SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Release" Type="raw" />
265
+ </Property>
266
+ </Fragment>
267
+
268
+ <!-- set to Release number of the .NET Framework 4.5 Turkish language pack if installed (not set otherwise) -->
269
+ <Fragment>
270
+ <Property Id="NETFRAMEWORK45_TR_TR_LANGPACK" Secure="yes">
271
+ <RegistrySearch Id="NETFRAMEWORK45TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Release" Type="raw" />
272
+ </Property>
273
+ </Fragment>
274
+</Wix>
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 "[WixBundleName]""
44
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]""
45
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]""
46
+ PerMachine="yes"
47
+ DetectCondition="NETFRAMEWORK40"
48
+ Id="NetFx40Web"
49
+ Vital="yes"
50
+ Permanent="yes"
51
+ Protocol="netfx4"
52
+ DownloadUrl="$(var.NetFx40WebLink)"
53
+ Compressed="no"
54
+ Name="redist\dotNetFx40_Full_setup.exe">
55
+ <RemotePayload
56
+ Size="889416"
57
+ Version="4.0.30319.1"
58
+ ProductName="Microsoft .NET Framework 4"
59
+ Description="Microsoft .NET Framework 4 Setup"
60
+ CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
61
+ CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
62
+ Hash="06BECADB92A5FCCA2529C0B93687C2A0C6D0D610"/>
63
+ </ExePackage>
64
+ </PackageGroup>
65
+ </Fragment>
66
+
67
+ <Fragment>
68
+ <util:RegistrySearchRef Id="NETFRAMEWORK40"/>
69
+
70
+ <PackageGroup Id="NetFx40Redist">
71
+ <ExePackage
72
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]""
73
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]""
74
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]""
75
+ PerMachine="yes"
76
+ DetectCondition="NETFRAMEWORK40"
77
+ Id="NetFx40Redist"
78
+ Vital="yes"
79
+ Permanent="yes"
80
+ Protocol="netfx4"
81
+ DownloadUrl="$(var.NetFx40RedistLink)"
82
+ Compressed="no"
83
+ Name="redist\dotNetFx40_Full_x86_x64.exe">
84
+ <RemotePayload
85
+ Size="50449456"
86
+ Version="4.0.30319.1"
87
+ ProductName="Microsoft .NET Framework 4"
88
+ Description="Microsoft .NET Framework 4 Setup"
89
+ CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
90
+ CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
91
+ Hash="58DA3D74DB353AAD03588CBB5CEA8234166D8B99"/>
92
+ </ExePackage>
93
+ </PackageGroup>
94
+ </Fragment>
95
+
96
+ <Fragment>
97
+ <util:RegistrySearch
98
+ Id="NETFRAMEWORK40CLIENT"
99
+ Variable="NETFRAMEWORK40CLIENT"
100
+ Root="HKLM"
101
+ Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client"
102
+ Value="Install"
103
+ Result="value" />
104
+ </Fragment>
105
+
106
+
107
+ <Fragment>
108
+ <util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/>
109
+
110
+ <PackageGroup Id="NetFx40ClientWeb">
111
+ <ExePackage
112
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]""
113
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]""
114
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]""
115
+ PerMachine="yes"
116
+ DetectCondition="NETFRAMEWORK40CLIENT"
117
+ Id="NetFx40ClientWeb"
118
+ Vital="yes"
119
+ Permanent="yes"
120
+ Protocol="netfx4"
121
+ DownloadUrl="$(var.NetFx40ClientWebLink)"
122
+ Compressed="no"
123
+ Name="redist\dotNetFx40_Client_setup.exe">
124
+ <RemotePayload
125
+ Size="887896"
126
+ Version="4.0.30319.1"
127
+ ProductName="Microsoft .NET Framework 4 Client Profile"
128
+ Description="Microsoft .NET Framework 4 Client Profile Setup"
129
+ CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
130
+ CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
131
+ Hash="E15AD80FC74277EF2048312E9A71AF56B2EBA622"/>
132
+ </ExePackage>
133
+ </PackageGroup>
134
+ </Fragment>
135
+
136
+ <Fragment>
137
+ <util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/>
138
+
139
+ <PackageGroup Id="NetFx40ClientRedist">
140
+ <ExePackage
141
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]""
142
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]""
143
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]""
144
+ PerMachine="yes"
145
+ DetectCondition="NETFRAMEWORK40CLIENT"
146
+ Id="NetFx40ClientRedist"
147
+ Vital="yes"
148
+ Permanent="yes"
149
+ Protocol="netfx4"
150
+ DownloadUrl="$(var.NetFx40ClientRedistLink)"
151
+ Compressed="no"
152
+ Name="redist\dotNetFx40_Client_x86_x64.exe">
153
+ <RemotePayload
154
+ Size="43000680"
155
+ Version="4.0.30319.1"
156
+ ProductName="Microsoft .NET Framework 4 Client Profile"
157
+ Description="Microsoft .NET Framework 4 Client Profile Setup"
158
+ CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
159
+ CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
160
+ Hash="4CD67F609F89D617D2B206341B8C211E1B88B287"/>
161
+ </ExePackage>
162
+ </PackageGroup>
163
+ </Fragment>
164
+
165
+ <!-- set to #1 if the .NET Framework 4.0 client is installed (not set otherwise) -->
166
+ <Fragment>
167
+ <Property Id="NETFRAMEWORK40CLIENT" Secure="yes">
168
+ <RegistrySearch Id="NetFramework40Client" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Install" Type="raw" />
169
+ </Property>
170
+ </Fragment>
171
+
172
+ <!-- Indicates the servicing level for the .NET Framework 4.0 client. -->
173
+ <Fragment>
174
+ <Property Id="NETFRAMEWORK40CLIENT_SERVICING_LEVEL" Secure="yes">
175
+ <RegistrySearch Id="NetFramework40ClientServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Servicing" Type="raw" />
176
+ </Property>
177
+ </Fragment>
178
+
179
+ <!-- Location of .NET Framework 4.0 client redistributable install root directory -->
180
+ <Fragment>
181
+ <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR" Secure="yes">
182
+ <RegistrySearch Id="NetFxInstallRootForNetfx40Client" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" />
183
+ </Property>
184
+ </Fragment>
185
+
186
+ <!-- Location of .NET Framework 4.0 client (64-bit) redistributable install root directory -->
187
+ <Fragment>
188
+ <Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR64" Secure="yes">
189
+ <RegistrySearch Id="NetFxInstallRootForNetfx40Client64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" Win64="yes" />
190
+ </Property>
191
+ </Fragment>
192
+
193
+ <!-- set to #1 if the .NET Framework 4.0 full is installed (not set otherwise) -->
194
+ <Fragment>
195
+ <Property Id="NETFRAMEWORK40FULL" Secure="yes">
196
+ <RegistrySearch Id="NetFramework40Full" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
197
+ </Property>
198
+ </Fragment>
199
+
200
+ <!-- Indicates the servicing level for the .NET Framework 4.0 full. -->
201
+ <Fragment>
202
+ <Property Id="NETFRAMEWORK40FULL_SERVICING_LEVEL" Secure="yes">
203
+ <RegistrySearch Id="NetFramework40FullServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Servicing" Type="raw" />
204
+ </Property>
205
+ </Fragment>
206
+
207
+ <!-- Location of .NET Framework 4.0 full redistributable install root directory -->
208
+ <Fragment>
209
+ <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR" Secure="yes">
210
+ <RegistrySearch Id="NetFxInstallRootForNetfx40Full" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" />
211
+ </Property>
212
+ </Fragment>
213
+
214
+ <!-- Location of .NET Framework 4.0 full (64-bit) redistributable install root directory -->
215
+ <Fragment>
216
+ <Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR64" Secure="yes">
217
+ <RegistrySearch Id="NetFxInstallRootForNetfx40Full64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" Win64="yes" />
218
+ </Property>
219
+ </Fragment>
220
+
221
+ <!-- set to #1 if the .NET Framework 4.0 Client Arabic language pack is installed (not set otherwise) -->
222
+ <Fragment>
223
+ <Property Id="NETFRAMEWORK40CLIENT_AR_SA_LANGPACK" Secure="yes">
224
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1025" Name="Install" Type="raw" />
225
+ </Property>
226
+ </Fragment>
227
+
228
+ <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Simplified) language pack is installed (not set otherwise) -->
229
+ <Fragment>
230
+ <Property Id="NETFRAMEWORK40CLIENT_ZH_CN_LANGPACK" Secure="yes">
231
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2052" Name="Install" Type="raw" />
232
+ </Property>
233
+ </Fragment>
234
+
235
+ <!-- set to #1 if the .NET Framework 4.0 Client Chinese (Traditional) language pack is installed (not set otherwise) -->
236
+ <Fragment>
237
+ <Property Id="NETFRAMEWORK40CLIENT_ZH_TW_LANGPACK" Secure="yes">
238
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1028" Name="Install" Type="raw" />
239
+ </Property>
240
+ </Fragment>
241
+
242
+ <!-- set to #1 if the .NET Framework 4.0 Client Czech language pack is installed (not set otherwise) -->
243
+ <Fragment>
244
+ <Property Id="NETFRAMEWORK40CLIENT_CS_CZ_LANGPACK" Secure="yes">
245
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1029" Name="Install" Type="raw" />
246
+ </Property>
247
+ </Fragment>
248
+
249
+ <!-- set to #1 if the .NET Framework 4.0 Client Danish language pack is installed (not set otherwise) -->
250
+ <Fragment>
251
+ <Property Id="NETFRAMEWORK40CLIENT_DA_DK_LANGPACK" Secure="yes">
252
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1030" Name="Install" Type="raw" />
253
+ </Property>
254
+ </Fragment>
255
+
256
+ <!-- set to #1 if the .NET Framework 4.0 Client Dutch language pack is installed (not set otherwise) -->
257
+ <Fragment>
258
+ <Property Id="NETFRAMEWORK40CLIENT_NL_NL_LANGPACK" Secure="yes">
259
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1043" Name="Install" Type="raw" />
260
+ </Property>
261
+ </Fragment>
262
+
263
+ <!-- set to #1 if the .NET Framework 4.0 Client Finnish language pack is installed (not set otherwise) -->
264
+ <Fragment>
265
+ <Property Id="NETFRAMEWORK40CLIENT_FI_FI_LANGPACK" Secure="yes">
266
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1035" Name="Install" Type="raw" />
267
+ </Property>
268
+ </Fragment>
269
+
270
+ <!-- set to #1 if the .NET Framework 4.0 Client French language pack is installed (not set otherwise) -->
271
+ <Fragment>
272
+ <Property Id="NETFRAMEWORK40CLIENT_FR_FR_LANGPACK" Secure="yes">
273
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1036" Name="Install" Type="raw" />
274
+ </Property>
275
+ </Fragment>
276
+
277
+ <!-- set to #1 if the .NET Framework 4.0 Client German language pack is installed (not set otherwise) -->
278
+ <Fragment>
279
+ <Property Id="NETFRAMEWORK40CLIENT_DE_DE_LANGPACK" Secure="yes">
280
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1031" Name="Install" Type="raw" />
281
+ </Property>
282
+ </Fragment>
283
+
284
+ <!-- set to #1 if the .NET Framework 4.0 Client Greek language pack is installed (not set otherwise) -->
285
+ <Fragment>
286
+ <Property Id="NETFRAMEWORK40CLIENT_EL_GR_LANGPACK" Secure="yes">
287
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1032" Name="Install" Type="raw" />
288
+ </Property>
289
+ </Fragment>
290
+
291
+ <!-- set to #1 if the .NET Framework 4.0 Client Hebrew language pack is installed (not set otherwise) -->
292
+ <Fragment>
293
+ <Property Id="NETFRAMEWORK40CLIENT_HE_IL_LANGPACK" Secure="yes">
294
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1037" Name="Install" Type="raw" />
295
+ </Property>
296
+ </Fragment>
297
+
298
+ <!-- set to #1 if the .NET Framework 4.0 Client Hungarian language pack is installed (not set otherwise) -->
299
+ <Fragment>
300
+ <Property Id="NETFRAMEWORK40CLIENT_HU_HU_LANGPACK" Secure="yes">
301
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1038" Name="Install" Type="raw" />
302
+ </Property>
303
+ </Fragment>
304
+
305
+ <!-- set to #1 if the .NET Framework 4.0 Client Italian language pack is installed (not set otherwise) -->
306
+ <Fragment>
307
+ <Property Id="NETFRAMEWORK40CLIENT_IT_IT_LANGPACK" Secure="yes">
308
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1040" Name="Install" Type="raw" />
309
+ </Property>
310
+ </Fragment>
311
+
312
+ <!-- set to #1 if the .NET Framework 4.0 Client Japanese language pack is installed (not set otherwise) -->
313
+ <Fragment>
314
+ <Property Id="NETFRAMEWORK40CLIENT_JA_JP_LANGPACK" Secure="yes">
315
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1041" Name="Install" Type="raw" />
316
+ </Property>
317
+ </Fragment>
318
+
319
+ <!-- set to #1 if the .NET Framework 4.0 Client Korean language pack is installed (not set otherwise) -->
320
+ <Fragment>
321
+ <Property Id="NETFRAMEWORK40CLIENT_KO_KR_LANGPACK" Secure="yes">
322
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1042" Name="Install" Type="raw" />
323
+ </Property>
324
+ </Fragment>
325
+
326
+ <!-- set to #1 if the .NET Framework 4.0 Client Norwegian language pack is installed (not set otherwise) -->
327
+ <Fragment>
328
+ <Property Id="NETFRAMEWORK40CLIENT_NB_NO_LANGPACK" Secure="yes">
329
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1044" Name="Install" Type="raw" />
330
+ </Property>
331
+ </Fragment>
332
+
333
+ <!-- set to #1 if the .NET Framework 4.0 Client Polish language pack is installed (not set otherwise) -->
334
+ <Fragment>
335
+ <Property Id="NETFRAMEWORK40CLIENT_PL_PL_LANGPACK" Secure="yes">
336
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1045" Name="Install" Type="raw" />
337
+ </Property>
338
+ </Fragment>
339
+
340
+ <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Brazil) language pack is installed (not set otherwise) -->
341
+ <Fragment>
342
+ <Property Id="NETFRAMEWORK40CLIENT_PT_BR_LANGPACK" Secure="yes">
343
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1046" Name="Install" Type="raw" />
344
+ </Property>
345
+ </Fragment>
346
+
347
+ <!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Portugal) language pack is installed (not set otherwise) -->
348
+ <Fragment>
349
+ <Property Id="NETFRAMEWORK40CLIENT_PT_PT_LANGPACK" Secure="yes">
350
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2070" Name="Install" Type="raw" />
351
+ </Property>
352
+ </Fragment>
353
+
354
+ <!-- set to #1 if the .NET Framework 4.0 Client Russian language pack is installed (not set otherwise) -->
355
+ <Fragment>
356
+ <Property Id="NETFRAMEWORK40CLIENT_RU_RU_LANGPACK" Secure="yes">
357
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1049" Name="Install" Type="raw" />
358
+ </Property>
359
+ </Fragment>
360
+
361
+ <!-- set to #1 if the .NET Framework 4.0 Client Spanish language pack is installed (not set otherwise) -->
362
+ <Fragment>
363
+ <Property Id="NETFRAMEWORK40CLIENT_ES_ES_LANGPACK" Secure="yes">
364
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\3082" Name="Install" Type="raw" />
365
+ </Property>
366
+ </Fragment>
367
+
368
+ <!-- set to #1 if the .NET Framework 4.0 Client Swedish language pack is installed (not set otherwise) -->
369
+ <Fragment>
370
+ <Property Id="NETFRAMEWORK40CLIENT_SV_SE_LANGPACK" Secure="yes">
371
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1053" Name="Install" Type="raw" />
372
+ </Property>
373
+ </Fragment>
374
+
375
+ <!-- set to #1 if the .NET Framework 4.0 Client Turkish language pack is installed (not set otherwise) -->
376
+ <Fragment>
377
+ <Property Id="NETFRAMEWORK40CLIENT_TR_TR_LANGPACK" Secure="yes">
378
+ <RegistrySearch Id="NETFRAMEWORK40CLIENTTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1055" Name="Install" Type="raw" />
379
+ </Property>
380
+ </Fragment>
381
+
382
+ <!-- set to #1 if the .NET Framework 4.0 Full Arabic language pack is installed (not set otherwise) -->
383
+ <Fragment>
384
+ <Property Id="NETFRAMEWORK40FULL_AR_SA_LANGPACK" Secure="yes">
385
+ <RegistrySearch Id="NETFRAMEWORK40FULLArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Install" Type="raw" />
386
+ </Property>
387
+ </Fragment>
388
+
389
+ <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Simplified) language pack is installed (not set otherwise) -->
390
+ <Fragment>
391
+ <Property Id="NETFRAMEWORK40FULL_ZH_CN_LANGPACK" Secure="yes">
392
+ <RegistrySearch Id="NETFRAMEWORK40FULLZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Install" Type="raw" />
393
+ </Property>
394
+ </Fragment>
395
+
396
+ <!-- set to #1 if the .NET Framework 4.0 Full Chinese (Traditional) language pack is installed (not set otherwise) -->
397
+ <Fragment>
398
+ <Property Id="NETFRAMEWORK40FULL_ZH_TW_LANGPACK" Secure="yes">
399
+ <RegistrySearch Id="NETFRAMEWORK40FULLZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Install" Type="raw" />
400
+ </Property>
401
+ </Fragment>
402
+
403
+ <!-- set to #1 if the .NET Framework 4.0 Full Czech language pack is installed (not set otherwise) -->
404
+ <Fragment>
405
+ <Property Id="NETFRAMEWORK40FULL_CS_CZ_LANGPACK" Secure="yes">
406
+ <RegistrySearch Id="NETFRAMEWORK40FULLCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Install" Type="raw" />
407
+ </Property>
408
+ </Fragment>
409
+
410
+ <!-- set to #1 if the .NET Framework 4.0 Full Danish language pack is installed (not set otherwise) -->
411
+ <Fragment>
412
+ <Property Id="NETFRAMEWORK40FULL_DA_DK_LANGPACK" Secure="yes">
413
+ <RegistrySearch Id="NETFRAMEWORK40FULLDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Install" Type="raw" />
414
+ </Property>
415
+ </Fragment>
416
+
417
+ <!-- set to #1 if the .NET Framework 4.0 Full Dutch language pack is installed (not set otherwise) -->
418
+ <Fragment>
419
+ <Property Id="NETFRAMEWORK40FULL_NL_NL_LANGPACK" Secure="yes">
420
+ <RegistrySearch Id="NETFRAMEWORK40FULLNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Install" Type="raw" />
421
+ </Property>
422
+ </Fragment>
423
+
424
+ <!-- set to #1 if the .NET Framework 4.0 Full Finnish language pack is installed (not set otherwise) -->
425
+ <Fragment>
426
+ <Property Id="NETFRAMEWORK40FULL_FI_FI_LANGPACK" Secure="yes">
427
+ <RegistrySearch Id="NETFRAMEWORK40FULLFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Install" Type="raw" />
428
+ </Property>
429
+ </Fragment>
430
+
431
+ <!-- set to #1 if the .NET Framework 4.0 Full French language pack is installed (not set otherwise) -->
432
+ <Fragment>
433
+ <Property Id="NETFRAMEWORK40FULL_FR_FR_LANGPACK" Secure="yes">
434
+ <RegistrySearch Id="NETFRAMEWORK40FULLFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Install" Type="raw" />
435
+ </Property>
436
+ </Fragment>
437
+
438
+ <!-- set to #1 if the .NET Framework 4.0 Full German language pack is installed (not set otherwise) -->
439
+ <Fragment>
440
+ <Property Id="NETFRAMEWORK40FULL_DE_DE_LANGPACK" Secure="yes">
441
+ <RegistrySearch Id="NETFRAMEWORK40FULLDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Install" Type="raw" />
442
+ </Property>
443
+ </Fragment>
444
+
445
+ <!-- set to #1 if the .NET Framework 4.0 Full Greek language pack is installed (not set otherwise) -->
446
+ <Fragment>
447
+ <Property Id="NETFRAMEWORK40FULL_EL_GR_LANGPACK" Secure="yes">
448
+ <RegistrySearch Id="NETFRAMEWORK40FULLElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Install" Type="raw" />
449
+ </Property>
450
+ </Fragment>
451
+
452
+ <!-- set to #1 if the .NET Framework 4.0 Full Hebrew language pack is installed (not set otherwise) -->
453
+ <Fragment>
454
+ <Property Id="NETFRAMEWORK40FULL_HE_IL_LANGPACK" Secure="yes">
455
+ <RegistrySearch Id="NETFRAMEWORK40FULLHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Install" Type="raw" />
456
+ </Property>
457
+ </Fragment>
458
+
459
+ <!-- set to #1 if the .NET Framework 4.0 Full Hungarian language pack is installed (not set otherwise) -->
460
+ <Fragment>
461
+ <Property Id="NETFRAMEWORK40FULL_HU_HU_LANGPACK" Secure="yes">
462
+ <RegistrySearch Id="NETFRAMEWORK40FULLHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Install" Type="raw" />
463
+ </Property>
464
+ </Fragment>
465
+
466
+ <!-- set to #1 if the .NET Framework 4.0 Full Italian language pack is installed (not set otherwise) -->
467
+ <Fragment>
468
+ <Property Id="NETFRAMEWORK40FULL_IT_IT_LANGPACK" Secure="yes">
469
+ <RegistrySearch Id="NETFRAMEWORK40FULLItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Install" Type="raw" />
470
+ </Property>
471
+ </Fragment>
472
+
473
+ <!-- set to #1 if the .NET Framework 4.0 Full Japanese language pack is installed (not set otherwise) -->
474
+ <Fragment>
475
+ <Property Id="NETFRAMEWORK40FULL_JA_JP_LANGPACK" Secure="yes">
476
+ <RegistrySearch Id="NETFRAMEWORK40FULLJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Install" Type="raw" />
477
+ </Property>
478
+ </Fragment>
479
+
480
+ <!-- set to #1 if the .NET Framework 4.0 Full Korean language pack is installed (not set otherwise) -->
481
+ <Fragment>
482
+ <Property Id="NETFRAMEWORK40FULL_KO_KR_LANGPACK" Secure="yes">
483
+ <RegistrySearch Id="NETFRAMEWORK40FULLKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Install" Type="raw" />
484
+ </Property>
485
+ </Fragment>
486
+
487
+ <!-- set to #1 if the .NET Framework 4.0 Full Norwegian language pack is installed (not set otherwise) -->
488
+ <Fragment>
489
+ <Property Id="NETFRAMEWORK40FULL_NB_NO_LANGPACK" Secure="yes">
490
+ <RegistrySearch Id="NETFRAMEWORK40FULLNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Install" Type="raw" />
491
+ </Property>
492
+ </Fragment>
493
+
494
+ <!-- set to #1 if the .NET Framework 4.0 Full Polish language pack is installed (not set otherwise) -->
495
+ <Fragment>
496
+ <Property Id="NETFRAMEWORK40FULL_PL_PL_LANGPACK" Secure="yes">
497
+ <RegistrySearch Id="NETFRAMEWORK40FULLPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Install" Type="raw" />
498
+ </Property>
499
+ </Fragment>
500
+
501
+ <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Brazil) language pack is installed (not set otherwise) -->
502
+ <Fragment>
503
+ <Property Id="NETFRAMEWORK40FULL_PT_BR_LANGPACK" Secure="yes">
504
+ <RegistrySearch Id="NETFRAMEWORK40FULLPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Install" Type="raw" />
505
+ </Property>
506
+ </Fragment>
507
+
508
+ <!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Portugal) language pack is installed (not set otherwise) -->
509
+ <Fragment>
510
+ <Property Id="NETFRAMEWORK40FULL_PT_PT_LANGPACK" Secure="yes">
511
+ <RegistrySearch Id="NETFRAMEWORK40FULLPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Install" Type="raw" />
512
+ </Property>
513
+ </Fragment>
514
+
515
+ <!-- set to #1 if the .NET Framework 4.0 Full Russian language pack is installed (not set otherwise) -->
516
+ <Fragment>
517
+ <Property Id="NETFRAMEWORK40FULL_RU_RU_LANGPACK" Secure="yes">
518
+ <RegistrySearch Id="NETFRAMEWORK40FULLRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Install" Type="raw" />
519
+ </Property>
520
+ </Fragment>
521
+
522
+ <!-- set to #1 if the .NET Framework 4.0 Full Spanish language pack is installed (not set otherwise) -->
523
+ <Fragment>
524
+ <Property Id="NETFRAMEWORK40FULL_ES_ES_LANGPACK" Secure="yes">
525
+ <RegistrySearch Id="NETFRAMEWORK40FULLEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Install" Type="raw" />
526
+ </Property>
527
+ </Fragment>
528
+
529
+ <!-- set to #1 if the .NET Framework 4.0 Full Swedish language pack is installed (not set otherwise) -->
530
+ <Fragment>
531
+ <Property Id="NETFRAMEWORK40FULL_SV_SE_LANGPACK" Secure="yes">
532
+ <RegistrySearch Id="NETFRAMEWORK40FULLSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Install" Type="raw" />
533
+ </Property>
534
+ </Fragment>
535
+
536
+ <!-- set to #1 if the .NET Framework 4.0 Full Turkish language pack is installed (not set otherwise) -->
537
+ <Fragment>
538
+ <Property Id="NETFRAMEWORK40FULL_TR_TR_LANGPACK" Secure="yes">
539
+ <RegistrySearch Id="NETFRAMEWORK40FULLTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Install" Type="raw" />
540
+ </Property>
541
+ </Fragment>
542
+
543
+</Wix>
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 >= $(var.NetFx451MinRelease)" Overridable="yes" />
31
+ <WixVariable Id="NetFx451WebInstallCondition" Value="" Overridable="yes" />
32
+ <WixVariable Id="NetFx451WebPackageDirectory" Value="redist\" Overridable="yes" />
33
+
34
+ <PackageGroup Id="NetFx451Web">
35
+ <ExePackage
36
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html""
37
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html""
38
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullWebLog].html""
39
+ PerMachine="yes"
40
+ DetectCondition="!(wix.NetFx451WebDetectCondition)"
41
+ InstallCondition="!(wix.NetFx451WebInstallCondition)"
42
+ Id="NetFx451Web"
43
+ Vital="yes"
44
+ Permanent="yes"
45
+ Protocol="netfx4"
46
+ DownloadUrl="$(var.NetFx451WebLink)"
47
+ LogPathVariable="NetFx451FullWebLog"
48
+ Compressed="no"
49
+ Name="!(wix.NetFx451WebPackageDirectory)NDP451-KB2859818-Web.exe">
50
+ <RemotePayload
51
+ Size="1021432"
52
+ Version="4.5.50938.18408"
53
+ ProductName="Microsoft .NET Framework 4.5.1"
54
+ Description="Microsoft .NET Framework 4.5.1 Setup"
55
+ CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41"
56
+ CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE"
57
+ Hash="4CBEA1E408DB5B423E130931B9478972E6798431" />
58
+ </ExePackage>
59
+ </PackageGroup>
60
+ </Fragment>
61
+
62
+ <Fragment>
63
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
64
+
65
+ <WixVariable Id="NetFx451RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx451MinRelease)" Overridable="yes" />
66
+ <WixVariable Id="NetFx451RedistInstallCondition" Value="" Overridable="yes" />
67
+ <WixVariable Id="NetFx451RedistPackageDirectory" Value="redist\" Overridable="yes" />
68
+
69
+ <PackageGroup Id="NetFx451Redist">
70
+ <ExePackage
71
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html""
72
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html""
73
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx451FullLog].html""
74
+ PerMachine="yes"
75
+ DetectCondition="!(wix.NetFx451RedistDetectCondition)"
76
+ InstallCondition="!(wix.NetFx451RedistInstallCondition)"
77
+ Id="NetFx451Redist"
78
+ Vital="yes"
79
+ Permanent="yes"
80
+ Protocol="netfx4"
81
+ DownloadUrl="$(var.NetFx451RedistLink)"
82
+ LogPathVariable="NetFx451FullLog"
83
+ Compressed="no"
84
+ Name="!(wix.NetFx451RedistPackageDirectory)NDP451-KB2858728-x86-x64-AllOS-ENU.exe">
85
+ <RemotePayload
86
+ Size="70087104"
87
+ Version="4.5.50938.18408"
88
+ ProductName="Microsoft .NET Framework 4.5.1"
89
+ Description="Microsoft .NET Framework 4.5.1 Setup"
90
+ CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41"
91
+ CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE"
92
+ Hash="5934DD101414BBC0B7F1EE2780D2FC8B9BEC5C4D" />
93
+ </ExePackage>
94
+ </PackageGroup>
95
+ </Fragment>
96
+</Wix>
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 >= $(var.NetFx452MinRelease)" Overridable="yes" />
31
+ <WixVariable Id="NetFx452WebInstallCondition" Value="" Overridable="yes" />
32
+ <WixVariable Id="NetFx452WebPackageDirectory" Value="redist\" Overridable="yes" />
33
+
34
+ <PackageGroup Id="NetFx452Web">
35
+ <ExePackage
36
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html""
37
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html""
38
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullWebLog].html""
39
+ PerMachine="yes"
40
+ DetectCondition="!(wix.NetFx452WebDetectCondition)"
41
+ InstallCondition="!(wix.NetFx452WebInstallCondition)"
42
+ Id="NetFx452Web"
43
+ Vital="yes"
44
+ Permanent="yes"
45
+ Protocol="netfx4"
46
+ DownloadUrl="$(var.NetFx452WebLink)"
47
+ LogPathVariable="NetFx452FullWebLog"
48
+ Compressed="no"
49
+ Name="!(wix.NetFx452WebPackageDirectory)NDP452-KB2901954-Web.exe">
50
+ <RemotePayload CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0"
51
+ CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080"
52
+ Description="Microsoft .NET Framework 4.5.2 Setup"
53
+ Hash="5B71B20A455F6EEAB79DD1EDCAB0BA66AD0D2208"
54
+ ProductName="Microsoft .NET Framework 4.5.2"
55
+ Size="1118920"
56
+ Version="4.5.51209.34209" />
57
+ </ExePackage>
58
+ </PackageGroup>
59
+ </Fragment>
60
+
61
+ <Fragment>
62
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
63
+
64
+ <WixVariable Id="NetFx452RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx452MinRelease)" Overridable="yes" />
65
+ <WixVariable Id="NetFx452RedistInstallCondition" Value="" Overridable="yes" />
66
+ <WixVariable Id="NetFx452RedistPackageDirectory" Value="redist\" Overridable="yes" />
67
+
68
+ <PackageGroup Id="NetFx452Redist">
69
+ <ExePackage
70
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html""
71
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html""
72
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx452FullLog].html""
73
+ PerMachine="yes"
74
+ DetectCondition="!(wix.NetFx452RedistDetectCondition)"
75
+ InstallCondition="!(wix.NetFx452RedistInstallCondition)"
76
+ Id="NetFx452Redist"
77
+ Vital="yes"
78
+ Permanent="yes"
79
+ Protocol="netfx4"
80
+ DownloadUrl="$(var.NetFx452RedistLink)"
81
+ LogPathVariable="NetFx452FullLog"
82
+ Compressed="no"
83
+ Name="!(wix.NetFx452RedistPackageDirectory)NDP452-KB2901907-x86-x64-AllOS-ENU.exe">
84
+ <RemotePayload
85
+ CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0"
86
+ CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080"
87
+ Description="Microsoft .NET Framework 4.5.2 Setup"
88
+ Hash="89F86F9522DC7A8A965FACCE839ABB790A285A63"
89
+ ProductName="Microsoft .NET Framework 4.5.2"
90
+ Size="69999448"
91
+ Version="4.5.51209.34209" />
92
+ </ExePackage>
93
+ </PackageGroup>
94
+ </Fragment>
95
+</Wix>
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 >= $(var.NetFx46MinRelease)" Overridable="yes" />
31
+ <WixVariable Id="NetFx46WebInstallCondition" Value="" Overridable="yes" />
32
+ <WixVariable Id="NetFx46WebPackageDirectory" Value="redist\" Overridable="yes" />
33
+
34
+ <PackageGroup Id="NetFx46Web">
35
+ <ExePackage
36
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
37
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
38
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
39
+ PerMachine="yes"
40
+ DetectCondition="!(wix.NetFx46WebDetectCondition)"
41
+ InstallCondition="!(wix.NetFx46WebInstallCondition)"
42
+ Id="NetFx46Web"
43
+ Vital="yes"
44
+ Permanent="yes"
45
+ Protocol="netfx4"
46
+ DownloadUrl="$(var.NetFx46WebLink)"
47
+ LogPathVariable="NetFx46FullLog"
48
+ Compressed="no"
49
+ Name="!(wix.NetFx46WebPackageDirectory)NDP46-KB3045560-Web.exe">
50
+ <RemotePayload
51
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
52
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
53
+ Description="Microsoft .NET Framework 4.6 Setup"
54
+ Hash="480CA134B9E3F2437DF10719D5A8C77DDEC0A4F1"
55
+ ProductName="Microsoft .NET Framework 4.6"
56
+ Size="1497400"
57
+ Version="4.6.81.0" />
58
+ </ExePackage>
59
+ </PackageGroup>
60
+ </Fragment>
61
+
62
+ <Fragment>
63
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
64
+
65
+ <WixVariable Id="NetFx46RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx46MinRelease)" Overridable="yes" />
66
+ <WixVariable Id="NetFx46RedistInstallCondition" Value="" Overridable="yes" />
67
+ <WixVariable Id="NetFx46RedistPackageDirectory" Value="redist\" Overridable="yes" />
68
+
69
+ <PackageGroup Id="NetFx46Redist">
70
+ <ExePackage
71
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
72
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
73
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx46FullLog].html""
74
+ PerMachine="yes"
75
+ DetectCondition="!(wix.NetFx46RedistDetectCondition)"
76
+ InstallCondition="!(wix.NetFx46RedistInstallCondition)"
77
+ Id="NetFx46Redist"
78
+ Vital="yes"
79
+ Permanent="yes"
80
+ Protocol="netfx4"
81
+ DownloadUrl="$(var.NetFx46RedistLink)"
82
+ LogPathVariable="NetFx46FullLog"
83
+ Compressed="no"
84
+ Name="!(wix.NetFx46RedistPackageDirectory)NDP46-KB3045557-x86-x64-AllOS-ENU.exe">
85
+ <RemotePayload
86
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
87
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
88
+ Description="Microsoft .NET Framework 4.6 Setup"
89
+ Hash="3049A85843EAF65E89E2336D5FE6E85E416797BE"
90
+ ProductName="Microsoft .NET Framework 4.6"
91
+ Size="65444688"
92
+ Version="4.6.81.0" />
93
+ </ExePackage>
94
+ </PackageGroup>
95
+ </Fragment>
96
+</Wix>
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 >= $(var.NetFx461MinRelease)" Overridable="yes" />
30
+ <WixVariable Id="NetFx461WebInstallCondition" Value="" Overridable="yes" />
31
+ <WixVariable Id="NetFx461WebPackageDirectory" Value="redist\" Overridable="yes" />
32
+
33
+ <PackageGroup Id="NetFx461Web">
34
+ <ExePackage
35
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
36
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
37
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
38
+ PerMachine="yes"
39
+ DetectCondition="!(wix.NetFx461WebDetectCondition)"
40
+ InstallCondition="!(wix.NetFx461WebInstallCondition)"
41
+ Id="NetFx461Web"
42
+ Vital="yes"
43
+ Permanent="yes"
44
+ Protocol="netfx4"
45
+ DownloadUrl="$(var.NetFx461WebLink)"
46
+ LogPathVariable="NetFx461FullLog"
47
+ Compressed="no"
48
+ Name="!(wix.NetFx461WebPackageDirectory)NDP461-KB3102438-Web.exe">
49
+ <RemotePayload
50
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
51
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
52
+ Description="Microsoft .NET Framework 4.6.1 Setup"
53
+ Hash="EE88B05232F43B517D4A368F7EE5065CDE7F67FA"
54
+ ProductName="Microsoft .NET Framework 4.6.1"
55
+ Size="1424328"
56
+ Version="4.6.1055.0" />
57
+ </ExePackage>
58
+ </PackageGroup>
59
+ </Fragment>
60
+
61
+ <Fragment>
62
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
63
+
64
+ <WixVariable Id="NetFx461RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx461MinRelease)" Overridable="yes" />
65
+ <WixVariable Id="NetFx461RedistInstallCondition" Value="" Overridable="yes" />
66
+ <WixVariable Id="NetFx461RedistPackageDirectory" Value="redist\" Overridable="yes" />
67
+
68
+ <PackageGroup Id="NetFx461Redist">
69
+ <ExePackage
70
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
71
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
72
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx461FullLog].html""
73
+ PerMachine="yes"
74
+ DetectCondition="!(wix.NetFx461RedistDetectCondition)"
75
+ InstallCondition="!(wix.NetFx461RedistInstallCondition)"
76
+ Id="NetFx461Redist"
77
+ Vital="yes"
78
+ Permanent="yes"
79
+ Protocol="netfx4"
80
+ DownloadUrl="$(var.NetFx461RedistLink)"
81
+ LogPathVariable="NetFx461FullLog"
82
+ Compressed="no"
83
+ Name="!(wix.NetFx461RedistPackageDirectory)NDP461-KB3102436-x86-x64-AllOS-ENU.exe">
84
+ <RemotePayload
85
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
86
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
87
+ Description="Microsoft .NET Framework 4.6.1 Setup"
88
+ Hash="83D048D171FF44A3CAD9B422137656F585295866"
89
+ ProductName="Microsoft .NET Framework 4.6.1"
90
+ Size="67681000"
91
+ Version="4.6.1055.0" />
92
+ </ExePackage>
93
+ </PackageGroup>
94
+ </Fragment>
95
+</Wix>
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 >= $(var.NetFx462MinRelease)" Overridable="yes" />
30
+ <WixVariable Id="NetFx462WebInstallCondition" Value="" Overridable="yes" />
31
+ <WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" />
32
+
33
+ <PackageGroup Id="NetFx462Web">
34
+ <ExePackage
35
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
36
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
37
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
38
+ PerMachine="yes"
39
+ DetectCondition="!(wix.NetFx462WebDetectCondition)"
40
+ InstallCondition="!(wix.NetFx462WebInstallCondition)"
41
+ Id="NetFx462Web"
42
+ Vital="yes"
43
+ Permanent="yes"
44
+ Protocol="netfx4"
45
+ DownloadUrl="$(var.NetFx462WebLink)"
46
+ LogPathVariable="NetFx462FullLog"
47
+ Compressed="no"
48
+ Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe">
49
+ <RemotePayload
50
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
51
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
52
+ Description="Microsoft .NET Framework 4.6.2 Setup"
53
+ Hash="C42E6ED280290648BBD59F664008852F4CFE4548"
54
+ ProductName="Microsoft .NET Framework 4.6.2"
55
+ Size="1429344"
56
+ Version="4.6.1590.0" />
57
+ </ExePackage>
58
+ </PackageGroup>
59
+ </Fragment>
60
+
61
+ <Fragment>
62
+ <util:RegistrySearchRef Id="NETFRAMEWORK45"/>
63
+
64
+ <WixVariable Id="NetFx462RedistDetectCondition" Value="NETFRAMEWORK45 >= $(var.NetFx462MinRelease)" Overridable="yes" />
65
+ <WixVariable Id="NetFx462RedistInstallCondition" Value="" Overridable="yes" />
66
+ <WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" />
67
+
68
+ <PackageGroup Id="NetFx462Redist">
69
+ <ExePackage
70
+ InstallCommand="/q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
71
+ RepairCommand="/q /norestart /repair /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
72
+ UninstallCommand="/uninstall /q /norestart /ChainingPackage "[WixBundleName]" /log "[NetFx462FullLog].html""
73
+ PerMachine="yes"
74
+ DetectCondition="!(wix.NetFx462RedistDetectCondition)"
75
+ InstallCondition="!(wix.NetFx462RedistInstallCondition)"
76
+ Id="NetFx462Redist"
77
+ Vital="yes"
78
+ Permanent="yes"
79
+ Protocol="netfx4"
80
+ DownloadUrl="$(var.NetFx462RedistLink)"
81
+ LogPathVariable="NetFx462FullLog"
82
+ Compressed="no"
83
+ Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe">
84
+ <RemotePayload
85
+ CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
86
+ CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
87
+ Description="Microsoft .NET Framework 4.6.2 Setup"
88
+ Hash="A70F856BDA33D45AD0A8AD035F73092441715431"
89
+ ProductName="Microsoft .NET Framework 4.6.2"
90
+ Size="62008080"
91
+ Version="4.6.1590.0" />
92
+ </ExePackage>
93
+ </PackageGroup>
94
+ </Fragment>
95
+</Wix>
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 <> 1</Custom>
18
+ <Custom Action="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom>
19
+ <Custom Action="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled <> 1</Custom>
20
+ <Custom Action="NetFxExecuteNativeImageInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom>
21
+ </InstallExecuteSequence>
22
+ </Fragment>
23
+
24
+ <!-- NetFx Custom Action DLL Definitions -->
25
+ <Fragment>
26
+ <Binary Id="NetFxCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))netfxca.dll" />
27
+ </Fragment>
28
+</Include>
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
+}