aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStaffan Gustafsson <staffangu@outlook.com>2022-11-30 17:15:12 +0100
committerSean Hall <r.sean.hall@gmail.com>2023-01-18 18:10:56 -0600
commit853887b4e84df1965794802b7683f3a9aca3e930 (patch)
treec2db272b63381c94186712c0029ed0e000ec3391
parent9f368d76848e31d21ec3c193fa8c92849b1362a1 (diff)
downloadwix-853887b4e84df1965794802b7683f3a9aca3e930.tar.gz
wix-853887b4e84df1965794802b7683f3a9aca3e930.tar.bz2
wix-853887b4e84df1965794802b7683f3a9aca3e930.zip
Adding support for DotNetCoreSdkSearch and DotNetCoreSdkCompatibilityCheck
-rw-r--r--src/ext/NetFx/be/detectnetcore.cpp2
-rw-r--r--src/ext/NetFx/be/detectnetcoresdk.cpp122
-rw-r--r--src/ext/NetFx/be/detectnetcoresdk.h9
-rw-r--r--src/ext/NetFx/be/netfxbe.vcxproj2
-rw-r--r--src/ext/NetFx/be/netfxsearch.cpp25
-rw-r--r--src/ext/NetFx/be/netfxsearch.h6
-rw-r--r--src/ext/NetFx/be/precomp.h1
-rw-r--r--src/ext/NetFx/netcoresearch/netcoresearch.cpp216
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs19
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs19
-rw-r--r--src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi14
-rw-r--r--src/ext/NetFx/wixext/NetFxCompiler.cs293
-rw-r--r--src/ext/NetFx/wixext/NetfxTableDefinitions.cs2
-rw-r--r--src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs34
-rw-r--r--src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs64
-rw-r--r--src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs9
-rw-r--r--src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs19
-rw-r--r--src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi14
-rw-r--r--src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs19
19 files changed, 770 insertions, 119 deletions
diff --git a/src/ext/NetFx/be/detectnetcore.cpp b/src/ext/NetFx/be/detectnetcore.cpp
index 42156692..aeb04203 100644
--- a/src/ext/NetFx/be/detectnetcore.cpp
+++ b/src/ext/NetFx/be/detectnetcore.cpp
@@ -60,7 +60,7 @@ HRESULT DetectNetCore(
60 hr = StrAllocFormatted(&sczExePath, L"%ls%ls\\netcoresearch.exe", wzBaseDirectory, wzPlatformName); 60 hr = StrAllocFormatted(&sczExePath, L"%ls%ls\\netcoresearch.exe", wzBaseDirectory, wzPlatformName);
61 BextExitOnFailure(hr, "Failed to build netcoresearch.exe path."); 61 BextExitOnFailure(hr, "Failed to build netcoresearch.exe path.");
62 62
63 hr = StrAllocFormatted(&sczCommandLine, L"\"%ls\" %ls %ls", sczExePath, wzMajorVersion, wzRuntimeType); 63 hr = StrAllocFormatted(&sczCommandLine, L"\"%ls\" runtime %ls %ls", sczExePath, wzMajorVersion, wzRuntimeType);
64 BextExitOnFailure(hr, "Failed to build netcoresearch.exe command line."); 64 BextExitOnFailure(hr, "Failed to build netcoresearch.exe command line.");
65 65
66 hr = ProcExecute(sczExePath, sczCommandLine, &hProcess, NULL, &hStdOutErr); 66 hr = ProcExecute(sczExePath, sczCommandLine, &hProcess, NULL, &hStdOutErr);
diff --git a/src/ext/NetFx/be/detectnetcoresdk.cpp b/src/ext/NetFx/be/detectnetcoresdk.cpp
new file mode 100644
index 00000000..08b18334
--- /dev/null
+++ b/src/ext/NetFx/be/detectnetcoresdk.cpp
@@ -0,0 +1,122 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3#include "precomp.h"
4
5HRESULT DetectNetCoreSdk(
6 __in NETFX_NET_CORE_PLATFORM platform,
7 __in LPCWSTR wzVersion,
8 __in LPCWSTR wzBaseDirectory,
9 __inout LPWSTR* psczLatestVersion
10 )
11{
12 HRESULT hr = S_OK;
13 LPCWSTR wzPlatformName = NULL;
14 LPWSTR sczExePath = NULL;
15 LPWSTR sczCommandLine = NULL;
16 HANDLE hProcess = NULL;
17 HANDLE hStdOutErr = INVALID_HANDLE_VALUE;
18 BYTE* rgbOutput = NULL;
19 DWORD cbOutput = 0;
20 DWORD cbTotalRead = 0;
21 DWORD cbRead = 0;
22 DWORD dwExitCode = 0;
23
24 ReleaseNullStr(*psczLatestVersion);
25
26 switch (platform)
27 {
28 case NETFX_NET_CORE_PLATFORM_ARM64:
29 wzPlatformName = L"arm64";
30 break;
31 case NETFX_NET_CORE_PLATFORM_X64:
32 wzPlatformName = L"x64";
33 break;
34 case NETFX_NET_CORE_PLATFORM_X86:
35 wzPlatformName = L"x86";
36 break;
37 default:
38 BextExitWithRootFailure(hr, E_INVALIDARG, "Unknown platform: %u", platform);
39 break;
40 }
41
42 hr = StrAllocFormatted(&sczExePath, L"%ls%ls\\netcoresearch.exe", wzBaseDirectory, wzPlatformName);
43 BextExitOnFailure(hr, "Failed to build netcoresearch.exe path.");
44
45 hr = StrAllocFormatted(&sczCommandLine, L"\"%ls\" sdk %ls", sczExePath, wzVersion);
46 BextExitOnFailure(hr, "Failed to build netcoresearch.exe command line.");
47
48 hr = ProcExecute(sczExePath, sczCommandLine, &hProcess, NULL, &hStdOutErr);
49 if (HRESULT_FROM_WIN32(ERROR_EXE_MACHINE_TYPE_MISMATCH) == hr)
50 {
51 ExitFunction1(hr = S_FALSE);
52 }
53 BextExitOnFailure(hr, "Failed to run: %ls", sczCommandLine);
54
55 cbOutput = 64;
56
57 rgbOutput = static_cast<BYTE*>(MemAlloc(cbOutput, TRUE));
58 BextExitOnNull(rgbOutput, hr, E_OUTOFMEMORY, "Failed to alloc output string.");
59
60 while (::ReadFile(hStdOutErr, rgbOutput + cbTotalRead, cbOutput - cbTotalRead, &cbRead, NULL))
61 {
62 cbTotalRead += cbRead;
63
64 if (cbTotalRead == cbOutput)
65 {
66 cbOutput *= 2;
67
68 const LPVOID pvNew = MemReAlloc(rgbOutput, cbOutput, TRUE);
69 BextExitOnNull(pvNew, hr, E_OUTOFMEMORY, "Failed to realloc output string.");
70
71 rgbOutput = static_cast<BYTE*>(pvNew);
72 }
73 }
74
75 if (ERROR_BROKEN_PIPE != ::GetLastError())
76 {
77 BextExitWithLastError(hr, "Failed to read netcoresearch.exe output.");
78 }
79
80 hr = ProcWaitForCompletion(hProcess, INFINITE, &dwExitCode);
81 BextExitOnFailure(hr, "Failed to wait for netcoresearch.exe to exit.");
82
83 if (0 != dwExitCode)
84 {
85 BextExitWithRootFailure(hr, E_UNEXPECTED, "netcoresearch.exe failed with exit code: 0x%x\r\nOutput:\r\n%hs", dwExitCode, rgbOutput);
86 }
87
88 if (*rgbOutput)
89 {
90 hr = StrAllocStringAnsi(psczLatestVersion, reinterpret_cast<LPSTR>(rgbOutput), 0, CP_UTF8);
91 BextExitOnFailure(hr, "Failed to widen output string: %hs", rgbOutput);
92 }
93
94LExit:
95 ReleaseFileHandle(hStdOutErr);
96 ReleaseHandle(hProcess);
97 ReleaseMem(rgbOutput);
98 ReleaseStr(sczCommandLine);
99 ReleaseStr(sczExePath);
100
101 return hr;
102}
103
104HRESULT NetfxPerformDetectNetCoreSdk(
105 __in LPCWSTR wzVariable,
106 __in NETFX_SEARCH* pSearch,
107 __in IBundleExtensionEngine* pEngine,
108 __in LPCWSTR wzBaseDirectory
109 )
110{
111 HRESULT hr = S_OK;
112 LPWSTR sczLatestVersion = nullptr;
113 const auto& searchParams = pSearch->NetCoreSdkSearch;
114 hr = DetectNetCoreSdk(searchParams.platform, searchParams.sczVersion, wzBaseDirectory, &sczLatestVersion);
115 BextExitOnFailure(hr, "DetectNetCoreSdk failed.");
116
117 hr = pEngine->SetVariableVersion(wzVariable, sczLatestVersion);
118 BextExitOnFailure(hr, "Failed to set variable '%ls' to '%ls'", wzVariable, sczLatestVersion);
119
120LExit:
121 return hr;
122}
diff --git a/src/ext/NetFx/be/detectnetcoresdk.h b/src/ext/NetFx/be/detectnetcoresdk.h
new file mode 100644
index 00000000..025deaa2
--- /dev/null
+++ b/src/ext/NetFx/be/detectnetcoresdk.h
@@ -0,0 +1,9 @@
1#pragma once
2// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
3
4HRESULT NetfxPerformDetectNetCoreSdk(
5 __in LPCWSTR wzVariable,
6 __in NETFX_SEARCH* pSearch,
7 __in IBundleExtensionEngine* pEngine,
8 __in LPCWSTR wzBaseDirectory
9 );
diff --git a/src/ext/NetFx/be/netfxbe.vcxproj b/src/ext/NetFx/be/netfxbe.vcxproj
index d1084dd1..0408da72 100644
--- a/src/ext/NetFx/be/netfxbe.vcxproj
+++ b/src/ext/NetFx/be/netfxbe.vcxproj
@@ -47,6 +47,7 @@
47 47
48 <ItemGroup> 48 <ItemGroup>
49 <ClCompile Include="detectnetcore.cpp" /> 49 <ClCompile Include="detectnetcore.cpp" />
50 <ClCompile Include="detectnetcoresdk.cpp" />
50 <ClCompile Include="netfxbe.cpp" /> 51 <ClCompile Include="netfxbe.cpp" />
51 <ClCompile Include="NetfxBundleExtension.cpp" /> 52 <ClCompile Include="NetfxBundleExtension.cpp" />
52 <ClCompile Include="netfxsearch.cpp" /> 53 <ClCompile Include="netfxsearch.cpp" />
@@ -57,6 +58,7 @@
57 58
58 <ItemGroup> 59 <ItemGroup>
59 <ClInclude Include="detectnetcore.h" /> 60 <ClInclude Include="detectnetcore.h" />
61 <ClInclude Include="detectnetcoresdk.h" />
60 <ClInclude Include="NetfxBundleExtension.h" /> 62 <ClInclude Include="NetfxBundleExtension.h" />
61 <ClInclude Include="netfxsearch.h" /> 63 <ClInclude Include="netfxsearch.h" />
62 <ClInclude Include="precomp.h" /> 64 <ClInclude Include="precomp.h" />
diff --git a/src/ext/NetFx/be/netfxsearch.cpp b/src/ext/NetFx/be/netfxsearch.cpp
index 3c12161d..671e7546 100644
--- a/src/ext/NetFx/be/netfxsearch.cpp
+++ b/src/ext/NetFx/be/netfxsearch.cpp
@@ -15,7 +15,7 @@ STDMETHODIMP NetfxSearchParseFromXml(
15 BSTR bstrNodeName = NULL; 15 BSTR bstrNodeName = NULL;
16 16
17 // Select Netfx search nodes. 17 // Select Netfx search nodes.
18 hr = XmlSelectNodes(pixnBundleExtension, L"NetFxNetCoreSearch", &pixnNodes); 18 hr = XmlSelectNodes(pixnBundleExtension, L"NetFxNetCoreSearch|NetFxNetCoreSdkSearch", &pixnNodes);
19 BextExitOnFailure(hr, "Failed to select Netfx search nodes."); 19 BextExitOnFailure(hr, "Failed to select Netfx search nodes.");
20 20
21 // Get Netfx search node count. 21 // Get Netfx search node count.
@@ -50,18 +50,32 @@ STDMETHODIMP NetfxSearchParseFromXml(
50 { 50 {
51 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SEARCH; 51 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SEARCH;
52 52
53 auto& netCoreSearch = pSearch->NetCoreSearch;
53 // @RuntimeType 54 // @RuntimeType
54 hr = XmlGetAttributeUInt32(pixnNode, L"RuntimeType", reinterpret_cast<DWORD*>(&pSearch->NetCoreSearch.runtimeType)); 55 hr = XmlGetAttributeUInt32(pixnNode, L"RuntimeType", reinterpret_cast<DWORD*>(&netCoreSearch.runtimeType));
55 BextExitOnFailure(hr, "Failed to get @RuntimeType."); 56 BextExitOnFailure(hr, "Failed to get @RuntimeType.");
56 57
57 // @Platform 58 // @Platform
58 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&pSearch->NetCoreSearch.platform)); 59 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSearch.platform));
59 BextExitOnFailure(hr, "Failed to get @Platform."); 60 BextExitOnFailure(hr, "Failed to get @Platform.");
60 61
61 // @MajorVersion 62 // @MajorVersion
62 hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &pSearch->NetCoreSearch.sczMajorVersion); 63 hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSearch.sczMajorVersion);
63 BextExitOnFailure(hr, "Failed to get @MajorVersion."); 64 BextExitOnFailure(hr, "Failed to get @MajorVersion.");
64 } 65 }
66 else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"NetFxNetCoreSdkSearch", -1))
67 {
68 pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH;
69
70 auto& netCoreSdkSearch = pSearch->NetCoreSdkSearch;
71 // @Platform
72 hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSdkSearch.platform));
73 BextExitOnFailure(hr, "Failed to get @Platform.");
74
75 // @Version
76 hr = XmlGetAttributeEx(pixnNode, L"Version", &netCoreSdkSearch.sczVersion);
77 BextExitOnFailure(hr, "Failed to get @Version.");
78 }
65 else 79 else
66 { 80 {
67 BextExitWithRootFailure(hr, E_UNEXPECTED, "Unexpected element name: %ls", bstrNodeName); 81 BextExitWithRootFailure(hr, E_UNEXPECTED, "Unexpected element name: %ls", bstrNodeName);
@@ -115,6 +129,9 @@ STDMETHODIMP NetfxSearchExecute(
115 case NETFX_SEARCH_TYPE_NET_CORE_SEARCH: 129 case NETFX_SEARCH_TYPE_NET_CORE_SEARCH:
116 hr = NetfxPerformDetectNetCore(wzVariable, pSearch, pEngine, wzBaseDirectory); 130 hr = NetfxPerformDetectNetCore(wzVariable, pSearch, pEngine, wzBaseDirectory);
117 break; 131 break;
132 case NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH:
133 hr = NetfxPerformDetectNetCoreSdk(wzVariable, pSearch, pEngine, wzBaseDirectory);
134 break;
118 default: 135 default:
119 hr = E_UNEXPECTED; 136 hr = E_UNEXPECTED;
120 } 137 }
diff --git a/src/ext/NetFx/be/netfxsearch.h b/src/ext/NetFx/be/netfxsearch.h
index ae250690..f4e4db01 100644
--- a/src/ext/NetFx/be/netfxsearch.h
+++ b/src/ext/NetFx/be/netfxsearch.h
@@ -8,6 +8,7 @@ enum NETFX_SEARCH_TYPE
8{ 8{
9 NETFX_SEARCH_TYPE_NONE, 9 NETFX_SEARCH_TYPE_NONE,
10 NETFX_SEARCH_TYPE_NET_CORE_SEARCH, 10 NETFX_SEARCH_TYPE_NET_CORE_SEARCH,
11 NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH,
11}; 12};
12 13
13enum NETFX_NET_CORE_RUNTIME_TYPE 14enum NETFX_NET_CORE_RUNTIME_TYPE
@@ -40,6 +41,11 @@ typedef struct _NETFX_SEARCH
40 NETFX_NET_CORE_PLATFORM platform; 41 NETFX_NET_CORE_PLATFORM platform;
41 LPWSTR sczMajorVersion; 42 LPWSTR sczMajorVersion;
42 } NetCoreSearch; 43 } NetCoreSearch;
44 struct
45 {
46 NETFX_NET_CORE_PLATFORM platform;
47 LPWSTR sczVersion;
48 } NetCoreSdkSearch;
43 }; 49 };
44} NETFX_SEARCH; 50} NETFX_SEARCH;
45 51
diff --git a/src/ext/NetFx/be/precomp.h b/src/ext/NetFx/be/precomp.h
index 33aea9bc..4a774200 100644
--- a/src/ext/NetFx/be/precomp.h
+++ b/src/ext/NetFx/be/precomp.h
@@ -30,4 +30,5 @@
30#include "..\..\beDecor.h" 30#include "..\..\beDecor.h"
31#include "netfxsearch.h" 31#include "netfxsearch.h"
32#include "detectnetcore.h" 32#include "detectnetcore.h"
33#include "detectnetcoresdk.h"
33#include "NetfxBundleExtension.h" 34#include "NetfxBundleExtension.h"
diff --git a/src/ext/NetFx/netcoresearch/netcoresearch.cpp b/src/ext/NetFx/netcoresearch/netcoresearch.cpp
index 517f6ac4..5cf6d10b 100644
--- a/src/ext/NetFx/netcoresearch/netcoresearch.cpp
+++ b/src/ext/NetFx/netcoresearch/netcoresearch.cpp
@@ -2,16 +2,36 @@
2 2
3#include "precomp.h" 3#include "precomp.h"
4 4
5enum class NETCORESEARCHKIND
6{
7 None,
8 Runtime,
9 Sdk,
10};
11
5struct NETCORESEARCH_STATE 12struct NETCORESEARCH_STATE
6{ 13{
7 LPCWSTR wzTargetName; 14 NETCORESEARCHKIND Kind = NETCORESEARCHKIND::None;
8 DWORD dwMajorVersion; 15 union
16 {
17 struct
18 {
19 LPCWSTR wzTargetName;
20 DWORD dwMajorVersion;
21 } Runtime;
22 struct
23 {
24 DWORD dwMajorVersion;
25 DWORD dwMinorVersion;
26 DWORD dwFeatureBand;
27 }
28 Sdk;
29 } Data;
9 VERUTIL_VERSION* pVersion; 30 VERUTIL_VERSION* pVersion;
10}; 31};
11 32
12static HRESULT GetDotnetEnvironmentInfo( 33static HRESULT GetDotnetEnvironmentInfo(
13 __in DWORD dwMajorVersion, 34 __in NETCORESEARCH_STATE& pSearchState,
14 __in_z LPCWSTR wzTargetName,
15 __inout VERUTIL_VERSION** ppVersion 35 __inout VERUTIL_VERSION** ppVersion
16 ); 36 );
17static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult( 37static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
@@ -19,24 +39,28 @@ static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
19 __in LPVOID pvContext 39 __in LPVOID pvContext
20 ); 40 );
21 41
42bool string_equal_invariant(__in PCWSTR const x,__in PCWSTR const y) { return CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, x, -1, y, -1); }
43
44HRESULT get_search_state_from_arguments(__in int argc, __in LPWSTR argv[], __out NETCORESEARCH_STATE& searchState);
45
22int __cdecl wmain(int argc, LPWSTR argv[]) 46int __cdecl wmain(int argc, LPWSTR argv[])
23{ 47{
24 HRESULT hr = S_OK; 48 HRESULT hr = S_OK;
25 DWORD dwMajorVersion = 0;
26 VERUTIL_VERSION* pVersion = NULL; 49 VERUTIL_VERSION* pVersion = NULL;
50 NETCORESEARCH_STATE searchState = {};
51
52 ::SetConsoleCP(CP_UTF8);
27 53
28 ConsoleInitialize(); 54 ConsoleInitialize();
29 55
30 if (argc != 3) 56 hr = get_search_state_from_arguments(argc, argv, OUT searchState);
57 if (FAILED(hr))
31 { 58 {
32 ExitFunction1(hr = E_INVALIDARG); 59 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse arguments.");
33 } 60 }
34 61
35 hr = StrStringToUInt32(argv[1], 0, reinterpret_cast<UINT*>(&dwMajorVersion)); 62 hr = GetDotnetEnvironmentInfo(searchState, &pVersion);
36 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get target version from: %ls", argv[1]);
37 63
38 hr = GetDotnetEnvironmentInfo(dwMajorVersion, argv[2], &pVersion);
39 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to search for .NET Core.");
40 64
41 if (pVersion) 65 if (pVersion)
42 { 66 {
@@ -49,9 +73,65 @@ LExit:
49 return hr; 73 return hr;
50} 74}
51 75
76HRESULT get_search_state_from_arguments(int argc, LPWSTR argv[], __out NETCORESEARCH_STATE& searchState)
77{
78 HRESULT hr = S_OK;
79 searchState = {};
80 const auto searchKind = argv[1];
81
82 if (argc < 3)
83 {
84 ExitFunction1(hr = E_INVALIDARG);
85 }
86
87
88 if (string_equal_invariant(searchKind, L"runtime"))
89 {
90 if (argc != 4)
91 {
92 ExitFunction1(hr = E_INVALIDARG);
93 }
94 searchState.Kind = NETCORESEARCHKIND::Runtime;
95
96 const PCWSTR majorVersion = argv[2];
97 const PCWSTR targetName = argv[3];
98
99 auto& data = searchState.Data.Runtime;
100
101 data.wzTargetName = targetName;
102 hr = StrStringToUInt32(majorVersion, 0, reinterpret_cast<UINT*>(&data.dwMajorVersion));
103 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get target version from: %ls", majorVersion);
104 }
105 else if(string_equal_invariant(searchKind, L"sdk"))
106 {
107 searchState.Kind = NETCORESEARCHKIND::Sdk;
108
109 const PCWSTR version = argv[2];
110
111 VERUTIL_VERSION* sdkVersion = nullptr;
112 hr = VerParseVersion(version, 0, FALSE, &sdkVersion);
113 if (FAILED(hr))
114 {
115 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse version from: %ls", version);
116 }
117
118 auto& data = searchState.Data.Sdk;
119
120 data.dwMajorVersion = sdkVersion->dwMajor;
121 data.dwMinorVersion = sdkVersion->dwMinor;
122 data.dwFeatureBand = sdkVersion->dwPatch;
123
124 VerFreeVersion(sdkVersion);
125 }
126
127LExit:
128 return hr;
129}
130
131
132
52static HRESULT GetDotnetEnvironmentInfo( 133static HRESULT GetDotnetEnvironmentInfo(
53 __in DWORD dwMajorVersion, 134 __in NETCORESEARCH_STATE& state,
54 __in_z LPCWSTR wzTargetName,
55 __inout VERUTIL_VERSION** ppVersion 135 __inout VERUTIL_VERSION** ppVersion
56 ) 136 )
57{ 137{
@@ -60,10 +140,6 @@ static HRESULT GetDotnetEnvironmentInfo(
60 LPWSTR sczHostfxrPath = NULL; 140 LPWSTR sczHostfxrPath = NULL;
61 HMODULE hModule = NULL; 141 HMODULE hModule = NULL;
62 hostfxr_get_dotnet_environment_info_fn pfnGetDotnetEnvironmentInfo = NULL; 142 hostfxr_get_dotnet_environment_info_fn pfnGetDotnetEnvironmentInfo = NULL;
63 NETCORESEARCH_STATE state = { };
64
65 state.dwMajorVersion = dwMajorVersion;
66 state.wzTargetName = wzTargetName;
67 143
68 hr = PathForCurrentProcess(&sczProcessPath, NULL); 144 hr = PathForCurrentProcess(&sczProcessPath, NULL);
69 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get process path."); 145 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get process path.");
@@ -102,50 +178,108 @@ LExit:
102 return hr; 178 return hr;
103} 179}
104 180
181bool matches_feature_band(const int requested, const int actual)
182{
183 // we have not requested a match on feature band, so skip the check
184 if (requested == 0) return true;
185
186 const int requestedBand = requested / 100;
187 const int actualBand = actual / 100;
188
189 if (actualBand != requestedBand) return false;
190
191 return actual >= requested;
192}
193
105static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult( 194static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
106 __in const hostfxr_dotnet_environment_info* pInfo, 195 __in const hostfxr_dotnet_environment_info* pInfo,
107 __in LPVOID pvContext 196 __in LPVOID pvContext
108 ) 197 )
109{ 198{
110 NETCORESEARCH_STATE* pState = reinterpret_cast<NETCORESEARCH_STATE*>(pvContext); 199 NETCORESEARCH_STATE* pState = static_cast<NETCORESEARCH_STATE*>(pvContext);
111 HRESULT hr = S_OK; 200 HRESULT hr = S_OK;
112 VERUTIL_VERSION* pFrameworkVersion = NULL; 201 VERUTIL_VERSION* pDotnetVersion = nullptr;
113 int nCompare = 0; 202 int nCompare = 0;
114 203
115 for (size_t i = 0; i < pInfo->framework_count; ++i)
116 {
117 const hostfxr_dotnet_environment_framework_info* pFrameworkInfo = pInfo->frameworks + i;
118 ReleaseVerutilVersion(pFrameworkVersion);
119 204
120 if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, pState->wzTargetName, -1, pFrameworkInfo->name, -1)) 205 if (pState->Kind == NETCORESEARCHKIND::Sdk)
206 {
207 auto& sdkData = pState->Data.Sdk;
208 for (size_t i = 0; i < pInfo->sdk_count; ++i)
121 { 209 {
122 continue; 210 const hostfxr_dotnet_environment_sdk_info* pSdkInfo = pInfo->sdks + i;
123 } 211 ReleaseVerutilVersion(pDotnetVersion);
124 212
125 hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pFrameworkVersion); 213 hr = VerParseVersion(pSdkInfo->version, 0, FALSE, &pDotnetVersion);
126 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version); 214 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse sdk version: %ls", pSdkInfo->version);
127 215
128 if (pFrameworkVersion->dwMajor != pState->dwMajorVersion) 216 if (pDotnetVersion->dwMajor != sdkData.dwMajorVersion)
129 { 217 {
130 continue; 218 continue;
131 } 219 }
220 if (!matches_feature_band(sdkData.dwFeatureBand, pDotnetVersion->dwPatch))
221 {
222 continue;
223 }
132 224
133 if (pState->pVersion) 225 if (pState->pVersion)
226 {
227 hr = VerCompareParsedVersions(pState->pVersion, pDotnetVersion, &nCompare);
228 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
229
230 if (nCompare > -1)
231 {
232 continue;
233 }
234 }
235
236 ReleaseVerutilVersion(pState->pVersion);
237 pState->pVersion = pDotnetVersion;
238 pDotnetVersion = nullptr;
239 }
240 }
241 else if(pState->Kind == NETCORESEARCHKIND::Runtime)
242 {
243 auto& runtimeData = pState->Data.Runtime;
244 for (size_t i = 0; i < pInfo->framework_count; ++i)
134 { 245 {
135 hr = VerCompareParsedVersions(pState->pVersion, pFrameworkVersion, &nCompare); 246 const hostfxr_dotnet_environment_framework_info* pFrameworkInfo = pInfo->frameworks + i;
136 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions."); 247 ReleaseVerutilVersion(pDotnetVersion);
137 248
138 if (nCompare > -1) 249 if (string_equal_invariant(runtimeData.wzTargetName, pFrameworkInfo->name))
139 { 250 {
140 continue; 251 continue;
141 } 252 }
142 }
143 253
144 ReleaseVerutilVersion(pState->pVersion); 254 hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pDotnetVersion);
145 pState->pVersion = pFrameworkVersion; 255 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version);
146 pFrameworkVersion = NULL; 256
257 if (pDotnetVersion->dwMajor != runtimeData.dwMajorVersion)
258 {
259 continue;
260 }
261
262 if (pState->pVersion)
263 {
264 hr = VerCompareParsedVersions(pState->pVersion, pDotnetVersion, &nCompare);
265 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
266
267 if (nCompare > -1)
268 {
269 continue;
270 }
271 }
272
273 ReleaseVerutilVersion(pState->pVersion);
274 pState->pVersion = pDotnetVersion;
275 pDotnetVersion = nullptr;
276 }
277 }
278 else
279 {
280 ConsoleWriteError(E_INVALIDARG, CONSOLE_COLOR_RED, "Invalid NETCORESEARCHKIND.");
147 } 281 }
148 282
149LExit: 283LExit:
150 ReleaseVerutilVersion(pFrameworkVersion); 284 ReleaseVerutilVersion(pDotnetVersion);
151} 285}
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs
index 20b266a5..74e82405 100644
--- a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs
@@ -5,11 +5,15 @@
5 <?define NetCorePlatform = x64?> 5 <?define NetCorePlatform = x64?>
6 <?define NetCoreIdVersion = 3112?> 6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?> 7 <?define NetCoreVersion = 3.1.12?>
8 <?define NetCoreSdkPlatform = x64?>
9 <?define NetCoreSdkIdVersion = 31425?>
10 <?define NetCoreSdkVersion = 3.1.425?>
8 <?include NetCore3_Platform.wxi?> 11 <?include NetCore3_Platform.wxi?>
9 12
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/20cf277c-2ccf-449f-a0b8-925ba0c175e7/aa50b052ceb8a8d36a5b4f9b8d0bd91c/aspnetcore-runtime-3.1.12-win-x64.exe?> 13 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/20cf277c-2ccf-449f-a0b8-925ba0c175e7/aa50b052ceb8a8d36a5b4f9b8d0bd91c/aspnetcore-runtime-3.1.12-win-x64.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/076a47e9-c65b-4b78-95a7-93eb988891a4/3574764590cfa650e0aa87c44d3fe384/windowsdesktop-runtime-3.1.12-win-x64.exe?> 14 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/076a47e9-c65b-4b78-95a7-93eb988891a4/3574764590cfa650e0aa87c44d3fe384/windowsdesktop-runtime-3.1.12-win-x64.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/2fdc3009-cf5c-4cf6-8f3b-a61e83200cbb/2c71ee04b48103a7464f4e28a8bf339b/dotnet-runtime-3.1.12-win-x64.exe?> 15 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/2fdc3009-cf5c-4cf6-8f3b-a61e83200cbb/2c71ee04b48103a7464f4e28a8bf339b/dotnet-runtime-3.1.12-win-x64.exe?>
16 <?define DotNetCoreSdkRedistLink = https://download.visualstudio.microsoft.com/download/pr/9cf7e571-76c7-4ce8-9777-37bd6c3540e9/5c01197afed195cdb6cd2ae9e49606fc/dotnet-sdk-3.1.425-win-x64.exe?>
13 17
14 <Fragment> 18 <Fragment>
15 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" /> 19 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
55 </ExePackage> 59 </ExePackage>
56 </PackageGroup> 60 </PackageGroup>
57 </Fragment> 61 </Fragment>
62
63 <Fragment>
64 <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="3.0.100" Variable="$(var.DotNetCoreSdkId)" />
65
66 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition" Value="$(var.DotNetCoreSdkId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
67 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition" Value="" Overridable="yes" />
68 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory" Value="redist\" Overridable="yes" />
69 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)RepairArguments" Value="" Overridable="yes" />
70
71 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)">
72 <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
73 <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCoreSdkPlatform).exe" DownloadUrl="$(var.DotNetCoreSdkRedistLink)" ProductName="Microsoft .NET Core Runtime - 3.1.425 (x64)" Description="Microsoft .NET Core Runtime - 3.1.425 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="135024384" Version="3.1.425" />
74 </ExePackage>
75 </PackageGroup>
76 </Fragment>
58</Wix> 77</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs
index 4bd97492..9acc4dc5 100644
--- a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs
@@ -5,11 +5,15 @@
5 <?define NetCorePlatform = x86?> 5 <?define NetCorePlatform = x86?>
6 <?define NetCoreIdVersion = 3112?> 6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?> 7 <?define NetCoreVersion = 3.1.12?>
8 <?define NetCoreSdkPlatform = x86?>
9 <?define NetCoreSdkIdVersion = 31425?>
10 <?define NetCoreSdkVersion = 3.1.425?>
8 <?include NetCore3_Platform.wxi?> 11 <?include NetCore3_Platform.wxi?>
9 12
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/55d6ff56-2725-4657-bffd-fdf35d6816fd/7431d1d3533f0b1ac97df734c45c33f2/aspnetcore-runtime-3.1.12-win-x86.exe?> 13 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/55d6ff56-2725-4657-bffd-fdf35d6816fd/7431d1d3533f0b1ac97df734c45c33f2/aspnetcore-runtime-3.1.12-win-x86.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/5d89a010-88bf-4e4e-ac12-a07258ddbf5f/1ff5dfe312c5bd9760f3b500b1b37597/windowsdesktop-runtime-3.1.12-win-x86.exe?> 14 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/5d89a010-88bf-4e4e-ac12-a07258ddbf5f/1ff5dfe312c5bd9760f3b500b1b37597/windowsdesktop-runtime-3.1.12-win-x86.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/cbdd1603-7fa9-4957-8869-94e24963ba6c/ca0b7d1be494882d5a7433accfa3c94c/dotnet-runtime-3.1.12-win-x86.exe?> 15 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/cbdd1603-7fa9-4957-8869-94e24963ba6c/ca0b7d1be494882d5a7433accfa3c94c/dotnet-runtime-3.1.12-win-x86.exe?>
16 <?define DotNetCoreSdkRedistLink = https://download.visualstudio.microsoft.com/download/pr/d595e303-d26d-447c-92e7-5dc32c8e70b9/0669c3a6247a96a98ea96b1698294970/dotnet-sdk-3.1.425-win-x86.zip?>
13 17
14 <Fragment> 18 <Fragment>
15 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" /> 19 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
55 </ExePackage> 59 </ExePackage>
56 </PackageGroup> 60 </PackageGroup>
57 </Fragment> 61 </Fragment>
62
63 <Fragment>
64 <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="3.0.100" Variable="$(var.DotNetCoreSdkId)" />
65
66 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition" Value="$(var.DotNetCoreSdkId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
67 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition" Value="" Overridable="yes" />
68 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory" Value="redist\" Overridable="yes" />
69 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)RepairArguments" Value="" Overridable="yes" />
70
71 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)">
72 <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
73 <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCoreSdkPlatform).exe" DownloadUrl="$(var.DotNetCoreSdkRedistLink)" ProductName="Microsoft .NET Core SDK - 3.1.425 (x86)" Description="Microsoft .NET Core Runtime - 3.1.12 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="124974936" Version="3.1.425" />
74 </ExePackage>
75 </PackageGroup>
76 </Fragment>
58</Wix> 77</Wix>
diff --git a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi
index f0b97d33..2933196d 100644
--- a/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi
+++ b/src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi
@@ -21,6 +21,12 @@
21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?> 21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?> 22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
23 23
24 <?define DotNetCoreSdkId = DOTNETCORESDK3_$(var.NetCoreSdkPlatform)?>
25 <?define DotNetCoreSdkRedistId = DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist_$(var.NetCoreSdkPlatform)?>
26 <?define DotNetCoreSdkRedistLog = DotNetCoreSdk$(var.NetCoreSdkIdVersion)RedistLog?>
27 <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
28 <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29
24 <?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?> 30 <?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?>
25 31
26 <Fragment> 32 <Fragment>
@@ -46,4 +52,12 @@
46 52
47 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" /> 53 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
48 </Fragment> 54 </Fragment>
55
56 <Fragment>
57 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)AsPrereq">
58 <PackageGroupRef Id="$(var.DotNetCoreSdkRedistId)" />
59 </PackageGroup>
60
61 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreSdkRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
62 </Fragment>
49</Include> 63</Include>
diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs
index 563cd19d..7a37cf90 100644
--- a/src/ext/NetFx/wixext/NetFxCompiler.cs
+++ b/src/ext/NetFx/wixext/NetFxCompiler.cs
@@ -49,6 +49,12 @@ namespace WixToolset.Netfx
49 case "DotNetCoreSearchRef": 49 case "DotNetCoreSearchRef":
50 this.ParseDotNetCoreSearchRefElement(intermediate, section, element); 50 this.ParseDotNetCoreSearchRefElement(intermediate, section, element);
51 break; 51 break;
52 case "DotNetCoreSdkSearch":
53 this.ParseDotNetCoreSdkSearchElement(intermediate, section, element);
54 break;
55 case "DotNetCoreSdkSearchRef":
56 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
57 break;
52 case "DotNetCompatibilityCheck": 58 case "DotNetCompatibilityCheck":
53 this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); 59 this.ParseDotNetCompatibilityCheckElement(intermediate, section, element);
54 break; 60 break;
@@ -69,6 +75,12 @@ namespace WixToolset.Netfx
69 case "DotNetCoreSearchRef": 75 case "DotNetCoreSearchRef":
70 this.ParseDotNetCoreSearchRefElement(intermediate, section, element); 76 this.ParseDotNetCoreSearchRefElement(intermediate, section, element);
71 break; 77 break;
78 case "DotNetCoreSdkSearch":
79 this.ParseDotNetCoreSdkSearchElement(intermediate, section, element);
80 break;
81 case "DotNetCoreSdkSearchRef":
82 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
83 break;
72 default: 84 default:
73 this.ParseHelper.UnexpectedElement(parentElement, element); 85 this.ParseHelper.UnexpectedElement(parentElement, element);
74 break; 86 break;
@@ -248,6 +260,137 @@ namespace WixToolset.Netfx
248 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); 260 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
249 } 261 }
250 262
263 private void ParseDotNetCoreSdkSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
264 {
265 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
266 Identifier id = null;
267 string variable = null;
268 string condition = null;
269 string after = null;
270 NetCoreSdkSearchPlatform? platform = null;
271 string version = null;
272
273 foreach (var attrib in element.Attributes())
274 {
275 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
276 {
277 switch (attrib.Name.LocalName)
278 {
279 case "Id":
280 id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
281 break;
282 case "Variable":
283 variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib);
284 break;
285 case "Condition":
286 condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
287 break;
288 case "After":
289 after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
290 break;
291 case "Platform":
292 var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
293 switch (platformValue)
294 {
295 case "arm64":
296 platform = NetCoreSdkSearchPlatform.Arm64;
297 break;
298 case "x64":
299 platform = NetCoreSdkSearchPlatform.X64;
300 break;
301 case "x86":
302 platform = NetCoreSdkSearchPlatform.X86;
303 break;
304 default:
305 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86"));
306 break;
307 }
308 break;
309 case "Version":
310 // .NET Core had a different deployment strategy before .NET Core 3.0 which would require different detection logic.
311 version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib);
312 break;
313 default:
314 this.ParseHelper.UnexpectedAttribute(element, attrib);
315 break;
316 }
317 }
318 else
319 {
320 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
321 }
322 }
323
324 if (id == null)
325 {
326 id = this.ParseHelper.CreateIdentifier("dncss", variable, condition, after);
327 }
328
329 if (!platform.HasValue)
330 {
331 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform"));
332 }
333
334
335 if (String.IsNullOrEmpty(version))
336 {
337 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version"));
338 }
339
340 var ver = Version.Parse(version);
341 if (ver.Major == 4)
342 {
343 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*"));
344 }
345
346 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
347
348 var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64);
349 if (bundleExtensionId == null)
350 {
351 this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName));
352 }
353
354 if (!this.Messaging.EncounteredError)
355 {
356 this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId);
357
358 section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id)
359 {
360 Platform = platform.Value,
361 Version = version,
362 });
363 }
364 }
365
366 private void ParseDotNetCoreSdkSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
367 {
368 var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
369
370 foreach (var attrib in element.Attributes())
371 {
372 if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
373 {
374 switch (attrib.Name.LocalName)
375 {
376 case "Id":
377 var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
378 this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, refId);
379 break;
380 default:
381 this.ParseHelper.UnexpectedAttribute(element, attrib);
382 break;
383 }
384 }
385 else
386 {
387 this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
388 }
389 }
390
391 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
392 }
393
251 /// <summary> 394 /// <summary>
252 /// Parses a NativeImage element. 395 /// Parses a NativeImage element.
253 /// </summary> 396 /// </summary>
@@ -389,66 +532,19 @@ namespace WixToolset.Netfx
389 property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); 532 property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
390 break; 533 break;
391 case "RuntimeType": 534 case "RuntimeType":
392 runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 535 runtimeType = this.ParseRuntimeType(element, sourceLineNumbers, attrib);
393 switch (runtimeType.ToLower())
394 {
395 case "aspnet":
396 runtimeType = "Microsoft.AspNetCore.App";
397 break;
398 case "desktop":
399 runtimeType = "Microsoft.WindowsDesktop.App";
400 break;
401 case "core":
402 runtimeType = "Microsoft.NETCore.App";
403 break;
404 default:
405 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core"));
406 break;
407 }
408 break; 536 break;
409 case "Platform": 537 case "Platform":
410 platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 538 platform = this.ParsePlatform(element, sourceLineNumbers, attrib);
411 switch (platform.ToLower()) 539 break;
412 { 540 case "FeatureBand":
413 case "x86": 541 platform = this.ParseFeatureBand(element, sourceLineNumbers, attrib);
414 case "x64":
415 case "arm64":
416 platform = platform.ToLower();
417 break;
418 default:
419 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, platform, "x86", "x64", "arm64"));
420 break;
421 }
422 break; 542 break;
423 case "Version": 543 case "Version":
424 version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); 544 version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib);
425 break; 545 break;
426 case "RollForward": 546 case "RollForward":
427 rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); 547 rollForward = this.ParseRollForward(element, sourceLineNumbers, attrib);
428 switch (rollForward.ToLowerInvariant())
429 {
430 case "latestmajor":
431 rollForward = "LatestMajor";
432 break;
433 case "major":
434 rollForward = "Major";
435 break;
436 case "latestminor":
437 rollForward = "LatestMinor";
438 break;
439 case "minor":
440 rollForward = "Minor";
441 break;
442 case "latestpatch":
443 rollForward = "LatestPatch";
444 break;
445 case "disable":
446 rollForward = "Disable";
447 break;
448 default:
449 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable"));
450 break;
451 }
452 break; 548 break;
453 default: 549 default:
454 this.ParseHelper.UnexpectedAttribute(element, attrib); 550 this.ParseHelper.UnexpectedAttribute(element, attrib);
@@ -503,6 +599,97 @@ namespace WixToolset.Netfx
503 } 599 }
504 } 600 }
505 601
602 private string ParseRollForward(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib)
603 {
604 string rollForward;
605 rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
606 switch (rollForward.ToLowerInvariant())
607 {
608 case "latestmajor":
609 rollForward = "LatestMajor";
610 break;
611 case "major":
612 rollForward = "Major";
613 break;
614 case "latestminor":
615 rollForward = "LatestMinor";
616 break;
617 case "minor":
618 rollForward = "Minor";
619 break;
620 case "latestpatch":
621 rollForward = "LatestPatch";
622 break;
623 case "disable":
624 rollForward = "Disable";
625 break;
626 default:
627 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName,
628 attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable"));
629 break;
630 }
631
632 return rollForward;
633 }
634
635 private string ParsePlatform(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib)
636 {
637 string platform;
638 platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
639 switch (platform.ToLower())
640 {
641 case "x86":
642 case "x64":
643 case "arm64":
644 platform = platform.ToLower();
645 break;
646 default:
647 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName,
648 attrib.Name.LocalName, platform, "x86", "x64", "arm64"));
649 break;
650 }
651
652 return platform;
653 }
654
655 private string ParseFeatureBand(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib)
656 {
657 string featureBand = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
658
659 if (!Int32.TryParse(featureBand, out var intFeatureBand) || (100 > intFeatureBand) || (intFeatureBand > 999))
660 {
661 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName,
662 attrib.Name.LocalName, featureBand, "An integer in the range [100 - 999]"));
663
664 }
665
666 return featureBand;
667 }
668
669 private string ParseRuntimeType(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib)
670 {
671 var runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
672 switch (runtimeType.ToLower())
673 {
674 case "aspnet":
675 runtimeType = "Microsoft.AspNetCore.App";
676 break;
677 case "desktop":
678 runtimeType = "Microsoft.WindowsDesktop.App";
679 break;
680 case "core":
681 runtimeType = "Microsoft.NETCore.App";
682 break;
683 default:
684 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName,
685 attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core"));
686 break;
687 }
688
689 return runtimeType;
690 }
691
692
506 /// <summary> 693 /// <summary>
507 /// Parses a DotNetCompatibilityCheckRef element. 694 /// Parses a DotNetCompatibilityCheckRef element.
508 /// </summary> 695 /// </summary>
diff --git a/src/ext/NetFx/wixext/NetfxTableDefinitions.cs b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs
index 6be1abe7..114275c3 100644
--- a/src/ext/NetFx/wixext/NetfxTableDefinitions.cs
+++ b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs
@@ -40,7 +40,7 @@ namespace WixToolset.Netfx
40 public static readonly TableDefinition[] All = new[] 40 public static readonly TableDefinition[] All = new[]
41 { 41 {
42 NetFxNativeImage, 42 NetFxNativeImage,
43 NetFxDotNetCompatibilityCheck 43 NetFxDotNetCompatibilityCheck,
44 }; 44 };
45 } 45 }
46} 46}
diff --git a/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs
index a46cf17f..ea1b16c5 100644
--- a/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs
+++ b/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs
@@ -11,11 +11,11 @@ namespace WixToolset.Netfx
11 NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck.ToString(), 11 NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck.ToString(),
12 new[] 12 new[]
13 { 13 {
14 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType), IntermediateFieldType.String), 14 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType), IntermediateFieldType.String),
15 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Platform), IntermediateFieldType.String), 15 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Platform), IntermediateFieldType.String),
16 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Version), IntermediateFieldType.String), 16 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Version), IntermediateFieldType.String),
17 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RollForward), IntermediateFieldType.String), 17 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RollForward), IntermediateFieldType.String),
18 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Property), IntermediateFieldType.String), 18 new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Property), IntermediateFieldType.String),
19 }, 19 },
20 typeof(NetFxDotNetCompatibilityCheckSymbol)); 20 typeof(NetFxDotNetCompatibilityCheckSymbol));
21 } 21 }
@@ -25,7 +25,7 @@ namespace WixToolset.Netfx.Symbols
25{ 25{
26 using WixToolset.Data; 26 using WixToolset.Data;
27 27
28 public enum NetFxDotNetCompatibilityCheckSymbollFields 28 public enum NetFxDotNetCompatibilityCheckSymbolFields
29 { 29 {
30 RuntimeType, 30 RuntimeType,
31 Platform, 31 Platform,
@@ -44,36 +44,36 @@ namespace WixToolset.Netfx.Symbols
44 { 44 {
45 } 45 }
46 46
47 public IntermediateField this[NetFxDotNetCompatibilityCheckSymbollFields index] => this.Fields[(int)index]; 47 public IntermediateField this[NetFxDotNetCompatibilityCheckSymbolFields index] => this.Fields[(int)index];
48 48
49 public string RuntimeType 49 public string RuntimeType
50 { 50 {
51 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType].AsString(); 51 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType].AsString();
52 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType, value); 52 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType, value);
53 } 53 }
54 54
55 public string Platform 55 public string Platform
56 { 56 {
57 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Platform].AsString(); 57 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Platform].AsString();
58 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Platform, value); 58 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Platform, value);
59 } 59 }
60 60
61 public string Version 61 public string Version
62 { 62 {
63 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Version].AsString(); 63 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Version].AsString();
64 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Version, value); 64 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Version, value);
65 } 65 }
66 66
67 public string RollForward 67 public string RollForward
68 { 68 {
69 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward].AsString(); 69 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward].AsString();
70 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward, value); 70 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward, value);
71 } 71 }
72 72
73 public string Property 73 public string Property
74 { 74 {
75 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Property].AsString(); 75 get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Property].AsString();
76 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Property, value); 76 set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Property, value);
77 } 77 }
78 } 78 }
79} 79}
diff --git a/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs
new file mode 100644
index 00000000..86b750ea
--- /dev/null
+++ b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs
@@ -0,0 +1,64 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolset.Netfx
4{
5 using WixToolset.Data;
6 using WixToolset.Netfx.Symbols;
7
8 public static partial class NetfxSymbolDefinitions
9 {
10 public static readonly IntermediateSymbolDefinition NetFxNetCoreSdkSearch = new IntermediateSymbolDefinition(
11 NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch.ToString(),
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Platform), IntermediateFieldType.Number),
15 new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Version), IntermediateFieldType.String),
16 },
17 typeof(NetFxNetCoreSearchSymbol));
18 }
19}
20
21namespace WixToolset.Netfx.Symbols
22{
23 using WixToolset.Data;
24
25
26 public enum NetCoreSdkSearchPlatform
27 {
28 X86,
29 X64,
30 Arm64,
31 }
32
33 public enum NetFxNetCoreSdkSearchSymbolFields
34 {
35 Platform,
36 Version,
37 }
38
39
40 public class NetFxNetCoreSdkSearchSymbol : IntermediateSymbol
41 {
42 public NetFxNetCoreSdkSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, null, null)
43 {
44 }
45
46 public NetFxNetCoreSdkSearchSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, sourceLineNumber, id)
47 {
48 }
49
50 public IntermediateField this[NetFxNetCoreSdkSearchSymbolFields index] => this.Fields[(int)index];
51
52 public NetCoreSdkSearchPlatform Platform
53 {
54 get => (NetCoreSdkSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber();
55 set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Platform, (int)value);
56 }
57
58 public string Version
59 {
60 get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Version].AsString();
61 set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Version, value);
62 }
63 }
64}
diff --git a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
index ad729dd4..00c52f9e 100644
--- a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
+++ b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
@@ -10,7 +10,8 @@ namespace WixToolset.Netfx
10 { 10 {
11 NetFxNativeImage, 11 NetFxNativeImage,
12 NetFxNetCoreSearch, 12 NetFxNetCoreSearch,
13 NetFxDotNetCompatibilityCheck 13 NetFxNetCoreSdkSearch,
14 NetFxDotNetCompatibilityCheck,
14 } 15 }
15 16
16 public static partial class NetfxSymbolDefinitions 17 public static partial class NetfxSymbolDefinitions
@@ -36,7 +37,10 @@ namespace WixToolset.Netfx
36 37
37 case NetfxSymbolDefinitionType.NetFxNetCoreSearch: 38 case NetfxSymbolDefinitionType.NetFxNetCoreSearch:
38 return NetfxSymbolDefinitions.NetFxNetCoreSearch; 39 return NetfxSymbolDefinitions.NetFxNetCoreSearch;
39 40
41 case NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch:
42 return NetfxSymbolDefinitions.NetFxNetCoreSdkSearch;
43
40 case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck: 44 case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck:
41 return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck; 45 return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck;
42 46
@@ -48,6 +52,7 @@ namespace WixToolset.Netfx
48 static NetfxSymbolDefinitions() 52 static NetfxSymbolDefinitions()
49 { 53 {
50 NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); 54 NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
55 NetFxNetCoreSdkSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
51 } 56 }
52 } 57 }
53} 58}
diff --git a/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs b/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs
index 6bfef872..c2232674 100644
--- a/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs
+++ b/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs
@@ -5,11 +5,15 @@
5 <?define NetCorePlatform = x86?> 5 <?define NetCorePlatform = x86?>
6 <?define NetCoreIdVersion = 609?> 6 <?define NetCoreIdVersion = 609?>
7 <?define NetCoreVersion = 6.0.9?> 7 <?define NetCoreVersion = 6.0.9?>
8 <?define NetCoreSdkPlatform = x86?>
9 <?define NetCoreSdkIdVersion = 60403?>
10 <?define NetCoreSdkVersion = 6.0.403?>
8 <?include NetCore6_Platform.wxi?> 11 <?include NetCore6_Platform.wxi?>
9 12
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/8f583028-b802-4661-b8dd-47139b0561ce/3c0cd3bdc6051759ccae40f78982c86e/aspnetcore-runtime-6.0.9-win-x86.exe?> 13 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/8f583028-b802-4661-b8dd-47139b0561ce/3c0cd3bdc6051759ccae40f78982c86e/aspnetcore-runtime-6.0.9-win-x86.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/925f9407-2767-4341-857a-43cdfad71e17/0b84db913bdbb1dcf02db937a3cd3f63/windowsdesktop-runtime-6.0.9-win-x86.exe?> 14 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/925f9407-2767-4341-857a-43cdfad71e17/0b84db913bdbb1dcf02db937a3cd3f63/windowsdesktop-runtime-6.0.9-win-x86.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/6020f3fc-5cf8-4e25-bc7f-dcf8744137ac/4cb5ced4e015e426fddc554b130c3052/dotnet-runtime-6.0.9-win-x86.exe?> 15 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/6020f3fc-5cf8-4e25-bc7f-dcf8744137ac/4cb5ced4e015e426fddc554b130c3052/dotnet-runtime-6.0.9-win-x86.exe?>
16 <?define DotNetCoreSdkRedistLink = https://download.visualstudio.microsoft.com/download/pr/c2bf9927-2746-4126-b839-1080b360f348/17191138699683165a20fde56571f433/dotnet-sdk-6.0.403-win-x86.exe?>
13 17
14 <Fragment> 18 <Fragment>
15 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" /> 19 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
55 </ExePackage> 59 </ExePackage>
56 </PackageGroup> 60 </PackageGroup>
57 </Fragment> 61 </Fragment>
62
63 <Fragment>
64 <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="6.0.200" Variable="$(var.DotNetCoreSdkId)" />
65
66 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition" Value="$(var.DotNetCoreSdkId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
67 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition" Value="" Overridable="yes" />
68 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory" Value="redist\" Overridable="yes" />
69 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)RepairArguments" Value="" Overridable="yes" />
70
71 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)">
72 <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
73 <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCoreSdkPlatform).exe" DownloadUrl="$(var.DotNetCoreSdkRedistLink)" ProductName="Microsoft .NET 6.0 SDK - 6.0.403 (x86)" Description="Microsoft .NET SDK - 6.0.403 (x86)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="194236520" Version="6.0.403" />
74 </ExePackage>
75 </PackageGroup>
76 </Fragment>
58</Wix> 77</Wix>
diff --git a/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi b/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi
index d508bcaf..8f084b43 100644
--- a/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi
+++ b/src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi
@@ -21,6 +21,12 @@
21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?> 21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?> 22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
23 23
24 <?define DotNetCoreSdkId = DOTNETCORERUNTIME6_$(var.NetCoreSdkPlatform)?>
25 <?define DotNetCoreSdkRedistId = DotNetCoreRuntime$(var.NetCoreIdVersion)Redist_$(var.NetCoreSdkPlatform)?>
26 <?define DotNetCoreSdkRedistLog = DotNetCoreRuntime$(var.NetCoreSdkIdVersion)RedistLog?>
27 <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
28 <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29
24 <?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?> 30 <?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?>
25 31
26 <Fragment> 32 <Fragment>
@@ -46,4 +52,12 @@
46 52
47 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" /> 53 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
48 </Fragment> 54 </Fragment>
55
56 <Fragment>
57 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)AsPrereq">
58 <PackageGroupRef Id="$(var.DotNetCoreSdkRedistId)" />
59 </PackageGroup>
60
61 <bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreSdkRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
62 </Fragment>
49</Include> 63</Include>
diff --git a/src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs b/src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs
index f2345693..e9ccdc51 100644
--- a/src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs
+++ b/src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs
@@ -5,11 +5,15 @@
5 <?define NetCorePlatform = x64?> 5 <?define NetCorePlatform = x64?>
6 <?define NetCoreIdVersion = 609?> 6 <?define NetCoreIdVersion = 609?>
7 <?define NetCoreVersion = 6.0.9?> 7 <?define NetCoreVersion = 6.0.9?>
8 <?define NetCoreSdkPlatform = x64?>
9 <?define NetCoreSdkIdVersion = 60403?>
10 <?define NetCoreSdkVersion = 6.0.403?>
8 <?include ..\TestBAWixlib\NetCore6_Platform.wxi?> 11 <?include ..\TestBAWixlib\NetCore6_Platform.wxi?>
9 12
10 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/98dbe241-8b77-4be0-b130-a5fb6af8d724/27b655adce6250da42be9440abe847a2/aspnetcore-runtime-6.0.9-win-x64.exe?> 13 <?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/98dbe241-8b77-4be0-b130-a5fb6af8d724/27b655adce6250da42be9440abe847a2/aspnetcore-runtime-6.0.9-win-x64.exe?>
11 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/fe8415d4-8a35-4af9-80a5-51306a96282d/05f9b2a1b4884238e69468e49b3a5453/windowsdesktop-runtime-6.0.9-win-x64.exe?> 14 <?define DesktopNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/fe8415d4-8a35-4af9-80a5-51306a96282d/05f9b2a1b4884238e69468e49b3a5453/windowsdesktop-runtime-6.0.9-win-x64.exe?>
12 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/9dc77a6b-0276-4ad5-9bfa-d84b546686ef/f01bbcf2dc0e7f5dbd0a7d337fd4cd43/dotnet-runtime-6.0.9-win-x64.exe?> 15 <?define DotNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/9dc77a6b-0276-4ad5-9bfa-d84b546686ef/f01bbcf2dc0e7f5dbd0a7d337fd4cd43/dotnet-runtime-6.0.9-win-x64.exe?>
16 <?define DotNetCoreSdkRedistLink = https://download.visualstudio.microsoft.com/download/pr/08ada4db-1e64-4829-b36d-5beb71f67bff/b77050cf7e0c71d3b95418651db1a9b8/dotnet-sdk-6.0.403-win-x64.exe?>
13 17
14 <Fragment> 18 <Fragment>
15 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" /> 19 <netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
55 </ExePackage> 59 </ExePackage>
56 </PackageGroup> 60 </PackageGroup>
57 </Fragment> 61 </Fragment>
62
63 <Fragment>
64 <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="6.0.200" Variable="$(var.DotNetCoreSdkId)" />
65
66 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition" Value="$(var.DotNetCoreSdkId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
67 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition" Value="" Overridable="yes" />
68 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory" Value="redist\" Overridable="yes" />
69 <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)RepairArguments" Value="" Overridable="yes" />
70
71 <PackageGroup Id="$(var.DotNetCoreSdkRedistId)">
72 <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
73 <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCoreSdkPlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCoreSdkPlatform).exe" DownloadUrl="$(var.DotNetCoreSdkRedistLink)" ProductName="Microsoft .NET 6.0 SDK - 6.0.403 (x64)" Description="Microsoft .NET SDK - 6.0.403 (x64)" CertificatePublicKey="3756E9BBF4461DCD0AA68E0D1FCFFA9CEA47AC18" CertificateThumbprint="2485A7AFA98E178CB8F30C9838346B514AEA4769" Size="205722192" Version="6.0.403" />
74 </ExePackage>
75 </PackageGroup>
76 </Fragment>
58</Wix> 77</Wix>