@joebigelow / wix / commits / d180bc6d

Add netfx:DotNetCoreSdkFeatureBandSearch.

7058

Sean Hall committed Jan 15, 2023 at 19:17 UTC d180bc6df297422f189ffd08a0dd558bfbeba1ca
25 files changed +745 -428
src/api/wix/WixToolset.Data/WixVersionLabel.cs deleted
-43
@@ -1,43 +0,0 @@
1 -// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 -
3 -namespace WixToolset.Data
4 -{
5 - using System;
6 -
7 - /// <summary>
8 - /// Label in a <c>WixVersion</c>.
9 - /// </summary>
10 - [CLSCompliant(false)]
11 - public class WixVersionLabel
12 - {
13 - /// <summary>
14 - /// Creates a string only version label.
15 - /// </summary>
16 - /// <param name="label">String value for version label.</param>
17 - public WixVersionLabel(string label)
18 - {
19 - this.Label = label;
20 - }
21 -
22 - /// <summary>
23 - /// Creates a string version label with numeric value.
24 - /// </summary>
25 - /// <param name="label">String value for version label.</param>
26 - /// <param name="numeric">Numeric value for the version label.</param>
27 - public WixVersionLabel(string label, uint? numeric)
28 - {
29 - this.Label = label;
30 - this.Numeric = numeric;
31 - }
32 -
33 - /// <summary>
34 - /// Gets the string label value.
35 - /// </summary>
36 - public string Label { get; set; }
37 -
38 - /// <summary>
39 - /// Gets the optional numeric label value.
40 - /// </summary>
41 - public uint? Numeric { get; set; }
42 - }
43 -}
src/ext/NetFx/be/detectnetcore.cpp
+8 -83
@@ -12,18 +12,7 @@ HRESULT DetectNetCore(
12 {
13 HRESULT hr = S_OK;
14 LPCWSTR wzRuntimeType = NULL;
15 - LPCWSTR wzPlatformName = NULL;
16 - LPWSTR sczExePath = NULL;
17 - LPWSTR sczCommandLine = NULL;
18 - HANDLE hProcess = NULL;
19 - HANDLE hStdOutErr = INVALID_HANDLE_VALUE;
20 - BYTE* rgbOutput = NULL;
21 - DWORD cbOutput = 0;
22 - DWORD cbTotalRead = 0;
23 - DWORD cbRead = 0;
24 - DWORD dwExitCode = 0;
25 -
26 - ReleaseNullStr(*psczLatestVersion);
15 + LPWSTR sczArguments = NULL;
16
17 switch (runtimeType)
18 {
@@ -41,80 +30,14 @@ HRESULT DetectNetCore(
30 break;
31 }
32
44 - switch (platform)
45 - {
46 - case NETFX_NET_CORE_PLATFORM_ARM64:
47 - wzPlatformName = L"arm64";
48 - break;
49 - case NETFX_NET_CORE_PLATFORM_X64:
50 - wzPlatformName = L"x64";
51 - break;
52 - case NETFX_NET_CORE_PLATFORM_X86:
53 - wzPlatformName = L"x86";
54 - break;
55 - default:
56 - BextExitWithRootFailure(hr, E_INVALIDARG, "Unknown platform: %u", platform);
57 - break;
58 - }
59 -
60 - hr = StrAllocFormatted(&sczExePath, L"%ls%ls\\netcoresearch.exe", wzBaseDirectory, wzPlatformName);
61 - BextExitOnFailure(hr, "Failed to build netcoresearch.exe path.");
62 -
63 - hr = StrAllocFormatted(&sczCommandLine, L"\"%ls\" runtime %ls %ls", sczExePath, wzMajorVersion, wzRuntimeType);
64 - BextExitOnFailure(hr, "Failed to build netcoresearch.exe command line.");
65 -
66 - hr = ProcExecute(sczExePath, sczCommandLine, &hProcess, NULL, &hStdOutErr);
67 - if (HRESULT_FROM_WIN32(ERROR_EXE_MACHINE_TYPE_MISMATCH) == hr)
68 - {
69 - ExitFunction1(hr = S_FALSE);
70 - }
71 - BextExitOnFailure(hr, "Failed to run: %ls", sczCommandLine);
72 -
73 - cbOutput = 64;
33 + hr = StrAllocFormatted(&sczArguments, L"runtime %ls %ls", wzMajorVersion, wzRuntimeType);
34 + BextExitOnFailure(hr, "Failed to build runtime netcoresearch.exe arguments.");
35
75 - rgbOutput = reinterpret_cast<BYTE*>(MemAlloc(cbOutput, TRUE));
76 - BextExitOnNull(rgbOutput, hr, E_OUTOFMEMORY, "Failed to alloc output string.");
77 -
78 - while (::ReadFile(hStdOutErr, rgbOutput + cbTotalRead, cbOutput - cbTotalRead, &cbRead, NULL))
79 - {
80 - cbTotalRead += cbRead;
81 -
82 - if (cbTotalRead == cbOutput)
83 - {
84 - cbOutput *= 2;
85 -
86 - LPVOID pvNew = MemReAlloc(rgbOutput, cbOutput, TRUE);
87 - BextExitOnNull(pvNew, hr, E_OUTOFMEMORY, "Failed to realloc output string.");
88 -
89 - rgbOutput = reinterpret_cast<BYTE*>(pvNew);
90 - }
91 - }
92 -
93 - if (ERROR_BROKEN_PIPE != ::GetLastError())
94 - {
95 - BextExitWithLastError(hr, "Failed to read netcoresearch.exe output.");
96 - }
97 -
98 - hr = ProcWaitForCompletion(hProcess, INFINITE, &dwExitCode);
99 - BextExitOnFailure(hr, "Failed to wait for netcoresearch.exe to exit.");
100 -
101 - if (0 != dwExitCode)
102 - {
103 - BextExitWithRootFailure(hr, E_UNEXPECTED, "netcoresearch.exe failed with exit code: 0x%x\r\nOutput:\r\n%hs", dwExitCode, rgbOutput);
104 - }
105 -
106 - if (*rgbOutput)
107 - {
108 - hr = StrAllocStringAnsi(psczLatestVersion, reinterpret_cast<LPSTR>(rgbOutput), 0, CP_UTF8);
109 - BextExitOnFailure(hr, "Failed to widen output string: %hs", rgbOutput);
110 - }
36 + hr = RunNetCoreSearch(platform, wzBaseDirectory, sczArguments, psczLatestVersion);
37 + BextExitOnFailure(hr, "Failed to run netcoresearch.exe for runtime.");
38
39 LExit:
113 - ReleaseFileHandle(hStdOutErr);
114 - ReleaseHandle(hProcess);
115 - ReleaseMem(rgbOutput);
116 - ReleaseStr(sczCommandLine);
117 - ReleaseStr(sczExePath);
40 + ReleaseStr(sczArguments);
41
42 return hr;
43 }
@@ -136,5 +59,7 @@ HRESULT NetfxPerformDetectNetCore(
59 BextExitOnFailure(hr, "Failed to set variable '%ls' to '%ls'", wzVariable, sczLatestVersion);
60
61 LExit:
62 + ReleaseStr(sczLatestVersion);
63 +
64 return hr;
65 }
src/ext/NetFx/be/detectnetcoresdk.cpp
+12 -87
@@ -4,99 +4,22 @@
4
5 HRESULT DetectNetCoreSdk(
6 __in NETFX_NET_CORE_PLATFORM platform,
7 - __in LPCWSTR wzVersion,
7 + __in LPCWSTR wzMajorVersion,
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;
13 + LPWSTR sczArguments = NULL;
14
24 - ReleaseNullStr(*psczLatestVersion);
15 + hr = StrAllocFormatted(&sczArguments, L"sdk %ls", wzMajorVersion);
16 + BextExitOnFailure(hr, "Failed to build sdk netcoresearch.exe arguments.");
17
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 - }
18 + hr = RunNetCoreSearch(platform, wzBaseDirectory, sczArguments, psczLatestVersion);
19 + BextExitOnFailure(hr, "Failed to run netcoresearch.exe for sdk.");
20
21 LExit:
95 - ReleaseFileHandle(hStdOutErr);
96 - ReleaseHandle(hProcess);
97 - ReleaseMem(rgbOutput);
98 - ReleaseStr(sczCommandLine);
99 - ReleaseStr(sczExePath);
22 + ReleaseStr(sczArguments);
23
24 return hr;
25 }
@@ -109,14 +32,16 @@ HRESULT NetfxPerformDetectNetCoreSdk(
32 )
33 {
34 HRESULT hr = S_OK;
112 - LPWSTR sczLatestVersion = nullptr;
113 - const auto& searchParams = pSearch->NetCoreSdkSearch;
114 - hr = DetectNetCoreSdk(searchParams.platform, searchParams.sczVersion, wzBaseDirectory, &sczLatestVersion);
35 + LPWSTR sczLatestVersion = NULL;
36 +
37 + hr = DetectNetCoreSdk(pSearch->NetCoreSdkSearch.platform, pSearch->NetCoreSdkSearch.sczMajorVersion, wzBaseDirectory, &sczLatestVersion);
38 BextExitOnFailure(hr, "DetectNetCoreSdk failed.");
39
40 hr = pEngine->SetVariableVersion(wzVariable, sczLatestVersion);
41 BextExitOnFailure(hr, "Failed to set variable '%ls' to '%ls'", wzVariable, sczLatestVersion);
42
43 LExit:
44 + ReleaseStr(sczLatestVersion);
45 +
46 return hr;
47 }
src/ext/NetFx/be/detectnetcoresdkfeatureband.cpp new
+55
@@ -0,0 +1,55 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +#include "precomp.h"
4 +
5 +HRESULT DetectNetCoreSdkFeatureBand(
6 + __in NETFX_NET_CORE_PLATFORM platform,
7 + __in LPCWSTR wzMajorVersion,
8 + __in LPCWSTR wzMinorVersion,
9 + __in LPCWSTR wzPatchVersion,
10 + __in LPCWSTR wzBaseDirectory,
11 + __inout LPWSTR* psczLatestVersion
12 + )
13 +{
14 + HRESULT hr = S_OK;
15 + LPWSTR sczArguments = NULL;
16 +
17 + hr = StrAllocFormatted(&sczArguments, L"sdkfeatureband %ls %ls %ls", wzMajorVersion, wzMinorVersion, wzPatchVersion);
18 + BextExitOnFailure(hr, "Failed to build sdkfeatureband netcoresearch.exe arguments.");
19 +
20 + hr = RunNetCoreSearch(platform, wzBaseDirectory, sczArguments, psczLatestVersion);
21 + BextExitOnFailure(hr, "Failed to run netcoresearch.exe for sdkfeatureband.");
22 +
23 +LExit:
24 + ReleaseStr(sczArguments);
25 +
26 + return hr;
27 +}
28 +
29 +HRESULT NetfxPerformDetectNetCoreSdkFeatureBand(
30 + __in LPCWSTR wzVariable,
31 + __in NETFX_SEARCH* pSearch,
32 + __in IBundleExtensionEngine* pEngine,
33 + __in LPCWSTR wzBaseDirectory
34 + )
35 +{
36 + HRESULT hr = S_OK;
37 + LPWSTR sczLatestVersion = NULL;
38 +
39 + hr = DetectNetCoreSdkFeatureBand(
40 + pSearch->NetCoreSdkFeatureBandSearch.platform,
41 + pSearch->NetCoreSdkFeatureBandSearch.sczMajorVersion,
42 + pSearch->NetCoreSdkFeatureBandSearch.sczMinorVersion,
43 + pSearch->NetCoreSdkFeatureBandSearch.sczPatchVersion,
44 + wzBaseDirectory,
45 + &sczLatestVersion);
46 + BextExitOnFailure(hr, "DetectNetCoreSdkFeatureBand failed.");
47 +
48 + hr = pEngine->SetVariableVersion(wzVariable, sczLatestVersion);
49 + BextExitOnFailure(hr, "Failed to set variable '%ls' to '%ls'", wzVariable, sczLatestVersion);
50 +
51 +LExit:
52 + ReleaseStr(sczLatestVersion);
53 +
54 + return hr;
55 +}
src/ext/NetFx/be/detectnetcoresdkfeatureband.h new
+9
@@ -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 +
4 +HRESULT NetfxPerformDetectNetCoreSdkFeatureBand(
5 + __in LPCWSTR wzVariable,
6 + __in NETFX_SEARCH* pSearch,
7 + __in IBundleExtensionEngine* pEngine,
8 + __in LPCWSTR wzBaseDirectory
9 + );
src/ext/NetFx/be/netfxbe.vcxproj
+4
@@ -48,20 +48,24 @@
48 <ItemGroup>
49 <ClCompile Include="detectnetcore.cpp" />
50 <ClCompile Include="detectnetcoresdk.cpp" />
51 + <ClCompile Include="detectnetcoresdkfeatureband.cpp" />
52 <ClCompile Include="netfxbe.cpp" />
53 <ClCompile Include="NetfxBundleExtension.cpp" />
54 <ClCompile Include="netfxsearch.cpp" />
55 <ClCompile Include="precomp.cpp">
56 <PrecompiledHeader>Create</PrecompiledHeader>
57 </ClCompile>
58 + <ClCompile Include="runnetcoresearch.cpp" />
59 </ItemGroup>
60
61 <ItemGroup>
62 <ClInclude Include="detectnetcore.h" />
63 <ClInclude Include="detectnetcoresdk.h" />
64 + <ClInclude Include="detectnetcoresdkfeatureband.h" />
65 <ClInclude Include="NetfxBundleExtension.h" />
66 <ClInclude Include="netfxsearch.h" />
67 <ClInclude Include="precomp.h" />
68 + <ClInclude Include="runnetcoresearch.h" />
69 </ItemGroup>
70
71 <ItemGroup>
src/ext/NetFx/be/netfxsearch.cpp
+28 -4
@@ -15,7 +15,7 @@ STDMETHODIMP NetfxSearchParseFromXml(
15 BSTR bstrNodeName = NULL;
16
17 // Select Netfx search nodes.
18 - hr = XmlSelectNodes(pixnBundleExtension, L"NetFxNetCoreSearch|NetFxNetCoreSdkSearch", &pixnNodes);
18 + hr = XmlSelectNodes(pixnBundleExtension, L"NetFxNetCoreSearch|NetFxNetCoreSdkSearch|NetFxNetCoreSdkFeatureBandSearch", &pixnNodes);
19 BextExitOnFailure(hr, "Failed to select Netfx search nodes.");
20
21 // Get Netfx search node count.
@@ -72,9 +72,30 @@ STDMETHODIMP NetfxSearchParseFromXml(
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.");
75 + // @MajorVersion
76 + hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSdkSearch.sczMajorVersion);
77 + BextExitOnFailure(hr, "Failed to get @MajorVersion.");
78 + }
79 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, 0, bstrNodeName, -1, L"NetFxNetCoreSdkFeatureBandSearch", -1))
80 + {
81 + pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SDK_FEATURE_BAND_SEARCH;
82 +
83 + auto& netCoreSdkSearch = pSearch->NetCoreSdkFeatureBandSearch;
84 + // @Platform
85 + hr = XmlGetAttributeUInt32(pixnNode, L"Platform", reinterpret_cast<DWORD*>(&netCoreSdkSearch.platform));
86 + BextExitOnFailure(hr, "Failed to get @Platform.");
87 +
88 + // @MajorVersion
89 + hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSdkSearch.sczMajorVersion);
90 + BextExitOnFailure(hr, "Failed to get @MajorVersion.");
91 +
92 + // @MinorVersion
93 + hr = XmlGetAttributeEx(pixnNode, L"MinorVersion", &netCoreSdkSearch.sczMinorVersion);
94 + BextExitOnFailure(hr, "Failed to get @MinorVersion.");
95 +
96 + // @PatchVersion
97 + hr = XmlGetAttributeEx(pixnNode, L"PatchVersion", &netCoreSdkSearch.sczPatchVersion);
98 + BextExitOnFailure(hr, "Failed to get @PatchVersion.");
99 }
100 else
101 {
@@ -132,6 +153,9 @@ STDMETHODIMP NetfxSearchExecute(
153 case NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH:
154 hr = NetfxPerformDetectNetCoreSdk(wzVariable, pSearch, pEngine, wzBaseDirectory);
155 break;
156 + case NETFX_SEARCH_TYPE_NET_CORE_SDK_FEATURE_BAND_SEARCH:
157 + hr = NetfxPerformDetectNetCoreSdkFeatureBand(wzVariable, pSearch, pEngine, wzBaseDirectory);
158 + break;
159 default:
160 hr = E_UNEXPECTED;
161 }
src/ext/NetFx/be/netfxsearch.h
+9 -1
@@ -9,6 +9,7 @@ enum NETFX_SEARCH_TYPE
9 NETFX_SEARCH_TYPE_NONE,
10 NETFX_SEARCH_TYPE_NET_CORE_SEARCH,
11 NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH,
12 + NETFX_SEARCH_TYPE_NET_CORE_SDK_FEATURE_BAND_SEARCH,
13 };
14
15 enum NETFX_NET_CORE_RUNTIME_TYPE
@@ -44,8 +45,15 @@ typedef struct _NETFX_SEARCH
45 struct
46 {
47 NETFX_NET_CORE_PLATFORM platform;
47 - LPWSTR sczVersion;
48 + LPWSTR sczMajorVersion;
49 } NetCoreSdkSearch;
50 + struct
51 + {
52 + NETFX_NET_CORE_PLATFORM platform;
53 + LPWSTR sczMajorVersion;
54 + LPWSTR sczMinorVersion;
55 + LPWSTR sczPatchVersion;
56 + } NetCoreSdkFeatureBandSearch;
57 };
58 } NETFX_SEARCH;
59
src/ext/NetFx/be/precomp.h
+2
@@ -31,4 +31,6 @@
31 #include "netfxsearch.h"
32 #include "detectnetcore.h"
33 #include "detectnetcoresdk.h"
34 +#include "detectnetcoresdkfeatureband.h"
35 #include "NetfxBundleExtension.h"
36 +#include "runnetcoresearch.h"
src/ext/NetFx/be/runnetcoresearch.cpp new
+102
@@ -0,0 +1,102 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +#include "precomp.h"
4 +
5 +HRESULT RunNetCoreSearch(
6 + __in NETFX_NET_CORE_PLATFORM platform,
7 + __in LPCWSTR wzBaseDirectory,
8 + __in LPCWSTR wzArguments,
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\" %ls", sczExePath, wzArguments);
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 = reinterpret_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 + LPVOID pvNew = MemReAlloc(rgbOutput, cbOutput, TRUE);
69 + BextExitOnNull(pvNew, hr, E_OUTOFMEMORY, "Failed to realloc output string.");
70 +
71 + rgbOutput = reinterpret_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 +
94 +LExit:
95 + ReleaseFileHandle(hStdOutErr);
96 + ReleaseHandle(hProcess);
97 + ReleaseMem(rgbOutput);
98 + ReleaseStr(sczCommandLine);
99 + ReleaseStr(sczExePath);
100 +
101 + return hr;
102 +}
src/ext/NetFx/be/runnetcoresearch.h new
+9
@@ -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 +
4 +HRESULT RunNetCoreSearch(
5 + __in NETFX_NET_CORE_PLATFORM platform,
6 + __in LPCWSTR wzBaseDirectory,
7 + __in LPCWSTR wzArguments,
8 + __inout LPWSTR* psczLatestVersion
9 + );
src/ext/NetFx/netcoresearch/netcoresearch.cpp
+189 -138
@@ -2,137 +2,155 @@
2
3 #include "precomp.h"
4
5 -enum class NETCORESEARCHKIND
5 +enum class NETCORESEARCHTYPE
6 {
7 None,
8 Runtime,
9 Sdk,
10 + SdkFeatureBand,
11 };
12
13 struct NETCORESEARCH_STATE
14 {
14 - NETCORESEARCHKIND Kind = NETCORESEARCHKIND::None;
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;
15 + NETCORESEARCHTYPE type;
16 + HRESULT hrSearch;
17 VERUTIL_VERSION* pVersion;
18 +
19 + struct
20 + {
21 + LPCWSTR wzTargetName;
22 + DWORD dwMajorVersion;
23 + } Runtime;
24 + struct
25 + {
26 + DWORD dwMajorVersion;
27 + } Sdk;
28 + struct
29 + {
30 + DWORD dwMajorVersion;
31 + DWORD dwMinorVersion;
32 + DWORD dwPatchVersion;
33 + } SdkFeatureBand;
34 };
35
36 +static HRESULT GetSearchStateFromArguments(
37 + __in int argc,
38 + __in LPWSTR argv[],
39 + __in NETCORESEARCH_STATE* pSearchState
40 + );
41 static HRESULT GetDotnetEnvironmentInfo(
34 - __in NETCORESEARCH_STATE& pSearchState,
35 - __inout VERUTIL_VERSION** ppVersion
42 + __in NETCORESEARCH_STATE* pSearchState
43 );
44 static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
45 __in const hostfxr_dotnet_environment_info* pInfo,
46 __in LPVOID pvContext
47 );
48
42 -bool string_equal_invariant(__in PCWSTR const x,__in PCWSTR const y) { return CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, x, -1, y, -1); }
43 -
44 -HRESULT get_search_state_from_arguments(__in int argc, __in LPWSTR argv[], __out NETCORESEARCH_STATE& searchState);
45 -
49 int __cdecl wmain(int argc, LPWSTR argv[])
50 {
51 HRESULT hr = S_OK;
49 - VERUTIL_VERSION* pVersion = NULL;
50 - NETCORESEARCH_STATE searchState = {};
51 -
52 - ::SetConsoleCP(CP_UTF8);
52 + NETCORESEARCH_STATE searchState = { };
53
54 ConsoleInitialize();
55
56 - hr = get_search_state_from_arguments(argc, argv, OUT searchState);
57 - if (FAILED(hr))
58 - {
59 - ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse arguments.");
60 - }
56 + hr = GetSearchStateFromArguments(argc, argv, &searchState);
57 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse arguments.");
58
62 - hr = GetDotnetEnvironmentInfo(searchState, &pVersion);
59 + hr = GetDotnetEnvironmentInfo(&searchState);
60 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to search.");
61
64 -
65 - if (pVersion)
62 + if (searchState.pVersion)
63 {
67 - ConsoleWriteW(CONSOLE_COLOR_NORMAL, pVersion->sczVersion);
64 + ConsoleWriteW(CONSOLE_COLOR_NORMAL, searchState.pVersion->sczVersion);
65 }
66
67 LExit:
71 - ReleaseVerutilVersion(pVersion);
68 + ReleaseVerutilVersion(searchState.pVersion);
69 ConsoleUninitialize();
70 return hr;
71 }
72
76 -HRESULT get_search_state_from_arguments(int argc, LPWSTR argv[], __out NETCORESEARCH_STATE& searchState)
73 +HRESULT GetSearchStateFromArguments(
74 + __in int argc,
75 + __in LPWSTR argv[],
76 + __in NETCORESEARCH_STATE* pSearchState
77 + )
78 {
79 HRESULT hr = S_OK;
79 - searchState = {};
80 - const auto searchKind = argv[1];
80 + LPCWSTR wzSearchKind = NULL;
81
82 - if (argc < 3)
82 + if (argc < 2)
83 {
84 ExitFunction1(hr = E_INVALIDARG);
85 }
86
87 + wzSearchKind = argv[1];
88
88 - if (string_equal_invariant(searchKind, L"runtime"))
89 + if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, wzSearchKind, -1, L"runtime", -1))
90 {
91 if (argc != 4)
92 {
93 ExitFunction1(hr = E_INVALIDARG);
94 }
94 - searchState.Kind = NETCORESEARCHKIND::Runtime;
95
96 - const PCWSTR majorVersion = argv[2];
97 - const PCWSTR targetName = argv[3];
96 + LPCWSTR wzMajorVersion = argv[2];
97 + LPCWSTR wzTargetName = argv[3];
98
99 - auto& data = searchState.Data.Runtime;
99 + pSearchState->type = NETCORESEARCHTYPE::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);
101 + hr = StrStringToUInt32(wzMajorVersion, 0, reinterpret_cast<UINT*>(&pSearchState->Runtime.dwMajorVersion));
102 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get target version from: %ls", wzMajorVersion);
103 +
104 + pSearchState->Runtime.wzTargetName = wzTargetName;
105 }
105 - else if(string_equal_invariant(searchKind, L"sdk"))
106 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, wzSearchKind, -1, L"sdk", -1))
107 {
107 - searchState.Kind = NETCORESEARCHKIND::Sdk;
108 + if (argc != 3)
109 + {
110 + ExitFunction1(hr = E_INVALIDARG);
111 + }
112 +
113 + LPCWSTR wzMajorVersion = argv[2];
114
109 - const PCWSTR version = argv[2];
115 + pSearchState->type = NETCORESEARCHTYPE::Sdk;
116
111 - VERUTIL_VERSION* sdkVersion = nullptr;
112 - hr = VerParseVersion(version, 0, FALSE, &sdkVersion);
113 - if (FAILED(hr))
117 + hr = StrStringToUInt32(wzMajorVersion, 0, reinterpret_cast<UINT*>(&pSearchState->Sdk.dwMajorVersion));
118 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get sdk major version from: %ls", wzMajorVersion);
119 + }
120 + else if (CSTR_EQUAL == ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, wzSearchKind, -1, L"sdkfeatureband", -1))
121 + {
122 + if (argc != 5)
123 {
115 - ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse version from: %ls", version);
124 + ExitFunction1(hr = E_INVALIDARG);
125 }
126
118 - auto& data = searchState.Data.Sdk;
127 + LPCWSTR wzMajorVersion = argv[2];
128 + LPCWSTR wzMinorVersion = argv[3];
129 + LPCWSTR wzPatchVersion = argv[4];
130 +
131 + pSearchState->type = NETCORESEARCHTYPE::SdkFeatureBand;
132
120 - data.dwMajorVersion = sdkVersion->dwMajor;
121 - data.dwMinorVersion = sdkVersion->dwMinor;
122 - data.dwFeatureBand = sdkVersion->dwPatch;
133 + hr = StrStringToUInt32(wzMajorVersion, 0, reinterpret_cast<UINT*>(&pSearchState->SdkFeatureBand.dwMajorVersion));
134 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get major version from: %ls", wzMajorVersion);
135
124 - VerFreeVersion(sdkVersion);
136 + hr = StrStringToUInt32(wzMinorVersion, 0, reinterpret_cast<UINT*>(&pSearchState->SdkFeatureBand.dwMinorVersion));
137 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get minor version from: %ls", wzMinorVersion);
138 +
139 + hr = StrStringToUInt32(wzPatchVersion, 0, reinterpret_cast<UINT*>(&pSearchState->SdkFeatureBand.dwPatchVersion));
140 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get patch version from: %ls", wzPatchVersion);
141 + }
142 + else
143 + {
144 + pSearchState->type = NETCORESEARCHTYPE::None;
145 + ExitFunction1(hr = E_INVALIDARG);
146 }
147
148 LExit:
149 return hr;
150 }
151
131 -
132 -
152 static HRESULT GetDotnetEnvironmentInfo(
134 - __in NETCORESEARCH_STATE& state,
135 - __inout VERUTIL_VERSION** ppVersion
153 + __in NETCORESEARCH_STATE* pState
154 )
155 {
156 HRESULT hr = S_OK;
@@ -156,17 +174,13 @@ static HRESULT GetDotnetEnvironmentInfo(
174 pfnGetDotnetEnvironmentInfo = (hostfxr_get_dotnet_environment_info_fn)::GetProcAddress(hModule, "hostfxr_get_dotnet_environment_info");
175 ConsoleExitOnNullWithLastError(pfnGetDotnetEnvironmentInfo, hr, CONSOLE_COLOR_RED, "Failed to get address for hostfxr_get_dotnet_environment_info.");
176
159 - hr = pfnGetDotnetEnvironmentInfo(NULL, NULL, GetDotnetEnvironmentInfoResult, &state);
177 + hr = pfnGetDotnetEnvironmentInfo(NULL, NULL, GetDotnetEnvironmentInfoResult, pState);
178 ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get .NET Core environment info.");
179
162 - if (state.pVersion)
163 - {
164 - *ppVersion = state.pVersion;
165 - state.pVersion = NULL;
166 - }
180 + hr = pState->hrSearch;
181 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to process .NET Core environment info.");
182
183 LExit:
169 - ReleaseVerutilVersion(state.pVersion);
184 ReleaseStr(sczHostfxrPath);
185 ReleaseStr(sczProcessPath);
186
@@ -178,108 +192,145 @@ LExit:
192 return hr;
193 }
194
181 -bool matches_feature_band(const int requested, const int actual)
195 +static HRESULT PerformRuntimeSearch(
196 + __in const hostfxr_dotnet_environment_info* pInfo,
197 + __in DWORD dwMajorVersion,
198 + __in LPCWSTR wzTargetName,
199 + __inout VERUTIL_VERSION** ppVersion
200 + )
201 {
183 - // we have not requested a match on feature band, so skip the check
184 - if (requested == 0) return true;
202 + HRESULT hr = S_OK;
203 + VERUTIL_VERSION* pFrameworkVersion = NULL;
204 + int nCompare = 0;
205 +
206 + for (size_t i = 0; i < pInfo->framework_count; ++i)
207 + {
208 + const hostfxr_dotnet_environment_framework_info* pFrameworkInfo = pInfo->frameworks + i;
209 + ReleaseVerutilVersion(pFrameworkVersion);
210 +
211 + if (CSTR_EQUAL != ::CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, wzTargetName, -1, pFrameworkInfo->name, -1))
212 + {
213 + continue;
214 + }
215 +
216 + hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pFrameworkVersion);
217 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version);
218 +
219 + if (pFrameworkVersion->dwMajor != dwMajorVersion)
220 + {
221 + continue;
222 + }
223 +
224 + if (*ppVersion)
225 + {
226 + hr = VerCompareParsedVersions(*ppVersion, pFrameworkVersion, &nCompare);
227 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
228
186 - const int requestedBand = requested / 100;
187 - const int actualBand = actual / 100;
229 + if (nCompare > -1)
230 + {
231 + continue;
232 + }
233 + }
234
189 - if (actualBand != requestedBand) return false;
235 + ReleaseVerutilVersion(*ppVersion);
236 + *ppVersion = pFrameworkVersion;
237 + pFrameworkVersion = NULL;
238 + }
239
191 - return actual >= requested;
240 +LExit:
241 + ReleaseVerutilVersion(pFrameworkVersion);
242 +
243 + return hr;
244 }
245
194 -static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
246 +static HRESULT PerformSdkSearch(
247 __in const hostfxr_dotnet_environment_info* pInfo,
196 - __in LPVOID pvContext
248 + __in BOOL fFeatureBand,
249 + __in DWORD dwMajorVersion,
250 + __in DWORD dwMinorVersion,
251 + __in DWORD dwPatchVersion,
252 + __inout VERUTIL_VERSION** ppVersion
253 )
254 {
199 - NETCORESEARCH_STATE* pState = static_cast<NETCORESEARCH_STATE*>(pvContext);
255 HRESULT hr = S_OK;
201 - VERUTIL_VERSION* pDotnetVersion = nullptr;
256 + VERUTIL_VERSION* pSdkVersion = NULL;
257 int nCompare = 0;
258 + DWORD dwRequestedBand = dwPatchVersion / 100;
259
204 -
205 - if (pState->Kind == NETCORESEARCHKIND::Sdk)
260 + for (size_t i = 0; i < pInfo->sdk_count; ++i)
261 {
207 - auto& sdkData = pState->Data.Sdk;
208 - for (size_t i = 0; i < pInfo->sdk_count; ++i)
209 - {
210 - const hostfxr_dotnet_environment_sdk_info* pSdkInfo = pInfo->sdks + i;
211 - ReleaseVerutilVersion(pDotnetVersion);
262 + const hostfxr_dotnet_environment_sdk_info* pSdkInfo = pInfo->sdks + i;
263 + ReleaseVerutilVersion(pSdkVersion);
264
213 - hr = VerParseVersion(pSdkInfo->version, 0, FALSE, &pDotnetVersion);
214 - ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse sdk version: %ls", pSdkInfo->version);
265 + hr = VerParseVersion(pSdkInfo->version, 0, FALSE, &pSdkVersion);
266 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse sdk version: %ls", pSdkInfo->version);
267
216 - if (pDotnetVersion->dwMajor != sdkData.dwMajorVersion)
217 - {
218 - continue;
219 - }
220 - if (!matches_feature_band(sdkData.dwFeatureBand, pDotnetVersion->dwPatch))
268 + if (pSdkVersion->dwMajor != dwMajorVersion)
269 + {
270 + continue;
271 + }
272 +
273 + if (fFeatureBand)
274 + {
275 + if (pSdkVersion->dwMinor != dwMinorVersion)
276 {
277 continue;
278 }
279
225 - if (pState->pVersion)
280 + if ((pSdkVersion->dwPatch / 100) != dwRequestedBand)
281 {
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 - }
282 + continue;
283 }
235 -
236 - ReleaseVerutilVersion(pState->pVersion);
237 - pState->pVersion = pDotnetVersion;
238 - pDotnetVersion = nullptr;
284 }
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)
285 +
286 + if (*ppVersion)
287 {
246 - const hostfxr_dotnet_environment_framework_info* pFrameworkInfo = pInfo->frameworks + i;
247 - ReleaseVerutilVersion(pDotnetVersion);
288 + hr = VerCompareParsedVersions(*ppVersion, pSdkVersion, &nCompare);
289 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
290
249 - if (string_equal_invariant(runtimeData.wzTargetName, pFrameworkInfo->name))
291 + if (nCompare > -1)
292 {
293 continue;
294 }
295 + }
296
254 - hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pDotnetVersion);
255 - ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version);
297 + ReleaseVerutilVersion(*ppVersion);
298 + *ppVersion = pSdkVersion;
299 + pSdkVersion = NULL;
300 + }
301
257 - if (pDotnetVersion->dwMajor != runtimeData.dwMajorVersion)
258 - {
259 - continue;
260 - }
302 +LExit:
303 + ReleaseVerutilVersion(pSdkVersion);
304
262 - if (pState->pVersion)
263 - {
264 - hr = VerCompareParsedVersions(pState->pVersion, pDotnetVersion, &nCompare);
265 - ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
305 + return hr;
306 +}
307
267 - if (nCompare > -1)
268 - {
269 - continue;
270 - }
271 - }
308 +static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
309 + __in const hostfxr_dotnet_environment_info* pInfo,
310 + __in LPVOID pvContext
311 + )
312 +{
313 + NETCORESEARCH_STATE* pState = static_cast<NETCORESEARCH_STATE*>(pvContext);
314 + HRESULT hr = S_OK;
315
273 - ReleaseVerutilVersion(pState->pVersion);
274 - pState->pVersion = pDotnetVersion;
275 - pDotnetVersion = nullptr;
276 - }
316 + if (pState->type == NETCORESEARCHTYPE::Sdk)
317 + {
318 + hr = PerformSdkSearch(pInfo, FALSE, pState->Sdk.dwMajorVersion, 0, 0, &pState->pVersion);
319 + }
320 + else if (pState->type == NETCORESEARCHTYPE::SdkFeatureBand)
321 + {
322 + hr = PerformSdkSearch(pInfo, TRUE, pState->SdkFeatureBand.dwMajorVersion, pState->SdkFeatureBand.dwMinorVersion, pState->SdkFeatureBand.dwPatchVersion, &pState->pVersion);
323 + }
324 + else if (pState->type == NETCORESEARCHTYPE::Runtime)
325 + {
326 + hr = PerformRuntimeSearch(pInfo, pState->Runtime.dwMajorVersion, pState->Runtime.wzTargetName, &pState->pVersion);
327 }
328 else
329 {
280 - ConsoleWriteError(E_INVALIDARG, CONSOLE_COLOR_RED, "Invalid NETCORESEARCHKIND.");
330 + hr = E_INVALIDARG;
331 + ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Invalid NETCORESEARCHTYPE.");
332 }
333
334 LExit:
284 - ReleaseVerutilVersion(pDotnetVersion);
335 + pState->hrSearch = hr;
336 }
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest.wxs
+2
@@ -7,9 +7,11 @@
7 <PackageGroupRef Id="AspNetCoreRuntime3112Redist_x86" />
8 <PackageGroupRef Id="DesktopNetCoreRuntime3112Redist_x86" />
9 <PackageGroupRef Id="DotNetCoreRuntime3112Redist_x86" />
10 + <PackageGroupRef Id="DotNetCoreSdk31425Redist_x86" />
11 <PackageGroupRef Id="AspNetCoreRuntime3112Redist_x64" />
12 <PackageGroupRef Id="DesktopNetCoreRuntime3112Redist_x64" />
13 <PackageGroupRef Id="DotNetCoreRuntime3112Redist_x64" />
14 + <PackageGroupRef Id="DotNetCoreSdk31425Redist_x64" />
15 </Chain>
16 </Bundle>
17 </Wix>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/BundleLatest_x64.wxs
+1
@@ -7,6 +7,7 @@
7 <PackageGroupRef Id="AspNetCoreRuntime3112Redist_x64" />
8 <PackageGroupRef Id="DesktopNetCoreRuntime3112Redist_x64" />
9 <PackageGroupRef Id="DotNetCoreRuntime3112Redist_x64" />
10 + <PackageGroupRef Id="DotNetCoreSdk31425Redist_x64" />
11 </Chain>
12 </Bundle>
13 </Wix>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs
+9 -8
@@ -5,7 +5,7 @@
5 <?define NetCorePlatform = x64?>
6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?>
8 - <?define NetCoreSdkPlatform = x64?>
8 + <?define NetCoreSdkFeatureBandVersion = 31400?>
9 <?define NetCoreSdkIdVersion = 31425?>
10 <?define NetCoreSdkVersion = 3.1.425?>
11 <?include NetCore3_Platform.wxi?>
@@ -61,16 +61,17 @@
61 </Fragment>
62
63 <Fragment>
64 - <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="3.0.100" Variable="$(var.DotNetCoreSdkId)" />
64 + <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.DotNetCoreSdkId)" />
65 + <netfx:DotNetCoreSdkFeatureBandSearch Id="$(var.DotNetCoreSdkFeatureBandId)" Platform="$(var.NetCorePlatform)" Version="3.1.400" Variable="$(var.DotNetCoreSdkFeatureBandId)" />
66
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" />
67 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreSdkFeatureBandId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
68 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
69 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
70 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
71
72 <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" />
73 + <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
74 + <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCorePlatform).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" />
75 </ExePackage>
76 </PackageGroup>
77 </Fragment>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs
+9 -8
@@ -5,7 +5,7 @@
5 <?define NetCorePlatform = x86?>
6 <?define NetCoreIdVersion = 3112?>
7 <?define NetCoreVersion = 3.1.12?>
8 - <?define NetCoreSdkPlatform = x86?>
8 + <?define NetCoreSdkFeatureBandVersion = 31400?>
9 <?define NetCoreSdkIdVersion = 31425?>
10 <?define NetCoreSdkVersion = 3.1.425?>
11 <?include NetCore3_Platform.wxi?>
@@ -61,16 +61,17 @@
61 </Fragment>
62
63 <Fragment>
64 - <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="3.0.100" Variable="$(var.DotNetCoreSdkId)" />
64 + <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.DotNetCoreSdkId)" />
65 + <netfx:DotNetCoreSdkFeatureBandSearch Id="$(var.DotNetCoreSdkFeatureBandId)" Platform="$(var.NetCorePlatform)" Version="3.1.400" Variable="$(var.DotNetCoreSdkFeatureBandId)" />
66
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" />
67 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreSdkFeatureBandId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
68 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
69 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
70 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
71
72 <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" />
73 + <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
74 + <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCorePlatform).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" />
75 </ExePackage>
76 </PackageGroup>
77 </Fragment>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi
+3 -2
@@ -21,8 +21,9 @@
21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
23
24 - <?define DotNetCoreSdkId = DOTNETCORESDK3_$(var.NetCoreSdkPlatform)?>
25 - <?define DotNetCoreSdkRedistId = DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist_$(var.NetCoreSdkPlatform)?>
24 + <?define DotNetCoreSdkId = DOTNETCORESDK3_$(var.NetCorePlatform)?>
25 + <?define DotNetCoreSdkFeatureBandId = DOTNETCORESDK$(var.NetCoreSdkFeatureBandVersion)_$(var.NetCorePlatform)?>
26 + <?define DotNetCoreSdkRedistId = DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist_$(var.NetCorePlatform)?>
27 <?define DotNetCoreSdkRedistLog = DotNetCoreSdk$(var.NetCoreSdkIdVersion)RedistLog?>
28 <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29 <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
src/ext/NetFx/wixext/NetFxCompiler.cs
+175 -15
@@ -55,6 +55,12 @@ namespace WixToolset.Netfx
55 case "DotNetCoreSdkSearchRef":
56 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
57 break;
58 + case "DotNetCoreSdkFeatureBandSearch":
59 + this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element);
60 + break;
61 + case "DotNetCoreSdkFeatureBandSearchRef":
62 + this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element);
63 + break;
64 case "DotNetCompatibilityCheck":
65 this.ParseDotNetCompatibilityCheckElement(intermediate, section, element);
66 break;
@@ -81,6 +87,12 @@ namespace WixToolset.Netfx
87 case "DotNetCoreSdkSearchRef":
88 this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
89 break;
90 + case "DotNetCoreSdkFeatureBandSearch":
91 + this.ParseDotNetCoreSdkFeatureBandSearchElement(intermediate, section, element);
92 + break;
93 + case "DotNetCoreSdkFeatureBandSearchRef":
94 + this.ParseDotNetCoreSdkFeatureBandSearchRefElement(intermediate, section, element);
95 + break;
96 default:
97 this.ParseHelper.UnexpectedElement(parentElement, element);
98 break;
@@ -267,8 +279,8 @@ namespace WixToolset.Netfx
279 string variable = null;
280 string condition = null;
281 string after = null;
270 - NetCoreSdkSearchPlatform? platform = null;
271 - string version = null;
282 + NetCoreSearchPlatform? platform = null;
283 + var majorVersion = CompilerConstants.IntegerNotSet;
284
285 foreach (var attrib in element.Attributes())
286 {
@@ -293,22 +305,22 @@ namespace WixToolset.Netfx
305 switch (platformValue)
306 {
307 case "arm64":
296 - platform = NetCoreSdkSearchPlatform.Arm64;
308 + platform = NetCoreSearchPlatform.Arm64;
309 break;
310 case "x64":
299 - platform = NetCoreSdkSearchPlatform.X64;
311 + platform = NetCoreSearchPlatform.X64;
312 break;
313 case "x86":
302 - platform = NetCoreSdkSearchPlatform.X86;
314 + platform = NetCoreSearchPlatform.X86;
315 break;
316 default:
317 this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86"));
318 break;
319 }
320 break;
309 - case "Version":
321 + case "MajorVersion":
322 // .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);
323 + majorVersion = this.ParseHelper.GetAttributeIntegerValue(sourceLineNumbers, attrib, 3, Int32.MaxValue);
324 break;
325 default:
326 this.ParseHelper.UnexpectedAttribute(element, attrib);
@@ -331,16 +343,13 @@ namespace WixToolset.Netfx
343 this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform"));
344 }
345
334 -
335 - if (String.IsNullOrEmpty(version))
346 + if (majorVersion == CompilerConstants.IntegerNotSet)
347 {
337 - this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version"));
348 + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "MajorVersion"));
349 }
339 -
340 - var ver = Version.Parse(version);
341 - if (ver.Major == 4)
350 + else if (majorVersion == 4)
351 {
343 - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*"));
352 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "MajorVersion", "4", "3", "5+"));
353 }
354
355 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
@@ -358,7 +367,7 @@ namespace WixToolset.Netfx
367 section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id)
368 {
369 Platform = platform.Value,
361 - Version = version,
370 + MajorVersion = majorVersion,
371 });
372 }
373 }
@@ -391,6 +400,157 @@ namespace WixToolset.Netfx
400 this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
401 }
402
403 + private void ParseDotNetCoreSdkFeatureBandSearchElement(Intermediate intermediate, IntermediateSection section, XElement element)
404 + {
405 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
406 + Identifier id = null;
407 + string variable = null;
408 + string condition = null;
409 + string after = null;
410 + NetCoreSearchPlatform? platform = null;
411 + string version = null;
412 + var majorVersion = 0;
413 + var minorVersion = 0;
414 + var patchVersion = 0;
415 +
416 + foreach (var attrib in element.Attributes())
417 + {
418 + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
419 + {
420 + switch (attrib.Name.LocalName)
421 + {
422 + case "Id":
423 + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib);
424 + break;
425 + case "Variable":
426 + variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib);
427 + break;
428 + case "Condition":
429 + condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
430 + break;
431 + case "After":
432 + after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
433 + break;
434 + case "Platform":
435 + var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
436 + switch (platformValue)
437 + {
438 + case "arm64":
439 + platform = NetCoreSearchPlatform.Arm64;
440 + break;
441 + case "x64":
442 + platform = NetCoreSearchPlatform.X64;
443 + break;
444 + case "x86":
445 + platform = NetCoreSearchPlatform.X86;
446 + break;
447 + default:
448 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86"));
449 + break;
450 + }
451 + break;
452 + case "Version":
453 + version = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
454 + break;
455 + default:
456 + this.ParseHelper.UnexpectedAttribute(element, attrib);
457 + break;
458 + }
459 + }
460 + else
461 + {
462 + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
463 + }
464 + }
465 +
466 + if (id == null)
467 + {
468 + id = this.ParseHelper.CreateIdentifier("dncsfbs", variable, condition, after);
469 + }
470 +
471 + if (!platform.HasValue)
472 + {
473 + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform"));
474 + }
475 +
476 + if (String.IsNullOrEmpty(version))
477 + {
478 + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version"));
479 + }
480 + else
481 + {
482 + if (!Version.TryParse(version, out var featureBandVersion))
483 + {
484 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00"));
485 + }
486 + else
487 + {
488 + majorVersion = featureBandVersion.Major;
489 + minorVersion = featureBandVersion.Minor;
490 + patchVersion = featureBandVersion.Build;
491 +
492 + if ((patchVersion % 100) != 0 || featureBandVersion.Revision != -1)
493 + {
494 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "x.x.x00"));
495 + }
496 +
497 + if (majorVersion == 4)
498 + {
499 + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*"));
500 + }
501 + }
502 + }
503 +
504 + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
505 +
506 + var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64);
507 + if (bundleExtensionId == null)
508 + {
509 + this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName));
510 + }
511 +
512 + if (!this.Messaging.EncounteredError)
513 + {
514 + this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId);
515 +
516 + section.AddSymbol(new NetFxNetCoreSdkFeatureBandSearchSymbol(sourceLineNumbers, id)
517 + {
518 + Platform = platform.Value,
519 + MajorVersion = majorVersion,
520 + MinorVersion = minorVersion,
521 + PatchVersion = patchVersion,
522 + });
523 + }
524 + }
525 +
526 + private void ParseDotNetCoreSdkFeatureBandSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element)
527 + {
528 + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element);
529 +
530 + foreach (var attrib in element.Attributes())
531 + {
532 + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace)
533 + {
534 + switch (attrib.Name.LocalName)
535 + {
536 + case "Id":
537 + var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
538 + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, refId);
539 + break;
540 + default:
541 + this.ParseHelper.UnexpectedAttribute(element, attrib);
542 + break;
543 + }
544 + }
545 + else
546 + {
547 + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib);
548 + }
549 + }
550 +
551 + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
552 + }
553 +
554 /// <summary>
555 /// Parses a NativeImage element.
556 /// </summary>
src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkFeatureBandSymbol.cs new
+71
@@ -0,0 +1,71 @@
1 +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2 +
3 +namespace WixToolset.Netfx
4 +{
5 + using WixToolset.Data;
6 + using WixToolset.Netfx.Symbols;
7 +
8 + public static partial class NetfxSymbolDefinitions
9 + {
10 + public static readonly IntermediateSymbolDefinition NetFxNetCoreSdkFeatureBandSearch = new IntermediateSymbolDefinition(
11 + NetfxSymbolDefinitionType.NetFxNetCoreSdkFeatureBandSearch.ToString(),
12 + new[]
13 + {
14 + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform), IntermediateFieldType.Number),
15 + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion), IntermediateFieldType.Number),
16 + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion), IntermediateFieldType.Number),
17 + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion), IntermediateFieldType.Number),
18 + },
19 + typeof(NetFxNetCoreSdkFeatureBandSearchSymbol));
20 + }
21 +}
22 +
23 +namespace WixToolset.Netfx.Symbols
24 +{
25 + using WixToolset.Data;
26 +
27 + public enum NetFxNetCoreSdkFeatureBandSearchSymbolFields
28 + {
29 + Platform,
30 + MajorVersion,
31 + MinorVersion,
32 + PatchVersion,
33 + }
34 +
35 + public class NetFxNetCoreSdkFeatureBandSearchSymbol : IntermediateSymbol
36 + {
37 + public NetFxNetCoreSdkFeatureBandSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, null, null)
38 + {
39 + }
40 +
41 + public NetFxNetCoreSdkFeatureBandSearchSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch, sourceLineNumber, id)
42 + {
43 + }
44 +
45 + public IntermediateField this[NetFxNetCoreSdkFeatureBandSearchSymbolFields index] => this.Fields[(int)index];
46 +
47 + public NetCoreSearchPlatform Platform
48 + {
49 + get => (NetCoreSearchPlatform)this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform].AsNumber();
50 + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.Platform, (int)value);
51 + }
52 +
53 + public int MajorVersion
54 + {
55 + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion].AsNumber();
56 + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MajorVersion, value);
57 + }
58 +
59 + public int MinorVersion
60 + {
61 + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion].AsNumber();
62 + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.MinorVersion, value);
63 + }
64 +
65 + public int PatchVersion
66 + {
67 + get => this.Fields[(int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion].AsNumber();
68 + set => this.Set((int)NetFxNetCoreSdkFeatureBandSearchSymbolFields.PatchVersion, value);
69 + }
70 + }
71 +}
src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs
+8 -17
@@ -12,9 +12,9 @@ namespace WixToolset.Netfx
12 new[]
13 {
14 new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Platform), IntermediateFieldType.Number),
15 - new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Version), IntermediateFieldType.String),
15 + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.MajorVersion), IntermediateFieldType.Number),
16 },
17 - typeof(NetFxNetCoreSearchSymbol));
17 + typeof(NetFxNetCoreSdkSearchSymbol));
18 }
19 }
20
@@ -22,21 +22,12 @@ namespace WixToolset.Netfx.Symbols
22 {
23 using WixToolset.Data;
24
25 -
26 - public enum NetCoreSdkSearchPlatform
27 - {
28 - X86,
29 - X64,
30 - Arm64,
31 - }
32 -
25 public enum NetFxNetCoreSdkSearchSymbolFields
26 {
27 Platform,
36 - Version,
28 + MajorVersion,
29 }
30
39 -
31 public class NetFxNetCoreSdkSearchSymbol : IntermediateSymbol
32 {
33 public NetFxNetCoreSdkSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, null, null)
@@ -49,16 +40,16 @@ namespace WixToolset.Netfx.Symbols
40
41 public IntermediateField this[NetFxNetCoreSdkSearchSymbolFields index] => this.Fields[(int)index];
42
52 - public NetCoreSdkSearchPlatform Platform
43 + public NetCoreSearchPlatform Platform
44 {
54 - get => (NetCoreSdkSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber();
45 + get => (NetCoreSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber();
46 set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Platform, (int)value);
47 }
48
58 - public string Version
49 + public int MajorVersion
50 {
60 - get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Version].AsString();
61 - set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Version, value);
51 + get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.MajorVersion].AsNumber();
52 + set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.MajorVersion, value);
53 }
54 }
55 }
src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
+6 -1
@@ -10,8 +10,9 @@ namespace WixToolset.Netfx
10 {
11 NetFxNativeImage,
12 NetFxNetCoreSearch,
13 - NetFxNetCoreSdkSearch,
13 NetFxDotNetCompatibilityCheck,
14 + NetFxNetCoreSdkSearch,
15 + NetFxNetCoreSdkFeatureBandSearch,
16 }
17
18 public static partial class NetfxSymbolDefinitions
@@ -41,6 +42,9 @@ namespace WixToolset.Netfx
42 case NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch:
43 return NetfxSymbolDefinitions.NetFxNetCoreSdkSearch;
44
45 + case NetfxSymbolDefinitionType.NetFxNetCoreSdkFeatureBandSearch:
46 + return NetfxSymbolDefinitions.NetFxNetCoreSdkFeatureBandSearch;
47 +
48 case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck:
49 return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck;
50
@@ -53,6 +57,7 @@ namespace WixToolset.Netfx
57 {
58 NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
59 NetFxNetCoreSdkSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
60 + NetFxNetCoreSdkFeatureBandSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
61 }
62 }
63 }
src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs
+13 -8
@@ -5,7 +5,7 @@
5 <?define NetCorePlatform = x86?>
6 <?define NetCoreIdVersion = 609?>
7 <?define NetCoreVersion = 6.0.9?>
8 - <?define NetCoreSdkPlatform = x86?>
8 + <?define NetCoreSdkFeatureBandVersion = 60400?>
9 <?define NetCoreSdkIdVersion = 60403?>
10 <?define NetCoreSdkVersion = 6.0.403?>
11 <?include NetCore6_Platform.wxi?>
@@ -61,16 +61,21 @@
61 </Fragment>
62
63 <Fragment>
64 - <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="6.0.200" Variable="$(var.DotNetCoreSdkId)" />
64 + <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.DotNetCoreSdkId)" />
65 + <netfx:DotNetCoreSdkFeatureBandSearch Id="$(var.DotNetCoreSdkFeatureBandId)" Platform="$(var.NetCorePlatform)" Version="6.0.400" Variable="$(var.DotNetCoreSdkFeatureBandId)" />
66 + </Fragment>
67 +
68 + <Fragment>
69 + <netfx:DotNetCoreSdkFeatureBandSearchRef Id="$(var.DotNetCoreSdkFeatureBandId)" />
70
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" />
71 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreSdkFeatureBandId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
72 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
73 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
74 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
75
76 <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" />
77 + <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
78 + <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCorePlatform).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" />
79 </ExePackage>
80 </PackageGroup>
81 </Fragment>
src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi
+4 -3
@@ -21,9 +21,10 @@
21 <?define DotNetCoreRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
22 <?define DotNetCoreRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreRedistLog)]"?>
23
24 - <?define DotNetCoreSdkId = DOTNETCORERUNTIME6_$(var.NetCoreSdkPlatform)?>
25 - <?define DotNetCoreSdkRedistId = DotNetCoreRuntime$(var.NetCoreIdVersion)Redist_$(var.NetCoreSdkPlatform)?>
26 - <?define DotNetCoreSdkRedistLog = DotNetCoreRuntime$(var.NetCoreSdkIdVersion)RedistLog?>
24 + <?define DotNetCoreSdkId = DOTNETCORESDK6_$(var.NetCorePlatform)?>
25 + <?define DotNetCoreSdkFeatureBandId = DOTNETCORESDK$(var.NetCoreSdkFeatureBandVersion)_$(var.NetCorePlatform)?>
26 + <?define DotNetCoreSdkRedistId = DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist_$(var.NetCorePlatform)?>
27 + <?define DotNetCoreSdkRedistLog = DotNetCoreSdk$(var.NetCoreSdkIdVersion)RedistLog?>
28 <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29 <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
30
src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs
+13 -8
@@ -5,7 +5,7 @@
5 <?define NetCorePlatform = x64?>
6 <?define NetCoreIdVersion = 609?>
7 <?define NetCoreVersion = 6.0.9?>
8 - <?define NetCoreSdkPlatform = x64?>
8 + <?define NetCoreSdkFeatureBandVersion = 60400?>
9 <?define NetCoreSdkIdVersion = 60403?>
10 <?define NetCoreSdkVersion = 6.0.403?>
11 <?include ..\TestBAWixlib\NetCore6_Platform.wxi?>
@@ -61,16 +61,21 @@
61 </Fragment>
62
63 <Fragment>
64 - <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCoreSdkPlatform)" Version="6.0.200" Variable="$(var.DotNetCoreSdkId)" />
64 + <netfx:DotNetCoreSdkSearch Id="$(var.DotNetCoreSdkId)" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.DotNetCoreSdkId)" />
65 + <netfx:DotNetCoreSdkFeatureBandSearch Id="$(var.DotNetCoreSdkFeatureBandId)" Platform="$(var.NetCorePlatform)" Version="6.0.400" Variable="$(var.DotNetCoreSdkFeatureBandId)" />
66 + </Fragment>
67 +
68 + <Fragment>
69 + <netfx:DotNetCoreSdkFeatureBandSearchRef Id="$(var.DotNetCoreSdkFeatureBandId)" />
70
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" />
71 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition" Value="$(var.DotNetCoreSdkFeatureBandId) &gt;= v$(var.NetCoreSdkVersion)" Overridable="yes" />
72 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition" Value="" Overridable="yes" />
73 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory" Value="redist\" Overridable="yes" />
74 + <WixVariable Id="DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)RepairArguments" Value="" Overridable="yes" />
75
76 <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" />
77 + <ExePackage CacheId="$(var.DotNetCoreSdkRedistId)_2485A7AFA98E178CB8F30C9838346B514AEA4769" InstallArguments="$(var.DotNetCoreSdkRedistInstallArguments)" PerMachine="yes" DetectCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)DetectCondition)" InstallCondition="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)InstallCondition)" Id="$(var.DotNetCoreSdkRedistId)" Vital="yes" Permanent="yes" Protocol="burn" LogPathVariable="$(var.DotNetCoreSdkRedistLog)" Cache="remove">
78 + <ExePackagePayload Name="!(wix.DotNetCoreSdk$(var.NetCoreSdkIdVersion)Redist$(var.NetCorePlatform)PackageDirectory)dotnet-sdk-$(var.NetCoreSdkVersion)-win-$(var.NetCorePlatform).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" />
79 </ExePackage>
80 </PackageGroup>
81 </Fragment>
src/test/burn/TestData/TestBA/TestBAWixlib_x64/WixBA_x64.wxs
+4 -2
@@ -1,5 +1,5 @@
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 -<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
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 +<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:netfx="http://wixtoolset.org/schemas/v4/wxs/netfx">
3 <Fragment>
4 <BootstrapperApplication>
5 <Payload SourceFile="!(bindpath.dncx64)\WixToolset.WixBA.deps.json" />
@@ -14,5 +14,7 @@
14 <PackageGroup Id="WixBAdnc_x64">
15 <PackageGroupRef Id="DesktopNetCoreRuntime609Redist_x64AsPrereq" />
16 </PackageGroup>
17 +
18 + <netfx:DotNetCoreSdkSearchRef Id="DOTNETCORESDK6_x64" />
19 </Fragment>
20 </Wix>