This commit is contained in:
Rob Mensching 2018-01-01 10:30:42 -08:00
Родитель 9c66865ab3
Коммит 60d7baefb4
49 изменённых файлов: 4391 добавлений и 0 удалений

59
NetFx.wixext.sln Normal file
Просмотреть файл

@ -0,0 +1,59 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 15.0.26124.0
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "netfxca", "src\ca\netfxca.vcxproj", "{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}"
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "netfx", "src\wixlib\netfx.wixproj", "{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WixToolset.Netfx.wixext", "src\wixext\WixToolset.Netfx.wixext.csproj", "{F774E291-0563-4DDD-B873-F5C31683CF4B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|Any CPU.ActiveCfg = Debug|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x64.ActiveCfg = Debug|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.ActiveCfg = Debug|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Debug|x86.Build.0 = Debug|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|Any CPU.ActiveCfg = Release|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x64.ActiveCfg = Release|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.ActiveCfg = Release|Win32
{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}.Release|x86.Build.0 = Release|Win32
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|x86
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x64.ActiveCfg = Debug|x64
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x64.Build.0 = Debug|x64
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.ActiveCfg = Debug|x86
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Debug|x86.Build.0 = Debug|x86
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|Any CPU.ActiveCfg = Release|x86
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x64.ActiveCfg = Release|x64
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x64.Build.0 = Release|x64
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.ActiveCfg = Release|x86
{45E4A6AC-3190-4E17-83F0-9935FFA5DC2B}.Release|x86.Build.0 = Release|x86
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.ActiveCfg = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x64.Build.0 = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.ActiveCfg = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Debug|x86.Build.0 = Debug|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|Any CPU.Build.0 = Release|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.ActiveCfg = Release|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x64.Build.0 = Release|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.ActiveCfg = Release|Any CPU
{F774E291-0563-4DDD-B873-F5C31683CF4B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E4566A6B-47D0-4EA0-989A-D763AC39105D}
EndGlobalSection
EndGlobal

13
appveyor.cmd Normal file
Просмотреть файл

@ -0,0 +1,13 @@
@setlocal
@pushd %~dp0
nuget restore
msbuild -p:Configuration=Release -t:Restore
msbuild -p:Configuration=Release src\test\WixToolsetTest.NetFx\WixToolsetTest.NetFx.csproj
msbuild -p:Configuration=Release -t:Pack src\wixext\WixToolset.NetFx.wixext.csproj
@popd
@endlocal

29
appveyor.yml Normal file
Просмотреть файл

@ -0,0 +1,29 @@
image: Visual Studio 2017
version: 0.0.0.{build}
configuration: Release
environment:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: 1
NUGET_XMLDOC_MODE: skip
build_script:
- appveyor.cmd
pull_requests:
do_not_increment_build_number: true
nuget:
disable_publish_on_pr: true
skip_tags: true
artifacts:
- path: build\Release\**\*.nupkg
name: nuget
notifications:
- provider: Slack
incoming_webhook:
secure: p5xuu+4x2JHfwGDMDe5KcG1k7gZxqYc4jWVwvyNZv5cvkubPD2waJs5yXMAXZNN7Z63/3PWHb7q4KoY/99AjauYa1nZ4c5qYqRPFRBKTHfA=

16
nuget.config Normal file
Просмотреть файл

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="wixtoolset-data" value="https://ci.appveyor.com/nuget/wixtoolset-data" />
<add key="wixtoolset-extensibility" value="https://ci.appveyor.com/nuget/wixtoolset-extensibility" />
<add key="wixtoolset-core" value="https://ci.appveyor.com/nuget/wixtoolset-core" />
<add key="wixtoolset-core-native" value="https://ci.appveyor.com/nuget/wixtoolset-core-native" />
<add key="wixtoolset-dtf" value="https://ci.appveyor.com/nuget/wixtoolset-dtf" />
<add key="wixtoolset-dutil" value="https://ci.appveyor.com/nuget/wixtoolset-dutil" />
<add key="wixtoolset-wcautil" value="https://ci.appveyor.com/nuget/wixtoolset-wcautil" />
<add key="wixtoolset-util-wixext" value="https://ci.appveyor.com/nuget/wixtoolset-util-wixext" />
<add key="wixbuildtools" value="https://ci.appveyor.com/nuget/wixbuildtools" />
<add key="api.nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
</configuration>

101
src/Cpp.Build.props Normal file
Просмотреть файл

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project>
<PropertyGroup>
<Platform Condition=" '$(Platform)' == 'AnyCPU' ">Win32</Platform>
<BaseOutputPath>$(OutputPath)</BaseOutputPath>
<IntDir>$(BaseIntermediateOutputPath)$(Platform)\</IntDir>
<OutDir>$(OutputPath)$(Platform)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<DisableSpecificWarnings>$(DisableSpecificCompilerWarnings)</DisableSpecificWarnings>
<WarningLevel>Level4</WarningLevel>
<AdditionalIncludeDirectories>$(ProjectDir)inc;$(MSBuildProjectDirectory);$(IntDir);$(SqlCESdkIncludePath);$(ProjectAdditionalIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_WINDOWS;_WIN32_MSI=500;_WIN32_WINNT=0x0501;$(ArmPreprocessorDefinitions);$(UnicodePreprocessorDefinitions);_CRT_STDIO_LEGACY_WIDE_SPECIFIERS;_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>precomp.h</PrecompiledHeaderFile>
<CallingConvention>StdCall</CallingConvention>
<TreatWarningAsError>true</TreatWarningAsError>
<ExceptionHandling>false</ExceptionHandling>
<AdditionalOptions>-YlprecompDefine</AdditionalOptions>
<AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<MultiProcessorCompilation Condition=" $(NUMBER_OF_PROCESSORS) &gt; 4 ">true</MultiProcessorCompilation>
</ClCompile>
<ResourceCompile>
<PreprocessorDefinitions>$(ArmPreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(ProjectAdditionalResourceIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Lib>
<AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ProjectAdditionalLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Lib>
<Link>
<SubSystem>$(ProjectSubSystem)</SubSystem>
<ModuleDefinitionFile>$(ProjectModuleDefinitionFile)</ModuleDefinitionFile>
<NoEntryPoint>$(ResourceOnlyDll)</NoEntryPoint>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(ProjectAdditionalLinkLibraries);advapi32.lib;comdlg32.lib;user32.lib;oleaut32.lib;gdi32.lib;shell32.lib;ole32.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(OutDir);$(AdditionalMultiTargetLibraryPath);$(ArmLibraryDirectories);$(ProjectAdditionalLinkLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalOptions Condition=" $(PlatformToolset.StartsWith('v14')) ">/IGNORE:4099 %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Platform)'=='Win32' and '$(PlatformToolset)'!='v100'">
<ClCompile>
<EnableEnhancedInstructionSet>NoExtensions</EnableEnhancedInstructionSet>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Platform)'=='arm' ">
<ClCompile>
<CallingConvention>CDecl</CallingConvention>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(ConfigurationType)'=='StaticLibrary' ">
<ClCompile>
<DebugInformationFormat>OldStyle</DebugInformationFormat>
<OmitDefaultLibName>true</OmitDefaultLibName>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' ">
<ClCompile>
<Optimization>Disabled</Optimization>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<PreprocessorDefinitions>_DEBUG;DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Configuration)'=='Debug' and '$(CLRSupport)'=='true' ">
<ClCompile>
<BasicRuntimeChecks></BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDll</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' ">
<ClCompile>
<Optimization>MinSpace</Optimization>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(Configuration)'=='Release' and '$(CLRSupport)'=='true' ">
<ClCompile>
<BasicRuntimeChecks></BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDll</RuntimeLibrary>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition=" '$(CLRSupport)'=='true' ">
<Link>
<KeyFile>$(LinkKeyFile)</KeyFile>
<DelaySign>$(LinkDelaySign)</DelaySign>
</Link>
</ItemDefinitionGroup>
</Project>

22
src/Directory.Build.props Normal file
Просмотреть файл

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<BaseIntermediateOutputPath>$(MSBuildThisFileDirectory)..\build\obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
<OutputPath>$(MSBuildThisFileDirectory)..\build\$(Configuration)\</OutputPath>
<Authors>WiX Toolset Team</Authors>
<Company>WiX Toolset</Company>
<Copyright>Copyright (c) .NET Foundation and contributors. All rights reserved.</Copyright>
</PropertyGroup>
<PropertyGroup>
<WixToolsetRootFolder>$(MSBuildThisFileDirectory)..\..\</WixToolsetRootFolder>
</PropertyGroup>
<Import Project="Cpp.Build.props" Condition=" '$(MSBuildProjectExtension)'=='.vcxproj' " />
<Import Project="Custom.Build.props" Condition=" Exists('Custom.Build.props') " />
</Project>

10
src/FindLocalWix.props Normal file
Просмотреть файл

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WixTargetsPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Core\README.md') ">$(MSBuildThisFileDirectory)..\..\Core\build\Debug\net461\wix.targets</WixTargetsPath>
<WixToolsetUtilWixextPath Condition=" '$(Configuration)' != 'Release' And Exists('$(MSBuildThisFileDirectory)..\..\Util.wixext\README.md') ">$(MSBuildThisFileDirectory)..\..\Util.wixext\build\Debug\netstandard2.0\WixToolset.Util.wixext.dll</WixToolsetUtilWixextPath>
</PropertyGroup>
</Project>

7
src/ca/cost.h Normal file
Просмотреть файл

@ -0,0 +1,7 @@
#pragma once
// 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.
const UINT COST_NGEN_BLOCKING = 5000;
const UINT COST_NGEN_NONBLOCKING = 500;

26
src/ca/dllmain.cpp Normal file
Просмотреть файл

@ -0,0 +1,26 @@
// 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.
#include "precomp.h"
/********************************************************************
DllMain - standard entry point for all WiX CustomActions
********************************************************************/
extern "C" BOOL WINAPI DllMain(
IN HINSTANCE hInst,
IN ULONG ulReason,
IN LPVOID)
{
switch(ulReason)
{
case DLL_PROCESS_ATTACH:
WcaGlobalInitialize(hInst);
break;
case DLL_PROCESS_DETACH:
WcaGlobalFinalize();
break;
}
return TRUE;
}

823
src/ca/netfxca.cpp Normal file
Просмотреть файл

@ -0,0 +1,823 @@
// 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.
#include "precomp.h"
#define NGEN_DEBUG 0x0001
#define NGEN_NODEP 0x0002
#define NGEN_PROFILE 0x0004
#define NGEN_32BIT 0x0008
#define NGEN_64BIT 0x0010
#define NGEN_TIMEOUT 60000 // 60 seconds
// If you change one of these strings, be sure to change the appropriate EmptyFormattedLength variable right below
LPCWSTR vpwzUnformattedQuotedFile = L"\"[#%s]\"";
LPCWSTR vpwzUnformattedQuotedDirectory = L"\"[%s]\\\"";
// These represent the length of the above strings in the case that the property resolves to an empty string
const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_FILE = 2;
const DWORD EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY = 3;
LPCWSTR vcsFileId =
L"SELECT `File` FROM `File` WHERE `File`=?";
enum eFileId { fiFile = 1 };
LPCWSTR vcsNgenQuery =
L"SELECT `NetFxNativeImage`.`File_`, `NetFxNativeImage`.`NetFxNativeImage`, `NetFxNativeImage`.`Priority`, `NetFxNativeImage`.`Attributes`, `NetFxNativeImage`.`File_Application`, `NetFxNativeImage`.`Directory_ApplicationBase`, `File`.`Component_` "
L"FROM `NetFxNativeImage`, `File` WHERE `File`.`File`=`NetFxNativeImage`.`File_`";
enum eNgenQuery { ngqFile = 1, ngqId, ngqPriority, ngqAttributes, ngqFileApp, ngqDirAppBase, ngqComponent };
LPCWSTR vcsNgenGac =
L"SELECT `MsiAssembly`.`File_Application` "
L"FROM `File`, `MsiAssembly` WHERE `File`.`Component_`=`MsiAssembly`.`Component_` AND `File`.`File`=?";
enum eNgenGac { nggApplication = 1 };
LPCWSTR vcsNgenStrongName =
L"SELECT `Name`,`Value` FROM `MsiAssemblyName` WHERE `Component_`=?";
enum eNgenStrongName { ngsnName = 1, ngsnValue };
// Searches subdirectories of the given path for the highest version of ngen.exe available
static HRESULT GetNgenVersion(
__in LPWSTR pwzParentPath,
__out LPWSTR* ppwzVersion
)
{
Assert(pwzParentPath);
HRESULT hr = S_OK;
DWORD dwError = 0;
DWORD dwNgenFileFlags = 0;
LPWSTR pwzVersionSearch = NULL;
LPWSTR pwzNgen = NULL;
LPWSTR pwzTemp = NULL;
LPWSTR pwzTempVersion = NULL;
DWORD dwMaxMajorVersion = 0; // This stores the highest major version we've seen so far
DWORD dwMaxMinorVersion = 0; // This stores the minor version of the highest major version we've seen so far
DWORD dwMajorVersion = 0; // This stores the major version of the directory we're currently considering
DWORD dwMinorVersion = 0; // This stores the minor version of the directory we're currently considering
BOOL fFound = TRUE;
WIN32_FIND_DATAW wfdVersionDirectories;
HANDLE hFind = INVALID_HANDLE_VALUE;
hr = StrAllocFormatted(&pwzVersionSearch, L"%s*", pwzParentPath);
ExitOnFailure(hr, "failed to create outer directory search string from string %ls", pwzParentPath);
hFind = FindFirstFileW(pwzVersionSearch, &wfdVersionDirectories);
if (hFind == INVALID_HANDLE_VALUE)
{
ExitWithLastError(hr, "failed to call FindFirstFileW with string %ls", pwzVersionSearch);
}
while (fFound)
{
pwzTempVersion = (LPWSTR)&(wfdVersionDirectories.cFileName);
// Explicitly exclude v1.1.4322, which isn't backwards compatible and is not supported
if (wfdVersionDirectories.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (0 != lstrcmpW(L"v1.1.4322", pwzTempVersion))
{
// A potential candidate directory was found to run ngen from - let's make sure ngen actually exists here
hr = StrAllocFormatted(&pwzNgen, L"%s%s\\ngen.exe", pwzParentPath, pwzTempVersion);
ExitOnFailure(hr, "failed to create inner ngen search string with strings %ls and %ls", pwzParentPath, pwzTempVersion);
// If Ngen.exe does exist as a file here, then let's check the file version
if (FileExistsEx(pwzNgen, &dwNgenFileFlags) && (0 == (dwNgenFileFlags & FILE_ATTRIBUTE_DIRECTORY)))
{
hr = FileVersion(pwzNgen, &dwMajorVersion, &dwMinorVersion);
if (FAILED(hr))
{
WcaLog(LOGMSG_VERBOSE, "Failed to get version of %ls - continuing", pwzNgen);
}
else if (dwMajorVersion > dwMaxMajorVersion || (dwMajorVersion == dwMaxMajorVersion && dwMinorVersion > dwMaxMinorVersion))
{
// 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
hr = StrAllocString(ppwzVersion, pwzTempVersion, 0);
ExitOnFailure(hr, "failed to copy temp version string %ls to version string", pwzTempVersion);
// Add one for the backslash after the directory name
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));
dwMaxMajorVersion = dwMajorVersion;
dwMaxMinorVersion = dwMinorVersion;
}
}
else
{
WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it doesn't contain the file ngen.exe", pwzTempVersion);
}
}
else
{
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);
}
}
else
{
WcaLog(LOGMSG_VERBOSE, "Ignoring %ls because it isn't a directory", pwzTempVersion);
}
fFound = FindNextFileW(hFind, &wfdVersionDirectories);
if (!fFound)
{
dwError = ::GetLastError();
hr = (ERROR_NO_MORE_FILES == dwError) ? ERROR_SUCCESS : HRESULT_FROM_WIN32(dwError);
ExitOnFailure(hr, "Failed to call FindNextFileW() with query %ls", pwzVersionSearch);
}
}
if (NULL == *ppwzVersion)
{
hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
ExitOnRootFailure(hr, "Searched through all subdirectories of %ls, but failed to find any version of ngen.exe", pwzParentPath);
}
else
{
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));
}
LExit:
if (hFind != INVALID_HANDLE_VALUE)
{
if (0 == FindClose(hFind))
{
dwError = ::GetLastError();
hr = HRESULT_FROM_WIN32(dwError);
WcaLog(LOGMSG_STANDARD, "Failed to close handle created by outer FindFirstFile with error %x - continuing", hr);
}
hFind = INVALID_HANDLE_VALUE;
}
ReleaseStr(pwzVersionSearch);
ReleaseStr(pwzNgen);
ReleaseStr(pwzTemp);
// Purposely don't release pwzTempVersion, because it wasn't allocated in this function, it's just a pointer to a string inside wfdVersionDirectories
return hr;
}
// Gets the path to ngen.exe
static HRESULT GetNgenPath(
__out LPWSTR* ppwzNgenPath,
__in BOOL f64BitFramework
)
{
Assert(ppwzNgenPath);
HRESULT hr = S_OK;
LPWSTR pwzVersion = NULL;
LPWSTR pwzWindowsFolder = NULL;
hr = WcaGetProperty(L"WindowsFolder", &pwzWindowsFolder);
ExitOnFailure(hr, "failed to get WindowsFolder property");
hr = StrAllocString(ppwzNgenPath, pwzWindowsFolder, 0);
ExitOnFailure(hr, "failed to copy to NgenPath windows folder: %ls", pwzWindowsFolder);
if (f64BitFramework)
{
WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 64-bit framework path");
hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework64\\", 0);
ExitOnFailure(hr, "failed to copy platform portion of ngen path");
}
else
{
WcaLog(LOGMSG_VERBOSE, "Searching for ngen under 32-bit framework path");
hr = StrAllocConcat(ppwzNgenPath, L"Microsoft.NET\\Framework\\", 0);
ExitOnFailure(hr, "failed to copy platform portion of ngen path");
}
// 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
hr = GetNgenVersion(*ppwzNgenPath, &pwzVersion);
ExitOnFailure(hr, "failed to search for ngen under path %ls", *ppwzNgenPath);
hr = StrAllocConcat(ppwzNgenPath, pwzVersion, 0);
ExitOnFailure(hr, "failed to copy version portion of ngen path");
hr = StrAllocConcat(ppwzNgenPath, L"\\ngen.exe", 0);
ExitOnFailure(hr, "failed to copy \"\\ngen.exe\" portion of ngen path");
LExit:
ReleaseStr(pwzVersion);
ReleaseStr(pwzWindowsFolder);
return hr;
}
static HRESULT GetStrongName(
__out LPWSTR* ppwzStrongName,
__in LPCWSTR pwzComponent
)
{
Assert(ppwzStrongName);
HRESULT hr = S_OK;
PMSIHANDLE hView = NULL;
PMSIHANDLE hComponentRec = NULL;
PMSIHANDLE hRec = NULL;
LPWSTR pwzData = NULL;
LPWSTR pwzName = NULL;
LPWSTR pwzVersion = NULL;
LPWSTR pwzCulture = NULL;
LPWSTR pwzPublicKeyToken = NULL;
hComponentRec = ::MsiCreateRecord(1);
hr = WcaSetRecordString(hComponentRec, 1, pwzComponent);
ExitOnFailure(hr, "failed to set component value in record to: %ls", pwzComponent);
// get the name value records for this component
hr = WcaOpenView(vcsNgenStrongName, &hView);
ExitOnFailure(hr, "failed to open view on NetFxNativeImage table");
hr = WcaExecuteView(hView, hComponentRec);
ExitOnFailure(hr, "failed to execute strong name view");
while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
{
hr = WcaGetRecordString(hRec, ngsnName, &pwzData);
ExitOnFailure(hr, "failed to get MsiAssemblyName.Name for component: %ls", pwzComponent);
if (0 == lstrcmpW(L"name", pwzData))
{
hr = WcaGetRecordString(hRec, ngsnValue, &pwzName);
ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
}
else if (0 == lstrcmpW(L"version", pwzData))
{
hr = WcaGetRecordString(hRec, ngsnValue, &pwzVersion);
ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
}
else if (0 == lstrcmpW(L"culture", pwzData))
{
hr = WcaGetRecordString(hRec, ngsnValue, &pwzCulture);
ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
}
else if (0 == lstrcmpW(L"publicKeyToken", pwzData))
{
hr = WcaGetRecordString(hRec, ngsnValue, &pwzPublicKeyToken);
ExitOnFailure(hr, "failed to get MsiAssemblyName.Value for component: %ls Name: %ls", pwzComponent, pwzData);
}
}
if (E_NOMOREITEMS == hr)
hr = S_OK;
ExitOnFailure(hr, "failed while looping through all names and values in MsiAssemblyName table for component: %ls", pwzComponent);
hr = StrAllocFormatted(ppwzStrongName, L"\"%s, Version=%s, Culture=%s, PublicKeyToken=%s\"", pwzName, pwzVersion, pwzCulture, pwzPublicKeyToken);
ExitOnFailure(hr, "failed to format strong name for component: %ls", pwzComponent);
LExit:
ReleaseStr(pwzData);
ReleaseStr(pwzName);
ReleaseStr(pwzVersion);
ReleaseStr(pwzCulture);
ReleaseStr(pwzPublicKeyToken);
return hr;
}
static HRESULT CreateInstallCommand(
__out LPWSTR* ppwzCommandLine,
__in LPCWSTR pwzNgenPath,
__in LPCWSTR pwzFile,
__in int iPriority,
__in int iAttributes,
__in LPCWSTR pwzFileApp,
__in LPCWSTR pwzDirAppBase
)
{
Assert(ppwzCommandLine && pwzNgenPath && *pwzNgenPath && pwzFile && *pwzFile&& pwzFileApp && pwzDirAppBase);
HRESULT hr = S_OK;
LPWSTR pwzQueueString = NULL;
hr = StrAllocFormatted(ppwzCommandLine, L"%s install %s", pwzNgenPath, pwzFile);
ExitOnFailure(hr, "failed to assemble install command line");
if (iPriority > 0)
{
hr = StrAllocFormatted(&pwzQueueString, L" /queue:%d", iPriority);
ExitOnFailure(hr, "failed to format queue string");
hr = StrAllocConcat(ppwzCommandLine, pwzQueueString, 0);
ExitOnFailure(hr, "failed to add queue string to NGEN command line");
}
if (NGEN_DEBUG & iAttributes)
{
hr = StrAllocConcat(ppwzCommandLine, L" /Debug", 0);
ExitOnFailure(hr, "failed to add debug to NGEN command line");
}
if (NGEN_PROFILE & iAttributes)
{
hr = StrAllocConcat(ppwzCommandLine, L" /Profile", 0);
ExitOnFailure(hr, "failed to add profile to NGEN command line");
}
if (NGEN_NODEP & iAttributes)
{
hr = StrAllocConcat(ppwzCommandLine, L" /NoDependencies", 0);
ExitOnFailure(hr, "failed to add no dependencies to NGEN command line");
}
// If it's more than just two quotes around an empty string
if (EMPTY_FORMATTED_LENGTH_QUOTED_FILE < lstrlenW(pwzFileApp))
{
hr = StrAllocConcat(ppwzCommandLine, L" /ExeConfig:", 0);
ExitOnFailure(hr, "failed to add exe config to NGEN command line");
hr = StrAllocConcat(ppwzCommandLine, pwzFileApp, 0);
ExitOnFailure(hr, "failed to add file app to NGEN command line");
}
// If it's more than just two quotes around a backslash
if (EMPTY_FORMATTED_LENGTH_QUOTED_DIRECTORY < lstrlenW(pwzDirAppBase))
{
hr = StrAllocConcat(ppwzCommandLine, L" /AppBase:", 0);
ExitOnFailure(hr, "failed to add app base to NGEN command line");
hr = StrAllocConcat(ppwzCommandLine, pwzDirAppBase, 0);
ExitOnFailure(hr, "failed to add dir app base to NGEN command line");
}
LExit:
return hr;
}
/******************************************************************
FileIdExists - checks if the file ID is found in the File table
returns S_OK if the file exists; S_FALSE if not; otherwise, error
********************************************************************/
static HRESULT FileIdExists(
__in_opt LPCWSTR wzFile
)
{
HRESULT hr = S_OK;
PMSIHANDLE hView = NULL;
PMSIHANDLE hRec = NULL;
if (!wzFile)
{
hr = S_FALSE;
ExitFunction();
}
hRec = ::MsiCreateRecord(1);
hr = WcaSetRecordString(hRec, fiFile, wzFile);
ExitOnFailure(hr, "failed to create a record with the file: %ls", wzFile);
hr = WcaTableExists(L"File");
if (S_OK == hr)
{
hr = WcaOpenView(vcsFileId, &hView);
ExitOnFailure(hr, "failed to open view on File table");
hr = WcaExecuteView(hView, hRec);
ExitOnFailure(hr, "failed to execute view on File table");
// Reuse the same record; the handle will be released.
hr = WcaFetchSingleRecord(hView, &hRec);
ExitOnFailure(hr, "failed to fetch File from File table");
}
LExit:
return hr;
}
/******************************************************************
SchedNetFx - entry point for NetFx Custom Action
********************************************************************/
extern "C" UINT __stdcall SchedNetFx(
__in MSIHANDLE hInstall
)
{
// AssertSz(FALSE, "debug SchedNetFx");
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
LPWSTR pwzInstallCustomActionData = NULL;
LPWSTR pwzUninstallCustomActionData = NULL;
UINT uiCost = 0;
PMSIHANDLE hView = NULL;
PMSIHANDLE hRec = NULL;
PMSIHANDLE hViewGac = NULL;
PMSIHANDLE hRecGac = NULL;
LPWSTR pwzId = NULL;
LPWSTR pwzData = NULL;
LPWSTR pwzTemp = NULL;
LPWSTR pwzFile = NULL;
int iPriority = 0;
int iAssemblyCost = 0;
int iAttributes = 0;
LPWSTR pwzFileApp = NULL;
LPWSTR pwzDirAppBase = NULL;
LPWSTR pwzComponent = NULL;
INSTALLSTATE isInstalled;
INSTALLSTATE isAction;
LPWSTR pwz32Ngen = NULL;
LPWSTR pwz64Ngen = NULL;
BOOL f32NgenExeExists = FALSE;
BOOL f64NgenExeExists = FALSE;
BOOL fNeedInstallUpdate32 = FALSE;
BOOL fNeedUninstallUpdate32 = FALSE;
BOOL fNeedInstallUpdate64 = FALSE;
BOOL fNeedUninstallUpdate64 = FALSE;
// initialize
hr = WcaInitialize(hInstall, "SchedNetFx");
ExitOnFailure(hr, "failed to initialize");
hr = GetNgenPath(&pwz32Ngen, FALSE);
f32NgenExeExists = SUCCEEDED(hr);
if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
{
hr = ERROR_SUCCESS;
WcaLog(LOGMSG_STANDARD, "Failed to find 32bit ngen. No actions will be scheduled to create native images for 32bit.");
}
ExitOnFailure(hr, "failed to get 32bit ngen.exe path");
hr = GetNgenPath(&pwz64Ngen, TRUE);
f64NgenExeExists = SUCCEEDED(hr);
if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr || HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
{
hr = ERROR_SUCCESS;
WcaLog(LOGMSG_STANDARD, "Failed to find 64bit ngen. No actions will be scheduled to create native images for 64bit.");
}
ExitOnFailure(hr, "failed to get 64bit ngen.exe path");
// loop through all the NetFx records
hr = WcaOpenExecuteView(vcsNgenQuery, &hView);
ExitOnFailure(hr, "failed to open view on NetFxNativeImage table");
while (S_OK == (hr = WcaFetchRecord(hView, &hRec)))
{
// Get Id
hr = WcaGetRecordString(hRec, ngqId, &pwzId);
ExitOnFailure(hr, "failed to get NetFxNativeImage.NetFxNativeImage");
// Get File
hr = WcaGetRecordString(hRec, ngqFile, &pwzData);
ExitOnFailure(hr, "failed to get NetFxNativeImage.File_ for record: %ls", pwzId);
hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData);
ExitOnFailure(hr, "failed to format file string for file: %ls", pwzData);
hr = WcaGetFormattedString(pwzTemp, &pwzFile);
ExitOnFailure(hr, "failed to get formatted string for file: %ls", pwzData);
// Get Priority
hr = WcaGetRecordInteger(hRec, ngqPriority, &iPriority);
ExitOnFailure(hr, "failed to get NetFxNativeImage.Priority for record: %ls", pwzId);
if (0 == iPriority)
iAssemblyCost = COST_NGEN_BLOCKING;
else
iAssemblyCost = COST_NGEN_NONBLOCKING;
// Get Attributes
hr = WcaGetRecordInteger(hRec, ngqAttributes, &iAttributes);
ExitOnFailure(hr, "failed to get NetFxNativeImage.Attributes for record: %ls", pwzId);
// Get File_Application or leave pwzFileApp NULL.
hr = WcaGetRecordFormattedString(hRec, ngqFileApp, &pwzData);
ExitOnFailure(hr, "failed to get NetFxNativeImage.File_Application for record: %ls", pwzId);
// Check if the value resolves to a valid file ID.
if (S_OK == FileIdExists(pwzData))
{
// Resolve the file ID to a path.
hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedFile, pwzData);
ExitOnFailure(hr, "failed to format file application string for file: %ls", pwzData);
hr = WcaGetFormattedString(pwzTemp, &pwzFileApp);
ExitOnFailure(hr, "failed to get formatted string for file application: %ls", pwzData);
}
else
{
// Assume record formatted to a path already.
hr = StrAllocString(&pwzFileApp, pwzData, 0);
ExitOnFailure(hr, "failed to allocate string for file path: %ls", pwzData);
hr = PathEnsureQuoted(&pwzFileApp, FALSE);
ExitOnFailure(hr, "failed to quote file path: %ls", pwzData);
}
// Get Directory_ApplicationBase or leave pwzDirAppBase NULL.
hr = WcaGetRecordFormattedString(hRec, ngqDirAppBase, &pwzData);
ExitOnFailure(hr, "failed to get NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId);
if (WcaIsUnicodePropertySet(pwzData))
{
// Resolve the directory ID to a path.
hr = StrAllocFormatted(&pwzTemp, vpwzUnformattedQuotedDirectory, pwzData);
ExitOnFailure(hr, "failed to format directory application base string for property: %ls", pwzData);
hr = WcaGetFormattedString(pwzTemp, &pwzDirAppBase);
ExitOnFailure(hr, "failed to get formatted string for directory application base: %ls", pwzData);
}
else
{
// Assume record formatted to a path already.
hr = StrAllocString(&pwzDirAppBase, pwzData, 0);
ExitOnFailure(hr, "failed to allocate string for directory path: %ls", pwzData);
hr = PathEnsureQuoted(&pwzDirAppBase, TRUE);
ExitOnFailure(hr, "failed to quote and backslashify directory: %ls", pwzData);
}
// Get Component
hr = WcaGetRecordString(hRec, ngqComponent, &pwzComponent);
ExitOnFailure(hr, "failed to get NetFxNativeImage.Directory_ApplicationBase for record: %ls", pwzId);
er = ::MsiGetComponentStateW(hInstall, pwzComponent, &isInstalled, &isAction);
ExitOnWin32Error(er, hr, "failed to get install state for Component: %ls", pwzComponent);
//
// Figure out if it's going to be GAC'd. The possibility exists that no assemblies are going to be GAC'd
// so we have to check for the MsiAssembly table first.
//
if (S_OK == WcaTableExists(L"MsiAssembly"))
{
hr = WcaOpenView(vcsNgenGac, &hViewGac);
ExitOnFailure(hr, "failed to open view on File/MsiAssembly table");
hr = WcaExecuteView(hViewGac, hRec);
ExitOnFailure(hr, "failed to execute view on File/MsiAssembly table");
hr = WcaFetchSingleRecord(hViewGac, &hRecGac);
ExitOnFailure(hr, "failed to fetch File_Assembly from File/MsiAssembly table");
if (S_FALSE != hr)
{
hr = WcaGetRecordString(hRecGac, nggApplication, &pwzData);
ExitOnFailure(hr, "failed to get MsiAssembly.File_Application");
// If it's in the GAC replace the file name with the strong name
if (L'\0' == pwzData[0])
{
hr = GetStrongName(&pwzFile, pwzComponent);
ExitOnFailure(hr, "failed to get strong name for component: %ls", pwzData);
}
}
}
//
// Schedule the work
//
if (!(iAttributes & NGEN_32BIT) && !(iAttributes & NGEN_64BIT))
ExitOnFailure(hr = E_INVALIDARG, "Neither 32bit nor 64bit is specified for NGEN of file: %ls", pwzFile);
if (WcaIsInstalling(isInstalled, isAction) || WcaIsReInstalling(isInstalled, isAction))
{
if (iAttributes & NGEN_32BIT && f32NgenExeExists)
{
// Assemble the install command line
hr = CreateInstallCommand(&pwzData, pwz32Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase);
ExitOnFailure(hr, "failed to create install command line");
hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData);
ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData);
ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
uiCost += iAssemblyCost;
fNeedInstallUpdate32 = TRUE;
}
if (iAttributes & NGEN_64BIT && f64NgenExeExists)
{
// Assemble the install command line
hr = CreateInstallCommand(&pwzData, pwz64Ngen, pwzFile, iPriority, iAttributes, pwzFileApp, pwzDirAppBase);
ExitOnFailure(hr, "failed to create install command line");
hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(iAssemblyCost, &pwzInstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
uiCost += iAssemblyCost;
fNeedInstallUpdate64 = TRUE;
}
}
else if (WcaIsUninstalling(isInstalled, isAction))
{
if (iAttributes & NGEN_32BIT && f32NgenExeExists)
{
hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz32Ngen, pwzFile);
ExitOnFailure(hr, "failed to create update 32 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
fNeedUninstallUpdate32 = TRUE;
}
if (iAttributes & NGEN_64BIT && f64NgenExeExists)
{
hr = StrAllocFormatted(&pwzData, L"%s uninstall %s", pwz64Ngen, pwzFile);
ExitOnFailure(hr, "failed to create update 64 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
fNeedUninstallUpdate64 = TRUE;
}
}
}
if (E_NOMOREITEMS == hr)
hr = S_OK;
ExitOnFailure(hr, "failed while looping through all files to create native images for");
// If we need 32 bit install update
if (fNeedInstallUpdate32)
{
hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen);
ExitOnFailure(hr, "failed to create install update 32 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
}
// If we need 32 bit uninstall update
if (fNeedUninstallUpdate32)
{
hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz32Ngen);
ExitOnFailure(hr, "failed to create uninstall update 32 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
}
// If we need 64 bit install update
if (fNeedInstallUpdate64)
{
hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen);
ExitOnFailure(hr, "failed to create install update 64 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzInstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to install custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzInstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to install custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
}
// If we need 64 bit install update
if (fNeedUninstallUpdate64)
{
hr = StrAllocFormatted(&pwzData, L"%s update /queue", pwz64Ngen);
ExitOnFailure(hr, "failed to create uninstall update 64 command line");
hr = WcaWriteStringToCaData(pwzData, &pwzUninstallCustomActionData); // command
ExitOnFailure(hr, "failed to add install command to uninstall custom action data: %ls", pwzData);
hr = WcaWriteIntegerToCaData(COST_NGEN_NONBLOCKING, &pwzUninstallCustomActionData); // cost
ExitOnFailure(hr, "failed to add cost to uninstall custom action data: %ls", pwzData);
uiCost += COST_NGEN_NONBLOCKING;
}
// Add to progress bar
if ((pwzInstallCustomActionData && *pwzInstallCustomActionData) || (pwzUninstallCustomActionData && *pwzUninstallCustomActionData))
{
hr = WcaProgressMessage(uiCost, TRUE);
ExitOnFailure(hr, "failed to extend progress bar for NetFxExecuteNativeImage");
}
// Schedule the install custom action
if (pwzInstallCustomActionData && *pwzInstallCustomActionData)
{
hr = WcaSetProperty(L"NetFxExecuteNativeImageInstall", pwzInstallCustomActionData);
ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageInstall action");
hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitInstall", pwzInstallCustomActionData);
ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitInstall action");
}
// Schedule the uninstall custom action
if (pwzUninstallCustomActionData && *pwzUninstallCustomActionData)
{
hr = WcaSetProperty(L"NetFxExecuteNativeImageUninstall", pwzUninstallCustomActionData);
ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageUninstall action");
hr = WcaSetProperty(L"NetFxExecuteNativeImageCommitUninstall", pwzUninstallCustomActionData);
ExitOnFailure(hr, "failed to schedule NetFxExecuteNativeImageCommitUninstall action");
}
LExit:
ReleaseStr(pwzInstallCustomActionData);
ReleaseStr(pwzUninstallCustomActionData);
ReleaseStr(pwzId);
ReleaseStr(pwzData);
ReleaseStr(pwzTemp);
ReleaseStr(pwzFile);
ReleaseStr(pwzFileApp);
ReleaseStr(pwzDirAppBase);
ReleaseStr(pwzComponent);
ReleaseStr(pwz32Ngen);
ReleaseStr(pwz64Ngen);
if (FAILED(hr))
er = ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
/******************************************************************
ExecNetFx - entry point for NetFx Custom Action
*******************************************************************/
extern "C" UINT __stdcall ExecNetFx(
__in MSIHANDLE hInstall
)
{
// AssertSz(FALSE, "debug ExecNetFx");
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
LPWSTR pwzCustomActionData = NULL;
LPWSTR pwzData = NULL;
LPWSTR pwz = NULL;
int iCost = 0;
// initialize
hr = WcaInitialize(hInstall, "ExecNetFx");
ExitOnFailure(hr, "failed to initialize");
hr = WcaGetProperty( L"CustomActionData", &pwzCustomActionData);
ExitOnFailure(hr, "failed to get CustomActionData");
WcaLog(LOGMSG_TRACEONLY, "CustomActionData: %ls", pwzCustomActionData);
pwz = pwzCustomActionData;
// loop through all the passed in data
while (pwz && *pwz)
{
hr = WcaReadStringFromCaData(&pwz, &pwzData);
ExitOnFailure(hr, "failed to read command line from custom action data");
hr = WcaReadIntegerFromCaData(&pwz, &iCost);
ExitOnFailure(hr, "failed to read cost from custom action data");
hr = QuietExec(pwzData, NGEN_TIMEOUT, TRUE, TRUE);
// If we fail here it isn't critical - keep looping through to try to act on the other assemblies on our list
if (FAILED(hr))
{
WcaLog(LOGMSG_STANDARD, "failed to execute Ngen command (with error 0x%x): %ls, continuing anyway", hr, pwzData);
hr = S_OK;
}
// Tick the progress bar along for this assembly
hr = WcaProgressMessage(iCost, FALSE);
ExitOnFailure(hr, "failed to tick progress bar for command line: %ls", pwzData);
}
LExit:
ReleaseStr(pwzCustomActionData);
ReleaseStr(pwzData);
if (FAILED(hr))
er = ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}

8
src/ca/netfxca.def Normal file
Просмотреть файл

@ -0,0 +1,8 @@
; 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.
LIBRARY "netfxca"
EXPORTS
SchedNetFx
ExecNetFx

70
src/ca/netfxca.vcxproj Normal file
Просмотреть файл

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props" Condition="Exists('..\..\packages\WixToolset.DUtil.4.0.6\build\WixToolset.DUtil.props')" />
<Import Project="..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props" Condition="Exists('..\..\packages\WixToolset.WcaUtil.4.0.2\build\WixToolset.WcaUtil.props')" />
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</ProjectGuid>
<ConfigurationType>DynamicLibrary</ConfigurationType>
<TargetName>netfxca</TargetName>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<ProjectModuleDefinitionFile>netfxca.def</ProjectModuleDefinitionFile>
<Description>WiX Toolset .NET Framework CustomAction</Description>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
<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')" />
</ImportGroup>
<PropertyGroup>
<ProjectAdditionalLinkLibraries>msi.lib</ProjectAdditionalLinkLibraries>
</PropertyGroup>
<ItemGroup>
<ClCompile Include="dllmain.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="netfxca.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="cost.h" />
<ClInclude Include="precomp.h" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="netfxca.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<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>
</PropertyGroup>
<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'))" />
<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'))" />
<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'))" />
</Target>
</Project>

6
src/ca/packages.config Normal file
Просмотреть файл

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.VisualStudio.Setup.Configuration.Native" version="1.14.114" targetFramework="native" developmentDependency="true" />
<package id="WixToolset.DUtil" version="4.0.6" targetFramework="native" />
<package id="WixToolset.WcaUtil" version="4.0.2" targetFramework="native" />
</packages>

13
src/ca/precomp.h Normal file
Просмотреть файл

@ -0,0 +1,13 @@
#pragma once
// 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.
#include <windows.h>
#include <msiquery.h>
#include "wcautil.h"
#include "fileutil.h"
#include "strutil.h"
#include "pathutil.h"
#include "cost.h"

Просмотреть файл

@ -0,0 +1,33 @@
// 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.
namespace WixToolsetTest.Netfx
{
using System.Linq;
using WixBuildTools.TestSupport;
using WixToolset.Core.TestPackage;
using WixToolset.Netfx;
using Xunit;
public class NetfxExtensionFixture
{
[Fact]
public void CanBuildUsingNativeImage()
{
var folder = TestData.Get(@"TestData\UsingNativeImage");
var build = new Builder(folder, typeof(NetfxExtensionFactory), new[] { folder });
var results = build.BuildAndQuery(Build, "NetFxNativeImage");
Assert.Equal(new[]
{
"NetFxNativeImage:ExampleNgen\tfil6349_KNDJhqShNzVdHX3ihhvA6Y\t3\t8\t\t",
}, results.OrderBy(s => s).ToArray());
}
private static void Build(string[] args)
{
var result = WixRunner.Execute(args, out var messages);
Assert.Equal(0, result);
Assert.Empty(messages);
}
}
}

Просмотреть файл

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file contains the declaration of all the localizable strings.
-->
<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
<String Id="DowngradeError">A newer version of [ProductName] is already installed.</String>
<String Id="FeatureTitle">MsiPackage</String>
</WixLocalization>

Просмотреть файл

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<Product Id="*" Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
<Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" />
<MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
<MediaTemplate />
<Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="MsiPackage" />
</Directory>
</Directory>
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
xmlns:netfx="http://wixtoolset.org/schemas/v4/wxs/netfx">
<Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<Component>
<File Name="fake.ddl" Source="example.txt">
<netfx:NativeImage Id="ExampleNgen" />
</File>
</Component>
</ComponentGroup>
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1 @@
This is example.txt.

Просмотреть файл

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<PropertyGroup>
<NoWarn>NU1701</NoWarn>
</PropertyGroup>
<ItemGroup>
<Content Include="TestData\UsingNativeImage\example.txt" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\UsingNativeImage\Package.en-us.wxl" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\UsingNativeImage\Package.wxs" CopyToOutputDirectory="PreserveNewest" />
<Content Include="TestData\UsingNativeImage\PackageComponents.wxs" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\wixext\WixToolset.Netfx.wixext.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(WixToolsetRootFolder)\Core\src\WixToolset.Core.TestPackage\WixToolset.Core.TestPackage.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\README.md') " />
<ProjectReference Include="$(WixToolsetRootFolder)\Core\src\wix\wix.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Core\README.md') " />
<PackageReference Include="WixToolset.Core.TestPackage" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Core\README.md') " PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="WixBuildTools.TestSupport" Version="4.0.*" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
<PackageReference Include="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</ItemGroup>
</Project>

159
src/wixext/NetFxCompiler.cs Normal file
Просмотреть файл

@ -0,0 +1,159 @@
// 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.
namespace WixToolset.Netfx
{
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using WixToolset.Data;
using WixToolset.Extensibility;
/// <summary>
/// The compiler for the WiX Toolset .NET Framework Extension.
/// </summary>
public sealed class NetfxCompiler : BaseCompilerExtension
{
public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/netfx";
/// <summary>
/// Processes an element for the Compiler.
/// </summary>
/// <param name="parentElement">Parent element of element to process.</param>
/// <param name="element">Element to process.</param>
/// <param name="contextValues">Extra information about the context in which this element is being parsed.</param>
public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary<string, string> context)
{
switch (parentElement.Name.LocalName)
{
case "File":
string fileId = context["FileId"];
switch (element.Name.LocalName)
{
case "NativeImage":
this.ParseNativeImageElement(intermediate, section, element, fileId);
break;
default:
this.ParseHelper.UnexpectedElement(parentElement, element);
break;
}
break;
default:
this.ParseHelper.UnexpectedElement(parentElement, element);
break;
}
}
/// <summary>
/// Parses a NativeImage element.
/// </summary>
/// <param name="element">The element to parse.</param>
/// <param name="fileId">The file identifier of the parent element.</param>
private void ParseNativeImageElement(Intermediate intermediate, IntermediateSection section, XElement element, string fileId)
{
SourceLineNumber sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
Identifier id = null;
string appBaseDirectory = null;
string assemblyApplication = null;
int attributes = 0x8; // 32bit is on by default
int priority = 3;
foreach (XAttribute attrib in element.Attributes())
{
if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
{
switch (attrib.Name.LocalName)
{
case "Id":
id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
break;
case "AppBaseDirectory":
appBaseDirectory = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
// See if a formatted value is specified.
if (-1 == appBaseDirectory.IndexOf("[", StringComparison.Ordinal))
{
this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "Directory", appBaseDirectory);
}
break;
case "AssemblyApplication":
assemblyApplication = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
// See if a formatted value is specified.
if (-1 == assemblyApplication.IndexOf("[", StringComparison.Ordinal))
{
this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "File", assemblyApplication);
}
break;
case "Debug":
if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
{
attributes |= 0x1;
}
break;
case "Dependencies":
if (YesNoType.No == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
{
attributes |= 0x2;
}
break;
case "Platform":
string platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
if (0 < platformValue.Length)
{
switch (platformValue)
{
case "32bit":
// 0x8 is already on by default
break;
case "64bit":
attributes &= ~0x8;
attributes |= 0x10;
break;
case "all":
attributes |= 0x10;
break;
}
}
break;
case "Priority":
priority = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 0, 3);
break;
case "Profile":
if (YesNoType.Yes == this.ParseHelper.GetAttributeYesNoValue(sourceLineNumbers, attrib))
{
attributes |= 0x4;
}
break;
default:
this.ParseHelper.UnexpectedAttribute(element, attrib);
break;
}
}
else
{
this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
}
}
if (null == id)
{
this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Id"));
}
this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, "CustomAction", "NetFxScheduleNativeImage");
if (!this.Messaging.EncounteredError)
{
var row = this.ParseHelper.CreateRow(section, sourceLineNumbers, "NetFxNativeImage", id);
row.Set(1, fileId);
row.Set(2, priority);
row.Set(3, attributes);
row.Set(4, assemblyApplication);
row.Set(5, appBaseDirectory);
}
}
}
}

Просмотреть файл

@ -0,0 +1,139 @@
// 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.
namespace WixToolset.Extensions
{
#if TODO_CONSIDER_DECOMPILER
using System;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
using WixToolset.Data;
using WixToolset.Extensibility;
using NetFx = WixToolset.Extensions.Serialize.NetFx;
using Wix = WixToolset.Data.Serialize;
/// <summary>
/// The decompiler for the WiX Toolset .NET Framework Extension.
/// </summary>
public sealed class NetFxDecompiler : DecompilerExtension
{
/// <summary>
/// Creates a decompiler for NetFx Extension.
/// </summary>
public NetFxDecompiler()
{
this.TableDefinitions = NetFxExtensionData.GetExtensionTableDefinitions();
}
/// <summary>
/// Get the extensions library to be removed.
/// </summary>
/// <param name="tableDefinitions">Table definitions for library.</param>
/// <returns>Library to remove from decompiled output.</returns>
public override Library GetLibraryToRemove(TableDefinitionCollection tableDefinitions)
{
return NetFxExtensionData.GetExtensionLibrary(tableDefinitions);
}
/// <summary>
/// Decompiles an extension table.
/// </summary>
/// <param name="table">The table to decompile.</param>
public override void DecompileTable(Table table)
{
switch (table.Name)
{
case "NetFxNativeImage":
this.DecompileNetFxNativeImageTable(table);
break;
default:
base.DecompileTable(table);
break;
}
}
/// <summary>
/// Decompile the NetFxNativeImage table.
/// </summary>
/// <param name="table">The table to decompile.</param>
private void DecompileNetFxNativeImageTable(Table table)
{
foreach (Row row in table.Rows)
{
NetFx.NativeImage nativeImage = new NetFx.NativeImage();
nativeImage.Id = (string)row[0];
switch ((int)row[2])
{
case 0:
nativeImage.Priority = NetFx.NativeImage.PriorityType.Item0;
break;
case 1:
nativeImage.Priority = NetFx.NativeImage.PriorityType.Item1;
break;
case 2:
nativeImage.Priority = NetFx.NativeImage.PriorityType.Item2;
break;
case 3:
nativeImage.Priority = NetFx.NativeImage.PriorityType.Item3;
break;
}
if (null != row[3])
{
int attributes = (int)row[3];
if (0x1 == (attributes & 0x1))
{
nativeImage.Debug = NetFx.YesNoType.yes;
}
if (0x2 == (attributes & 0x2))
{
nativeImage.Dependencies = NetFx.YesNoType.no;
}
if (0x4 == (attributes & 0x4))
{
nativeImage.Profile = NetFx.YesNoType.yes;
}
if (0x8 == (attributes & 0x8) && 0x10 == (attributes & 0x10))
{
nativeImage.Platform = NetFx.NativeImage.PlatformType.all;
}
else if (0x8 == (attributes & 0x8))
{
nativeImage.Platform = NetFx.NativeImage.PlatformType.Item32bit;
}
else if (0x10 == (attributes & 0x10))
{
nativeImage.Platform = NetFx.NativeImage.PlatformType.Item64bit;
}
}
if (null != row[4])
{
nativeImage.AssemblyApplication = (string)row[4];
}
if (null != row[5])
{
nativeImage.AppBaseDirectory = (string)row[5];
}
Wix.File file = (Wix.File)this.Core.GetIndexedElement("File", (string)row[1]);
if (null != file)
{
file.AddChild(nativeImage);
}
else
{
this.Core.OnMessage(WixWarnings.ExpectedForeignRow(row.SourceLineNumbers, table.Name, row.GetPrimaryKey(DecompilerConstants.PrimaryKeyDelimiter), "File_", (string)row[1], "File"));
}
}
}
}
#endif
}

Просмотреть файл

@ -0,0 +1,25 @@
// 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.
namespace WixToolset.Netfx
{
using WixToolset.Data;
using WixToolset.Extensibility;
using WixToolset.Netfx.Tuples;
/// <summary>
/// The WiX Toolset .NET Framework Extension.
/// </summary>
public sealed class NetfxExtensionData : BaseExtensionData
{
public override bool TryGetTupleDefinitionByName(string name, out IntermediateTupleDefinition tupleDefinition)
{
tupleDefinition = (name == NetfxTupleDefinitionNames.NetFxNativeImage) ? NetfxTupleDefinitions.NetFxNativeImage : null;
return tupleDefinition != null;
}
public override Intermediate GetLibrary(ITupleDefinitionCreator tupleDefinitions)
{
return Intermediate.Load(typeof(NetfxExtensionData).Assembly, "WixToolset.Netfx.netfx.wixlib", tupleDefinitions);
}
}
}

Просмотреть файл

@ -0,0 +1,18 @@
// 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.
namespace WixToolset.Netfx
{
using System;
using System.Collections.Generic;
using WixToolset.Extensibility;
public class NetfxExtensionFactory : BaseExtensionFactory
{
protected override IEnumerable<Type> ExtensionTypes => new[]
{
typeof(NetfxCompiler),
typeof(NetfxExtensionData),
typeof(NetfxWindowsInstallerBackendExtension),
};
}
}

Просмотреть файл

@ -0,0 +1,27 @@
// 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.
namespace WixToolset.Netfx
{
using WixToolset.Data.WindowsInstaller;
using WixToolset.Extensibility;
public class NetfxWindowsInstallerBackendExtension : BaseWindowsInstallerBackendExtension
{
private static readonly TableDefinition[] Tables = new[] {
new TableDefinition(
"NetFxNativeImage",
new[]
{
new ColumnDefinition("NetFxNativeImage", ColumnType.String, 72, true, false, ColumnCategory.Identifier, description: "The primary key, a non-localized token."),
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."),
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."),
new ColumnDefinition("Attributes", ColumnType.Number, 4, false, false, ColumnCategory.Integer, maxValue: 2147483647, description: "Integer containing bit flags representing native image attributes."),
new ColumnDefinition("File_Application", ColumnType.String, 72, false, true, ColumnCategory.Formatted, description: "The application which loads this assembly."),
new ColumnDefinition("Directory_ApplicationBase", ColumnType.String, 72, false, true, ColumnCategory.Formatted, description: "The directory containing the application which loads this assembly."),
}
),
};
protected override TableDefinition[] TableDefinitionsForTuples => Tables;
}
}

Просмотреть файл

@ -0,0 +1,65 @@
// 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.
namespace WixToolset.Netfx.Tuples
{
using WixToolset.Data;
public enum NetFxNativeImageTupleFields
{
NetFxNativeImage,
File_,
Priority,
Attributes,
File_Application,
Directory_ApplicationBase,
}
public class NetFxNativeImageTuple : IntermediateTuple
{
public NetFxNativeImageTuple() : base(NetfxTupleDefinitions.NetFxNativeImage, null, null)
{
}
public NetFxNativeImageTuple(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxTupleDefinitions.NetFxNativeImage, sourceLineNumber, id)
{
}
public IntermediateField this[NetFxNativeImageTupleFields index] => this.Fields[(int)index];
public string NetFxNativeImage
{
get => this.Fields[(int)NetFxNativeImageTupleFields.NetFxNativeImage].AsString();
set => this.Set((int)NetFxNativeImageTupleFields.NetFxNativeImage, value);
}
public string File_
{
get => this.Fields[(int)NetFxNativeImageTupleFields.File_].AsString();
set => this.Set((int)NetFxNativeImageTupleFields.File_, value);
}
public int Priority
{
get => this.Fields[(int)NetFxNativeImageTupleFields.Priority].AsNumber();
set => this.Set((int)NetFxNativeImageTupleFields.Priority, value);
}
public int Attributes
{
get => this.Fields[(int)NetFxNativeImageTupleFields.Attributes].AsNumber();
set => this.Set((int)NetFxNativeImageTupleFields.Attributes, value);
}
public string File_Application
{
get => this.Fields[(int)NetFxNativeImageTupleFields.File_Application].AsString();
set => this.Set((int)NetFxNativeImageTupleFields.File_Application, value);
}
public string Directory_ApplicationBase
{
get => this.Fields[(int)NetFxNativeImageTupleFields.Directory_ApplicationBase].AsString();
set => this.Set((int)NetFxNativeImageTupleFields.Directory_ApplicationBase, value);
}
}
}

Просмотреть файл

@ -0,0 +1,27 @@
// 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.
namespace WixToolset.Netfx.Tuples
{
using WixToolset.Data;
public static class NetfxTupleDefinitionNames
{
public static string NetFxNativeImage { get; } = "NetFxNativeImage";
}
public static class NetfxTupleDefinitions
{
public static readonly IntermediateTupleDefinition NetFxNativeImage = new IntermediateTupleDefinition(
NetfxTupleDefinitionNames.NetFxNativeImage,
new[]
{
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.NetFxNativeImage), IntermediateFieldType.String),
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.File_), IntermediateFieldType.String),
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Priority), IntermediateFieldType.Number),
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Attributes), IntermediateFieldType.Number),
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.File_Application), IntermediateFieldType.String),
new IntermediateFieldDefinition(nameof(NetFxNativeImageTupleFields.Directory_ApplicationBase), IntermediateFieldType.String),
},
typeof(NetFxNativeImageTuple));
}
}

Просмотреть файл

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace>WixToolset.Netfx</RootNamespace>
<Description>WiX Toolset .NET Framework Extension</Description>
<Title>WiX Toolset .NET Framework Extension</Title>
<IsTool>true</IsTool>
<ContentTargetFolders>build</ContentTargetFolders>
</PropertyGroup>
<ItemGroup>
<Content Include="$(MSBuildThisFileName).targets" />
<Content Include="netfx.xsd" PackagePath="tools" />
<EmbeddedResource Include="$(OutputPath)..\netfx.wixlib" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(WixToolsetRootFolder)\Data\src\WixToolset.Data\WixToolset.Data.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Data\README.md') " />
<PackageReference Include="WixToolset.Data" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Data\README.md') " PrivateAssets="all" />
<ProjectReference Include="$(WixToolsetRootFolder)\Extensibility\src\WixToolset.Extensibility\WixToolset.Extensibility.csproj" Condition=" '$(Configuration)' == 'Debug' And Exists('$(WixToolsetRootFolder)\Extensibility\README.md') " />
<PackageReference Include="WixToolset.Extensibility" Version="4.0.*" Condition=" '$(Configuration)' == 'Release' Or !Exists('$(WixToolsetRootFolder)\Extensibility\README.md') " PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\wixlib\netfx.wixproj" ReferenceOutputAssembly="false" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" Version="2.1.7" PrivateAssets="all" />
</ItemGroup>
</Project>

Просмотреть файл

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<WixToolsetNetfxWixextPath Condition=" '$(WixToolsetNetfxWixextPath)' == '' ">$(MSBuildThisFileDirectory)..\tools\WixToolset.Netfx.wixext.dll"</WixToolsetNetfxWixextPath>
</PropertyGroup>
<ItemGroup>
<WixExtension Include="$(WixToolsetNetfxWixextPath)" />
</ItemGroup>
</Project>

235
src/wixext/netfx.xsd Normal file
Просмотреть файл

@ -0,0 +1,235 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xse=" http://wixtoolset.org/schemas/XmlSchemaExtension"
xmlns:html="http://www.w3.org/1999/xhtml"
targetNamespace="http://wixtoolset.org/schemas/v4/wxs/netfx"
xmlns="http://wixtoolset.org/schemas/v4/wxs/netfx">
<xs:annotation>
<xs:documentation>
The source code schema for the WiX Toolset .NET Framework Extension.
</xs:documentation>
</xs:annotation>
<xs:element name="NativeImage">
<xs:annotation>
<xs:documentation>
Improves the performance of managed applications by creating native images.
Requires the .NET Framework 2.0 or newer to be installed on the target machine since
it runs <html:a href="http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx">NGen</html:a>.
</xs:documentation>
<xs:appinfo>
<xse:parent namespace="http://wixtoolset.org/schemas/v4/wxs" ref="File" />
<xse:remarks>
<html:p>
Native images are files containing compiled processor-specific machine code, which
are installed into the native image cache on the local computer. The runtime
can use native images from the cache instead using the just-in-time (JIT)
compiler to compile the original assembly.
</html:p>
<html:p>
The native image custom actions are configured to ignore failures so that failing
to generate or remove a native image will not cause setup to fail and roll back.
</html:p>
<html:p>
<html:b>Note for patches:</html:b> if you built your target, or baseline, MSI with
previous versions 3.0 or 3.5 of this extension and want to upgrade to formattable
values for @AssemblyApplication or @AppBaseDirectory you must also include a
BinaryRef to "NetFxCA" to pull in necessary changes. If you do use formattable
values and do not include the binary changes ngen.exe will not optimize your
native images for the specified application.
</html:p>
<html:p>
This should be a rare occurrence, however. Because you cannot remove components
in a patch - and pyro does validate you do not - it is not practical to switch
from using identifiers to formattable values in a patch. One practical possibility
is if you wanted to use a different application to optimize your native images
and that application is not already installed with the MSI to be updated.
</html:p>
</xse:remarks>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:attribute name="Id" type="xs:string" use="required">
<xs:annotation>
<xs:documentation>
The identifier for this NativeImage.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="AppBaseDirectory" type="xs:string">
<xs:annotation>
<xs:documentation>
<html:p>
The directory to use for locating dependent assemblies.
For DLL assemblies and assemblies installed to the Global Assembly Cache (GAC),
this attribute should be set to the directory of the application which loads this
assembly. For EXE assemblies, this attribute does not need to be set because NGen
will use the directory of the assembly file by default.
</html:p>
<html:p>
The value can be in the form of a directory identifier, or a formatted string
that resolves to either a directory identifier or a full path to a directory.
</html:p>
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="AssemblyApplication" type="xs:string">
<xs:annotation>
<xs:documentation>
<html:p>
The application which will load this assembly.
For DLL assemblies which are loaded via reflection, this attribute should
be set to indicate the application which will load this assembly.
The configuration of the application (usually specified via an exe.config file) will be used
to determine how to resolve dependencies for this assembly.
</html:p>
<html:p>
The value can be in the form of a file identifier, or a formatted string
that resolves to either a file identifier or a full path to a file.
</html:p>
<html:p>
When a shared component is loaded at run time, using the Load method, the
application's configuration file determines the dependencies that are loaded
for the shared component — for example, the version of a dependency that is loaded.
This attribute gives guidance on which dependencies would be loaded at run time in order
to figure out which dependency assemblies will also need to have native images generated
(assuming the Dependency attribute is not set to "no").
</html:p>
<html:p>
This attribute cannot be set if the AssemblyApplication attribute is set on the parent
File element (please note that these attributes both refer to the same application
assembly but do very different things: specifiying File/@AssemblyApplication will force
an assembly to install to a private location next to the indicated application, whereas
this AssemblyApplication attribute will be used to help resolve dependent assemblies
while generating native images for this assembly).
</html:p>
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Debug" type="YesNoType">
<xs:annotation>
<xs:documentation>
Set to "yes" to generate native images that can be used under a debugger.
The default value is "no".
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Dependencies" type="YesNoType">
<xs:annotation>
<xs:documentation>
Set to "no" to generate the minimum number of native images.
The default value is "yes".
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Platform">
<xs:annotation>
<xs:documentation>
Sets the platform(s) for which native images will be generated.
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="32bit">
<xs:annotation>
<xs:documentation>
Attempt to generate native images only for the 32-bit version of the .NET Framework
on the target machine. If the 32-bit version of the .NET Framework 2.0 or newer is not
present on the target machine, native image custom actions will not be scheduled.
This is the default value.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="64bit">
<xs:annotation>
<xs:documentation>
Attempt to generate native images only for the 64-bit version of the .NET Framework
on the target machine. If a 64-bit version of the .NET Framework 2.0 or newer is not
present on the target machine, native image custom actions will not be scheduled.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="all">
<xs:annotation>
<xs:documentation>
Attempt to generate native images for the 32-bit and 64-bit versions of the .NET Framework
on the target machine. If a version of the .NET Framework 2.0 or newer is not present on the
target machine for a processor architecture, native image custom actions will not be
scheduled for that processor architecture.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="Priority">
<xs:annotation>
<xs:documentation>
Sets the priority of generating the native images for this assembly.
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:NMTOKEN">
<xs:enumeration value="0">
<xs:annotation>
<xs:documentation>
This is the highest priority, it means that image generation occurs syncronously
during the setup process. This option will slow down setup performance.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation>
This will queue image generation to the NGen service to occur immediately.
This option will slow down setup performance.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation>
This will queue image generation to the NGen service to occur after all priority 1
assemblies have completed.
This option will slow down setup performance.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="3">
<xs:annotation>
<xs:documentation>
This is the lowest priority, it will queue image generation to occur when the
machine is idle.
This option should not slow down setup performance.
This is the default value.
</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="Profile" type="YesNoType">
<xs:annotation>
<xs:documentation>
Set to "yes" to generate native images that can be used under a profiler.
The default value is "no".
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:simpleType name="YesNoType">
<xs:annotation>
<xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
</xs:annotation>
<xs:restriction base='xs:NMTOKEN'>
<xs:enumeration value="no"/>
<xs:enumeration value="yes"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>

192
src/wixlib/NetFx1.1.wxs Normal file
Просмотреть файл

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 1.1 - http://msdn.microsoft.com/library/ms994339.aspx
-->
<!-- set to #1 if the .NET Framework 1.1 is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11" Secure="yes">
<RegistrySearch Id="NetFramework11" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the service pack level for the .NET Framework 1.1. -->
<Fragment>
<Property Id="NETFRAMEWORK11_SP_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework11SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322" Name="SP" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 1.1 redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK11INSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx11Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
<DirectorySearch Id="NetFx11InstallRootSearch" Path="v1.1.4322" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 1.1 Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK11_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NetFramework11TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v1.1.4322\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- location of the .NET Framework 1.1 SDK installation root -->
<Fragment>
<Property Id="NETFRAMEWORK11SDKDIR" Secure="yes">
<RegistrySearch Id="NetFramework11SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv1.1" Type="raw" />
</Property>
</Fragment>
</Wix>

31
src/wixlib/NetFx1.wxs Normal file
Просмотреть файл

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 1.0 - http://msdn.microsoft.com/library/ms994349.aspx
-->
<!-- set to 3321-3705 if the .NET Framework 1.0 is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK10" Secure="yes">
<RegistrySearch Id="NetFramework10" Root="HKLM" Key="SOFTWARE\Microsoft\.NETFramework\policy\v1.0" Name="3705" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 1.0 redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK10INSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx10Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
<DirectorySearch Id="NetFx10InstallRootSearch" Path="v1.0.3705" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
</Wix>

201
src/wixlib/NetFx2.wxs Normal file
Просмотреть файл

@ -0,0 +1,201 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 2.0 - http://msdn.microsoft.com/library/aa480243.aspx
-->
<!-- set to #1 if the .NET Framework 2.0 is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20" Secure="yes">
<RegistrySearch Id="NetFramework20" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the service pack level for the .NET Framework 2.0. -->
<Fragment>
<Property Id="NETFRAMEWORK20_SP_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework20SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="SP" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 2.0 redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK20INSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx20Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
<DirectorySearch Id="NetFx20InstallRootSearch" Path="v2.0.50727" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- Location of .NET Framework 2.0 (64-bit) redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK20INSTALLROOTDIR64" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx20Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes">
<DirectorySearch Id="NetFx20InstallRootSearch64" Path="v2.0.50727" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 2.0 Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK20_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK20TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- location of the .NET Framework 2.0 SDK installation root -->
<Fragment>
<Property Id="NETFRAMEWORK20SDKDIR" Secure="yes">
<RegistrySearch Id="NetFramework20SDKDir" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="sdkInstallRootv2.0" Type="raw" />
</Property>
</Fragment>
</Wix>

241
src/wixlib/NetFx3.5.wxs Normal file
Просмотреть файл

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following locations:
.NET Framework 3.5 - http://msdn.microsoft.com/library/cc160716.aspx
.NET Framework 3.5 client profile - http://download.microsoft.com/download/5/a/a/5aa86d6c-969b-42d8-bc6b-30e02bfeccf0/NETFXClientProfile_DeploymentGuide.htm
-->
<!-- Indicates the service pack level for the .NET Framework 3.5 (for bundles). -->
<Fragment>
<util:RegistrySearch
Id="NETFRAMEWORK35_SP_LEVEL"
Variable="NETFRAMEWORK35_SP_LEVEL"
Root="HKLM"
Key="Software\Microsoft\NET Framework Setup\NDP\v3.5"
Value="SP"
Result="value" />
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35" Secure="yes">
<RegistrySearch Id="NetFramework35" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the service pack level for the .NET Framework 3.5. -->
<Fragment>
<Property Id="NETFRAMEWORK35_SP_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework35SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5" Name="SP" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 3.5 redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK35INSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx35Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
<DirectorySearch Id="NetFx35InstallRootSearch" Path="v3.5" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- Location of .NET Framework 3.5 (64-bit) redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK35INSTALLROOTDIR64" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx35Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes">
<DirectorySearch Id="NetFx35InstallRootSearch64" Path="v3.5" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.5\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.5 client profile is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK35_CLIENT" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ClientSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the service pack level for the .NET Framework 3.5 client profile -->
<Fragment>
<Property Id="NETFRAMEWORK35_CLIENT_SP_LEVEL" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK35ClientSpSearch" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\DotNetClient\v3.5" Name="SP" Type="raw" />
</Property>
</Fragment>
<!-- location of the Windows SDK 6.0a installation root -->
<Fragment>
<Property Id="WINDOWSSDK60ADIR" Secure="yes">
<RegistrySearch Id="WindowsSdk60aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.0A" Name="InstallationFolder" Type="raw" />
</Property>
</Fragment>
<!-- location of the Windows SDK 6.1 installation root -->
<Fragment>
<Property Id="WINDOWSSDK61DIR" Secure="yes">
<RegistrySearch Id="WindowsSdk61Dir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v6.1" Name="InstallationFolder" Type="raw" />
</Property>
</Fragment>
<!-- location of the Windows SDK 7.0 installation root -->
<Fragment>
<Property Id="WINDOWSSDK70ADIR" Secure="yes">
<RegistrySearch Id="WindowsSdk70aDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows\v7.0A" Name="InstallationFolder" Type="raw" />
</Property>
</Fragment>
</Wix>

195
src/wixlib/NetFx3.wxs Normal file
Просмотреть файл

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 3.0 - http://msdn.microsoft.com/library/aa964979.aspx
-->
<!-- set to #1 if the .NET Framework 3.0 is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30" Secure="yes">
<RegistrySearch Id="NetFramework30" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" Name="InstallSuccess" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the service pack level for the .NET Framework 3.0. -->
<!-- This value will not exist until a service pack is installed. -->
<Fragment>
<Property Id="NETFRAMEWORK30_SP_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework30SP" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0" Name="SP" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 3.0 redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK30INSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx30Search" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot">
<DirectorySearch Id="NetFx30InstallRootSearch" Path="v3.0" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- Location of .NET Framework 3.0 (64-bit) redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK30INSTALLROOTDIR64" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx30Search64" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" Win64="yes">
<DirectorySearch Id="NetFx30InstallRootSearch64" Path="v3.0" Depth="0" />
</RegistrySearch>
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 3.0 Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK30_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK30TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v3.0\Setup\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
</Wix>

274
src/wixlib/NetFx4.5.wxs Normal file
Просмотреть файл

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.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
-->
<?define NetFx45MinRelease = 378389?>
<?define NetFx45WebLink = http://go.microsoft.com/fwlink/?LinkId=225704 ?>
<?define NetFx45RedistLink = http://go.microsoft.com/fwlink/?LinkId=225702 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx45MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearch
Id="NETFRAMEWORK45"
Variable="NETFRAMEWORK45"
Root="HKLM"
Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Release"
Result="value" />
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx45WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx45MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx45WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx45WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx45Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullWebLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx45WebDetectCondition)"
InstallCondition="!(wix.NetFx45WebInstallCondition)"
Id="NetFx45Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx45WebLink)"
LogPathVariable="NetFx45FullWebLog"
Compressed="no"
Name="!(wix.NetFx45WebPackageDirectory)dotNetFx45_Full_setup.exe">
<RemotePayload
Size="1005568"
Version="4.5.50709.17929"
ProductName="Microsoft .NET Framework 4.5"
Description="Microsoft .NET Framework 4.5 Setup"
CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D"
CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255"
Hash="F6BA6F03C65C3996A258F58324A917463B2D6FF4"/>
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx45RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx45MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx45RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx45RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx45Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx45FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx45RedistDetectCondition)"
InstallCondition="!(wix.NetFx45RedistInstallCondition)"
Id="NetFx45Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx45RedistLink)"
LogPathVariable="NetFx45FullLog"
Compressed="no"
Name="!(wix.NetFx45RedistPackageDirectory)dotNetFx45_Full_x86_x64.exe">
<RemotePayload
Size="50352408"
Version="4.5.50709.17929"
ProductName="Microsoft .NET Framework 4.5"
Description="Microsoft .NET Framework 4.5 Setup"
CertificatePublicKey="BE931A1B869E4BB989C2B32D0C105204ECBEFB3D"
CertificateThumbprint="8363887511B4835B79C383ECF06FC055B5839255"
Hash="B2FF712CA0947040CA0B8E9BD7436A3C3524BB5D"/>
</ExePackage>
</PackageGroup>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45" Secure="yes">
<RegistrySearch Id="NetFramework45" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Arabic language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_AR_SA_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45ArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Chinese (Simplified) language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45ZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Chinese (Traditional) language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45ZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Czech language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45CsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Danish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45DaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Dutch language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45NlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Finnish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45FiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 French language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45FrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 German language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45DeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Greek language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45ElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Hebrew language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_HE_IL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45HeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Hungarian language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45HuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Italian language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45ItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Japanese language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45JaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Korean language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45KoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Norwegian language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45NbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Polish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45PlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Portuguese (Brazil) language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45PtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Portuguese (Portugal) language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45PtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Russian language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45RuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Spanish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45EsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Swedish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45SvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Release" Type="raw" />
</Property>
</Fragment>
<!-- set to Release number of the .NET Framework 4.5 Turkish language pack if installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK45_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK45TrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Release" Type="raw" />
</Property>
</Fragment>
</Wix>

543
src/wixlib/NetFx4.wxs Normal file
Просмотреть файл

@ -0,0 +1,543 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 4.0 full & client - http://msdn.microsoft.com/en-us/library/ee942965.aspx
-->
<?define NetFx40WebLink = http://go.microsoft.com/fwlink/?linkid=182805 ?>
<?define NetFx40RedistLink = http://go.microsoft.com/fwlink/?LinkId=247729 ?>
<?define NetFx40ClientWebLink = http://go.microsoft.com/fwlink/?linkid=182804 ?>
<?define NetFx40ClientRedistLink = http://go.microsoft.com/fwlink/?LinkId=247730 ?>
<Fragment>
<PropertyRef Id="NETFRAMEWORK40FULL" />
<Property Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED" Value="1" After="AppSearch">
NETFRAMEWORK40FULL
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearch
Id="NETFRAMEWORK40"
Variable="NETFRAMEWORK40"
Root="HKLM"
Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
Value="Install"
Result="value" />
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup Id="NetFx40Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
PerMachine="yes"
DetectCondition="NETFRAMEWORK40"
Id="NetFx40Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx40WebLink)"
Compressed="no"
Name="redist\dotNetFx40_Full_setup.exe">
<RemotePayload
Size="889416"
Version="4.0.30319.1"
ProductName="Microsoft .NET Framework 4"
Description="Microsoft .NET Framework 4 Setup"
CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
Hash="06BECADB92A5FCCA2529C0B93687C2A0C6D0D610"/>
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40"/>
<PackageGroup Id="NetFx40Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
PerMachine="yes"
DetectCondition="NETFRAMEWORK40"
Id="NetFx40Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx40RedistLink)"
Compressed="no"
Name="redist\dotNetFx40_Full_x86_x64.exe">
<RemotePayload
Size="50449456"
Version="4.0.30319.1"
ProductName="Microsoft .NET Framework 4"
Description="Microsoft .NET Framework 4 Setup"
CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
Hash="58DA3D74DB353AAD03588CBB5CEA8234166D8B99"/>
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearch
Id="NETFRAMEWORK40CLIENT"
Variable="NETFRAMEWORK40CLIENT"
Root="HKLM"
Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client"
Value="Install"
Result="value" />
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/>
<PackageGroup Id="NetFx40ClientWeb">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
PerMachine="yes"
DetectCondition="NETFRAMEWORK40CLIENT"
Id="NetFx40ClientWeb"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx40ClientWebLink)"
Compressed="no"
Name="redist\dotNetFx40_Client_setup.exe">
<RemotePayload
Size="887896"
Version="4.0.30319.1"
ProductName="Microsoft .NET Framework 4 Client Profile"
Description="Microsoft .NET Framework 4 Client Profile Setup"
CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
Hash="E15AD80FC74277EF2048312E9A71AF56B2EBA622"/>
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK40CLIENT"/>
<PackageGroup Id="NetFx40ClientRedist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot;"
PerMachine="yes"
DetectCondition="NETFRAMEWORK40CLIENT"
Id="NetFx40ClientRedist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx40ClientRedistLink)"
Compressed="no"
Name="redist\dotNetFx40_Client_x86_x64.exe">
<RemotePayload
Size="43000680"
Version="4.0.30319.1"
ProductName="Microsoft .NET Framework 4 Client Profile"
Description="Microsoft .NET Framework 4 Client Profile Setup"
CertificatePublicKey="672605E36DD71EC6B8325B91C5FE6971390CB6B6"
CertificateThumbprint="9617094A1CFB59AE7C1F7DFDB6739E4E7C40508F"
Hash="4CD67F609F89D617D2B206341B8C211E1B88B287"/>
</ExePackage>
</PackageGroup>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 client is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT" Secure="yes">
<RegistrySearch Id="NetFramework40Client" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the servicing level for the .NET Framework 4.0 client. -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_SERVICING_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework40ClientServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="Servicing" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 4.0 client redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx40Client" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 4.0 client (64-bit) redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENTINSTALLROOTDIR64" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx40Client64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client" Name="InstallPath" Type="raw" Win64="yes" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 full is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL" Secure="yes">
<RegistrySearch Id="NetFramework40Full" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- Indicates the servicing level for the .NET Framework 4.0 full. -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_SERVICING_LEVEL" Secure="yes">
<RegistrySearch Id="NetFramework40FullServicing" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Servicing" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 4.0 full redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx40Full" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" />
</Property>
</Fragment>
<!-- Location of .NET Framework 4.0 full (64-bit) redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORK40FULLINSTALLROOTDIR64" Secure="yes">
<RegistrySearch Id="NetFxInstallRootForNetfx40Full64" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full" Name="InstallPath" Type="raw" Win64="yes" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Arabic language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_AR_SA_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1025" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Hebrew language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_HE_IL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1037" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Client Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40CLIENT_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40CLIENTTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Client\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Arabic language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_AR_SA_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLArSaLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1025" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Chinese (Simplified) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_ZH_CN_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLZhCnLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2052" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Chinese (Traditional) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_ZH_TW_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLZhTwLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1028" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Czech language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_CS_CZ_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLCsCzLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1029" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Danish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_DA_DK_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLDaDkLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1030" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Dutch language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_NL_NL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLNlNlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1043" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Finnish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_FI_FI_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLFiFiLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1035" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full French language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_FR_FR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLFrFrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1036" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full German language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_DE_DE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLDeDeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1031" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Greek language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_EL_GR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLElGrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1032" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Hebrew language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_HE_IL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLHeIlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1037" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Hungarian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_HU_HU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLHuHuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1038" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Italian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_IT_IT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLItItLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1040" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Japanese language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_JA_JP_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLJaJpLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1041" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Korean language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_KO_KR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLKoKrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1042" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Norwegian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_NB_NO_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLNbNoLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1044" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Polish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_PL_PL_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLPlPlLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1045" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Brazil) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_PT_BR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLPtBrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1046" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Portuguese (Portugal) language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_PT_PT_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLPtPtLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\2070" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Russian language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_RU_RU_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLRuRuLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1049" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Spanish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_ES_ES_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLEsEsLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\3082" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Swedish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_SV_SE_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLSvSeLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1053" Name="Install" Type="raw" />
</Property>
</Fragment>
<!-- set to #1 if the .NET Framework 4.0 Full Turkish language pack is installed (not set otherwise) -->
<Fragment>
<Property Id="NETFRAMEWORK40FULL_TR_TR_LANGPACK" Secure="yes">
<RegistrySearch Id="NETFRAMEWORK40FULLTrTrLp" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full\1055" Name="Install" Type="raw" />
</Property>
</Fragment>
</Wix>

96
src/wixlib/NetFx451.wxs Normal file
Просмотреть файл

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.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
-->
<?define NetFx451MinRelease = 378675 ?>
<?define NetFx451WebLink = http://go.microsoft.com/fwlink/?LinkId=322115 ?>
<?define NetFx451RedistLink = http://go.microsoft.com/fwlink/?LinkId=322116 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx451MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx451WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx451MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx451WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx451WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx451Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullWebLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx451WebDetectCondition)"
InstallCondition="!(wix.NetFx451WebInstallCondition)"
Id="NetFx451Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx451WebLink)"
LogPathVariable="NetFx451FullWebLog"
Compressed="no"
Name="!(wix.NetFx451WebPackageDirectory)NDP451-KB2859818-Web.exe">
<RemotePayload
Size="1021432"
Version="4.5.50938.18408"
ProductName="Microsoft .NET Framework 4.5.1"
Description="Microsoft .NET Framework 4.5.1 Setup"
CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41"
CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE"
Hash="4CBEA1E408DB5B423E130931B9478972E6798431" />
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx451RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx451MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx451RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx451RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx451Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx451FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx451RedistDetectCondition)"
InstallCondition="!(wix.NetFx451RedistInstallCondition)"
Id="NetFx451Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx451RedistLink)"
LogPathVariable="NetFx451FullLog"
Compressed="no"
Name="!(wix.NetFx451RedistPackageDirectory)NDP451-KB2858728-x86-x64-AllOS-ENU.exe">
<RemotePayload
Size="70087104"
Version="4.5.50938.18408"
ProductName="Microsoft .NET Framework 4.5.1"
Description="Microsoft .NET Framework 4.5.1 Setup"
CertificatePublicKey="A260A870BE1145ED71E2BB5AA19463A4FE9DCC41"
CertificateThumbprint="108E2BA23632620C427C570B6D9DB51AC31387FE"
Hash="5934DD101414BBC0B7F1EE2780D2FC8B9BEC5C4D" />
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>

95
src/wixlib/NetFx452.wxs Normal file
Просмотреть файл

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 4.5/4.5.1/4.5.2 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
-->
<?define NetFx452MinRelease = 379893 ?>
<?define NetFx452WebLink = http://go.microsoft.com/fwlink/?LinkId=397707 ?>
<?define NetFx452RedistLink = http://go.microsoft.com/fwlink/?LinkId=397708 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx452MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx452WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx452MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx452WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx452WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx452Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullWebLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx452WebDetectCondition)"
InstallCondition="!(wix.NetFx452WebInstallCondition)"
Id="NetFx452Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx452WebLink)"
LogPathVariable="NetFx452FullWebLog"
Compressed="no"
Name="!(wix.NetFx452WebPackageDirectory)NDP452-KB2901954-Web.exe">
<RemotePayload CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0"
CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080"
Description="Microsoft .NET Framework 4.5.2 Setup"
Hash="5B71B20A455F6EEAB79DD1EDCAB0BA66AD0D2208"
ProductName="Microsoft .NET Framework 4.5.2"
Size="1118920"
Version="4.5.51209.34209" />
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx452RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx452MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx452RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx452RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx452Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx452FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx452RedistDetectCondition)"
InstallCondition="!(wix.NetFx452RedistInstallCondition)"
Id="NetFx452Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx452RedistLink)"
LogPathVariable="NetFx452FullLog"
Compressed="no"
Name="!(wix.NetFx452RedistPackageDirectory)NDP452-KB2901907-x86-x64-AllOS-ENU.exe">
<RemotePayload
CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0"
CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080"
Description="Microsoft .NET Framework 4.5.2 Setup"
Hash="89F86F9522DC7A8A965FACCE839ABB790A285A63"
ProductName="Microsoft .NET Framework 4.5.2"
Size="69999448"
Version="4.5.51209.34209" />
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>

96
src/wixlib/NetFx46.wxs Normal file
Просмотреть файл

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.NET Framework 4.5/4.5.1/4.5.2/4.6 - http://msdn.microsoft.com/en-us/library/w0x726c2(v=vs.110).aspx
-->
<?define NetFx46MinRelease = 393295 ?>
<?define NetFx46WebLink = http://go.microsoft.com/fwlink/?LinkId=560371 ?>
<?define NetFx46RedistLink = http://go.microsoft.com/fwlink/?LinkId=560369 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx46MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx46WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx46MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx46WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx46WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx46Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx46WebDetectCondition)"
InstallCondition="!(wix.NetFx46WebInstallCondition)"
Id="NetFx46Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx46WebLink)"
LogPathVariable="NetFx46FullLog"
Compressed="no"
Name="!(wix.NetFx46WebPackageDirectory)NDP46-KB3045560-Web.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6 Setup"
Hash="480CA134B9E3F2437DF10719D5A8C77DDEC0A4F1"
ProductName="Microsoft .NET Framework 4.6"
Size="1497400"
Version="4.6.81.0" />
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx46RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx46MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx46RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx46RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx46Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx46FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx46RedistDetectCondition)"
InstallCondition="!(wix.NetFx46RedistInstallCondition)"
Id="NetFx46Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx46RedistLink)"
LogPathVariable="NetFx46FullLog"
Compressed="no"
Name="!(wix.NetFx46RedistPackageDirectory)NDP46-KB3045557-x86-x64-AllOS-ENU.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6 Setup"
Hash="3049A85843EAF65E89E2336D5FE6E85E416797BE"
ProductName="Microsoft .NET Framework 4.6"
Size="65444688"
Version="4.6.81.0" />
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>

95
src/wixlib/NetFx461.wxs Normal file
Просмотреть файл

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.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
-->
<?define NetFx461MinRelease = 394254 ?>
<?define NetFx461WebLink = http://go.microsoft.com/fwlink/?LinkId=671728 ?>
<?define NetFx461RedistLink = http://go.microsoft.com/fwlink/?LinkId=671743 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx461MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx461WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx461WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx461WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx461Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx461WebDetectCondition)"
InstallCondition="!(wix.NetFx461WebInstallCondition)"
Id="NetFx461Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx461WebLink)"
LogPathVariable="NetFx461FullLog"
Compressed="no"
Name="!(wix.NetFx461WebPackageDirectory)NDP461-KB3102438-Web.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6.1 Setup"
Hash="EE88B05232F43B517D4A368F7EE5065CDE7F67FA"
ProductName="Microsoft .NET Framework 4.6.1"
Size="1424328"
Version="4.6.1055.0" />
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx461RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx461MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx461RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx461RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx461Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx461FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx461RedistDetectCondition)"
InstallCondition="!(wix.NetFx461RedistInstallCondition)"
Id="NetFx461Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx461RedistLink)"
LogPathVariable="NetFx461FullLog"
Compressed="no"
Name="!(wix.NetFx461RedistPackageDirectory)NDP461-KB3102436-x86-x64-AllOS-ENU.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6.1 Setup"
Hash="83D048D171FF44A3CAD9B422137656F585295866"
ProductName="Microsoft .NET Framework 4.6.1"
Size="67681000"
Version="4.6.1055.0" />
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>

95
src/wixlib/NetFx462.wxs Normal file
Просмотреть файл

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<!--
.NET Framework installation state properties
Official documentation can be found at the following location:
.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
-->
<?define NetFx462MinRelease = 394802 ?>
<?define NetFx462WebLink = http://go.microsoft.com/fwlink/?LinkId=780596 ?>
<?define NetFx462RedistLink = http://go.microsoft.com/fwlink/?LinkId=780600 ?>
<Fragment>
<PropertyRef Id="WIXNETFX4RELEASEINSTALLED" />
<Property Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Secure="yes" />
<SetProperty Id="WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED" Value="1" After="AppSearch">
WIXNETFX4RELEASEINSTALLED >= "#$(var.NetFx462MinRelease)"
</SetProperty>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx462WebDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx462MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx462WebInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx462WebPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx462Web">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx462WebDetectCondition)"
InstallCondition="!(wix.NetFx462WebInstallCondition)"
Id="NetFx462Web"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx462WebLink)"
LogPathVariable="NetFx462FullLog"
Compressed="no"
Name="!(wix.NetFx462WebPackageDirectory)NDP462-KB3151802-Web.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6.2 Setup"
Hash="C42E6ED280290648BBD59F664008852F4CFE4548"
ProductName="Microsoft .NET Framework 4.6.2"
Size="1429344"
Version="4.6.1590.0" />
</ExePackage>
</PackageGroup>
</Fragment>
<Fragment>
<util:RegistrySearchRef Id="NETFRAMEWORK45"/>
<WixVariable Id="NetFx462RedistDetectCondition" Value="NETFRAMEWORK45 &gt;= $(var.NetFx462MinRelease)" Overridable="yes" />
<WixVariable Id="NetFx462RedistInstallCondition" Value="" Overridable="yes" />
<WixVariable Id="NetFx462RedistPackageDirectory" Value="redist\" Overridable="yes" />
<PackageGroup Id="NetFx462Redist">
<ExePackage
InstallCommand="/q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
RepairCommand="/q /norestart /repair /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
UninstallCommand="/uninstall /q /norestart /ChainingPackage &quot;[WixBundleName]&quot; /log &quot;[NetFx462FullLog].html&quot;"
PerMachine="yes"
DetectCondition="!(wix.NetFx462RedistDetectCondition)"
InstallCondition="!(wix.NetFx462RedistInstallCondition)"
Id="NetFx462Redist"
Vital="yes"
Permanent="yes"
Protocol="netfx4"
DownloadUrl="$(var.NetFx462RedistLink)"
LogPathVariable="NetFx462FullLog"
Compressed="no"
Name="!(wix.NetFx462RedistPackageDirectory)NDP462-KB3151800-x86-x64-AllOS-ENU.exe">
<RemotePayload
CertificatePublicKey="52868DFCA6E3AF2632389E6C1EE7D0468D3797D0"
CertificateThumbprint="3BDA323E552DB1FDE5F4FBEE75D6D5B2B187EEDC"
Description="Microsoft .NET Framework 4.6.2 Setup"
Hash="A70F856BDA33D45AD0A8AD035F73092441715431"
ProductName="Microsoft .NET Framework 4.6.2"
Size="62008080"
Version="4.6.1590.0" />
</ExePackage>
</PackageGroup>
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<!--
.NET Framework installation state properties
-->
<!-- Location of .NET Framework redistributable install root directory -->
<Fragment>
<Property Id="NETFRAMEWORKINSTALLROOTDIR" Secure="yes">
<RegistrySearch Id="NetFxInstallRootSearch" Type="raw" Root="HKLM" Key="Software\Microsoft\.NETFramework" Name="InstallRoot" />
</Property>
</Fragment>
<!-- location of the Windows SDK current active version installation root -->
<Fragment>
<Property Id="WINDOWSSDKCURRENTVERSIONDIR" Secure="yes">
<RegistrySearch Id="WindowsSdkCurrentVersionDir" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentInstallFolder" Type="raw" />
</Property>
</Fragment>
<!-- The Windows SDK current active version -->
<Fragment>
<Property Id="WINDOWSSDKCURRENTVERSION" Secure="yes">
<RegistrySearch Id="WindowsSdkCurrentVersion" Root="HKLM" Key="Software\Microsoft\Microsoft SDKs\Windows" Name="CurrentVersion" Type="raw" />
</Property>
</Fragment>
<!-- Release value of .NET 4.5 and later -->
<Fragment>
<Property Id="WIXNETFX4RELEASEINSTALLED" Secure="yes">
<RegistrySearch Id="NetFx4ReleaseInstalled" Root="HKLM" Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" Name="Release" Type="raw" />
</Property>
</Fragment>
</Wix>

Просмотреть файл

@ -0,0 +1,28 @@
<?xml version="1.0"?>
<!-- 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. -->
<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?include caSuffix.wxi ?>
<Fragment>
<CustomAction Id="NetFxScheduleNativeImage$(var.Suffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="SchedNetFx" Execute="immediate" Return="check" SuppressModularization="yes" />
<CustomAction Id="NetFxExecuteNativeImageInstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" />
<CustomAction Id="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" />
<CustomAction Id="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="deferred" Impersonate="no" Return="ignore" SuppressModularization="yes" />
<CustomAction Id="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" BinaryKey="NetFxCA$(var.Suffix)" DllEntry="ExecNetFx" Execute="commit" Impersonate="no" Return="ignore" SuppressModularization="yes" />
<InstallExecuteSequence>
<Custom Action="NetFxScheduleNativeImage$(var.Suffix)" Before="InstallFiles" Overridable="yes" />
<Custom Action="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" After="MsiPublishAssemblies" Overridable="yes">RollbackDisabled &lt;&gt; 1</Custom>
<Custom Action="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom>
<Custom Action="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageUninstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled &lt;&gt; 1</Custom>
<Custom Action="NetFxExecuteNativeImageInstall$(var.DeferredSuffix)" After="NetFxExecuteNativeImageCommitInstall$(var.DeferredSuffix)" Overridable="yes">RollbackDisabled = 1</Custom>
</InstallExecuteSequence>
</Fragment>
<!-- NetFx Custom Action DLL Definitions -->
<Fragment>
<Binary Id="NetFxCA$(var.Suffix)" SourceFile="!(bindpath.$(var.platform))netfxca.dll" />
</Fragment>
</Include>

Просмотреть файл

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<!-- 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. -->
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?define platform=x86 ?>
<?include NetfxExtension_Platform.wxi ?>
</Wix>

28
src/wixlib/caSuffix.wxi Normal file
Просмотреть файл

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?ifndef platform ?>
<?error Required value "platform" not defined in include caSuffix.wxi ?>
<?endif ?>
<?ifdef Suffix ?>
<?undef Suffix ?>
<?undef DeferredSuffix ?>
<?endif ?>
<?if $(var.platform)="x86" ?>
<?define Suffix="" ?>
<?define DeferredSuffix="" ?>
<?endif ?>
<?if $(var.platform)="x64" ?>
<?define Suffix="_x64" ?>
<?define DeferredSuffix="_64" ?>
<?endif ?>
<?if $(var.platform)="arm" ?>
<?define Suffix="_ARM" ?>
<?define DeferredSuffix="_ARM" ?>
<?endif ?>
</Include>

53
src/wixlib/netfx.wixproj Normal file
Просмотреть файл

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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. -->
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="15.0">
<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')" />
<Import Project="..\FindLocalWix.props" />
<PropertyGroup>
<ProjectGuid>{45e4a6ac-3190-4e17-83f0-9935ffa5dc2b}</ProjectGuid>
<OutputName>netfx</OutputName>
<OutputType>Library</OutputType>
<BindFiles>true</BindFiles>
<Pedantic>true</Pedantic>
</PropertyGroup>
<ItemGroup>
<Compile Include="NetFxExtension.wxs" />
<Compile Include="NetFx1.wxs" />
<Compile Include="NetFx1.1.wxs" />
<Compile Include="NetFx2.wxs" />
<Compile Include="NetFx3.wxs" />
<Compile Include="NetFx3.5.wxs" />
<Compile Include="NetFx4.wxs" />
<Compile Include="NetFx4.5.wxs" />
<Compile Include="NetFx451.wxs" />
<Compile Include="NetFx452.wxs" />
<Compile Include="NetFx46.wxs" />
<Compile Include="NetFx461.wxs" />
<Compile Include="NetFx462.wxs" />
<Compile Include="NetFxExtension_x86.wxs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ca\netfxca.vcxproj">
<Name>netfxca</Name>
<Project>{F72D34CA-48DA-4DFD-91A9-A0C78BEF6981}</Project>
</ProjectReference>
</ItemGroup>
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' AND Exists('$(WixTargetsPath)') " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets" Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\wix.targets') " />
<Target Name="EnsureWixToolsetInstalled" Condition=" '$(WixTargetsImported)' != 'true' ">
<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/." />
</Target>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<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>
</PropertyGroup>
<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'))" />
<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'))" />
<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'))" />
</Target>
<Import Project="..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets" Condition="Exists('..\..\packages\Nerdbank.GitVersioning.2.1.7\build\Nerdbank.GitVersioning.targets')" />
<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')" />
</Project>

Просмотреть файл

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Nerdbank.GitVersioning" version="2.1.7" developmentDependency="true" targetFramework="net40" />
<package id="WixToolset.Core.InternalPackage" version="4.0.64" targetFramework="net40" developmentDependency="true" />
<package id="WixToolset.Util.wixext" version="4.0.1" targetFramework="net40" />
</packages>

11
version.json Normal file
Просмотреть файл

@ -0,0 +1,11 @@
{
"version": "4.0",
"publicReleaseRefSpec": [
"^refs/heads/master$"
],
"cloudBuild": {
"buildNumber": {
"enabled": true
}
}
}