Adding support for DotNetCoreSdkSearch and DotNetCoreSdkCompatibilityCheck
Staffan Gustafsson committed
Nov 30, 2022 at 17:15 UTC
853887b4e84df1965794802b7683f3a9aca3e930
19 files changed
+770
-119
src/ext/NetFx/be/detectnetcore.cpp
+1
-1
@@ -60,7 +60,7 @@ HRESULT DetectNetCore(
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\" %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.");
65
66
hr = ProcExecute(sczExePath, sczCommandLine, &hProcess, NULL, &hStdOutErr);
src/ext/NetFx/be/detectnetcoresdk.cpp
new
+122
@@ -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
+
5
+HRESULT 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
+
94
+LExit:
95
+ ReleaseFileHandle(hStdOutErr);
96
+ ReleaseHandle(hProcess);
97
+ ReleaseMem(rgbOutput);
98
+ ReleaseStr(sczCommandLine);
99
+ ReleaseStr(sczExePath);
100
+
101
+ return hr;
102
+}
103
+
104
+HRESULT 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
+
120
+LExit:
121
+ return hr;
122
+}
src/ext/NetFx/be/detectnetcoresdk.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 NetfxPerformDetectNetCoreSdk(
5
+ __in LPCWSTR wzVariable,
6
+ __in NETFX_SEARCH* pSearch,
7
+ __in IBundleExtensionEngine* pEngine,
8
+ __in LPCWSTR wzBaseDirectory
9
+ );
src/ext/NetFx/be/netfxbe.vcxproj
+2
@@ -47,6 +47,7 @@
47
48
<ItemGroup>
49
<ClCompile Include="detectnetcore.cpp" />
50
+ <ClCompile Include="detectnetcoresdk.cpp" />
51
<ClCompile Include="netfxbe.cpp" />
52
<ClCompile Include="NetfxBundleExtension.cpp" />
53
<ClCompile Include="netfxsearch.cpp" />
@@ -57,6 +58,7 @@
58
59
<ItemGroup>
60
<ClInclude Include="detectnetcore.h" />
61
+ <ClInclude Include="detectnetcoresdk.h" />
62
<ClInclude Include="NetfxBundleExtension.h" />
63
<ClInclude Include="netfxsearch.h" />
64
<ClInclude Include="precomp.h" />
src/ext/NetFx/be/netfxsearch.cpp
+21
-4
@@ -15,7 +15,7 @@ STDMETHODIMP NetfxSearchParseFromXml(
15
BSTR bstrNodeName = NULL;
16
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.");
20
21
// Get Netfx search node count.
@@ -50,18 +50,32 @@ STDMETHODIMP NetfxSearchParseFromXml(
50
{
51
pSearch->Type = NETFX_SEARCH_TYPE_NET_CORE_SEARCH;
52
53
+ auto& netCoreSearch = pSearch->NetCoreSearch;
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));
56
BextExitOnFailure(hr, "Failed to get @RuntimeType.");
57
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));
60
BextExitOnFailure(hr, "Failed to get @Platform.");
61
62
// @MajorVersion
62
- hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &pSearch->NetCoreSearch.sczMajorVersion);
63
+ hr = XmlGetAttributeEx(pixnNode, L"MajorVersion", &netCoreSearch.sczMajorVersion);
64
BextExitOnFailure(hr, "Failed to get @MajorVersion.");
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
+ }
79
else
80
{
81
BextExitWithRootFailure(hr, E_UNEXPECTED, "Unexpected element name: %ls", bstrNodeName);
@@ -115,6 +129,9 @@ STDMETHODIMP NetfxSearchExecute(
129
case NETFX_SEARCH_TYPE_NET_CORE_SEARCH:
130
hr = NetfxPerformDetectNetCore(wzVariable, pSearch, pEngine, wzBaseDirectory);
131
break;
132
+ case NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH:
133
+ hr = NetfxPerformDetectNetCoreSdk(wzVariable, pSearch, pEngine, wzBaseDirectory);
134
+ break;
135
default:
136
hr = E_UNEXPECTED;
137
}
src/ext/NetFx/be/netfxsearch.h
+6
@@ -8,6 +8,7 @@ enum NETFX_SEARCH_TYPE
8
{
9
NETFX_SEARCH_TYPE_NONE,
10
NETFX_SEARCH_TYPE_NET_CORE_SEARCH,
11
+ NETFX_SEARCH_TYPE_NET_CORE_SDK_SEARCH,
12
};
13
14
enum NETFX_NET_CORE_RUNTIME_TYPE
@@ -40,6 +41,11 @@ typedef struct _NETFX_SEARCH
41
NETFX_NET_CORE_PLATFORM platform;
42
LPWSTR sczMajorVersion;
43
} NetCoreSearch;
44
+ struct
45
+ {
46
+ NETFX_NET_CORE_PLATFORM platform;
47
+ LPWSTR sczVersion;
48
+ } NetCoreSdkSearch;
49
};
50
} NETFX_SEARCH;
51
src/ext/NetFx/be/precomp.h
+1
@@ -30,4 +30,5 @@
30
#include "..\..\beDecor.h"
31
#include "netfxsearch.h"
32
#include "detectnetcore.h"
33
+#include "detectnetcoresdk.h"
34
#include "NetfxBundleExtension.h"
src/ext/NetFx/netcoresearch/netcoresearch.cpp
+175
-41
@@ -2,16 +2,36 @@
2
3
#include "precomp.h"
4
5
+enum class NETCORESEARCHKIND
6
+{
7
+ None,
8
+ Runtime,
9
+ Sdk,
10
+};
11
+
12
struct NETCORESEARCH_STATE
13
{
7
- LPCWSTR wzTargetName;
8
- DWORD dwMajorVersion;
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;
30
VERUTIL_VERSION* pVersion;
31
};
32
33
static HRESULT GetDotnetEnvironmentInfo(
13
- __in DWORD dwMajorVersion,
14
- __in_z LPCWSTR wzTargetName,
34
+ __in NETCORESEARCH_STATE& pSearchState,
35
__inout VERUTIL_VERSION** ppVersion
36
);
37
static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
@@ -19,24 +39,28 @@ static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
39
__in LPVOID pvContext
40
);
41
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
+
46
int __cdecl wmain(int argc, LPWSTR argv[])
47
{
48
HRESULT hr = S_OK;
25
- DWORD dwMajorVersion = 0;
49
VERUTIL_VERSION* pVersion = NULL;
50
+ NETCORESEARCH_STATE searchState = {};
51
+
52
+ ::SetConsoleCP(CP_UTF8);
53
54
ConsoleInitialize();
55
30
- if (argc != 3)
56
+ hr = get_search_state_from_arguments(argc, argv, OUT searchState);
57
+ if (FAILED(hr))
58
{
32
- ExitFunction1(hr = E_INVALIDARG);
59
+ ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse arguments.");
60
}
61
35
- hr = StrStringToUInt32(argv[1], 0, reinterpret_cast<UINT*>(&dwMajorVersion));
36
- ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get target version from: %ls", argv[1]);
62
+ hr = GetDotnetEnvironmentInfo(searchState, &pVersion);
63
38
- hr = GetDotnetEnvironmentInfo(dwMajorVersion, argv[2], &pVersion);
39
- ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to search for .NET Core.");
64
65
if (pVersion)
66
{
@@ -49,9 +73,65 @@ LExit:
73
return hr;
74
}
75
76
+HRESULT 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
+
127
+LExit:
128
+ return hr;
129
+}
130
+
131
+
132
+
133
static HRESULT GetDotnetEnvironmentInfo(
53
- __in DWORD dwMajorVersion,
54
- __in_z LPCWSTR wzTargetName,
134
+ __in NETCORESEARCH_STATE& state,
135
__inout VERUTIL_VERSION** ppVersion
136
)
137
{
@@ -60,10 +140,6 @@ static HRESULT GetDotnetEnvironmentInfo(
140
LPWSTR sczHostfxrPath = NULL;
141
HMODULE hModule = NULL;
142
hostfxr_get_dotnet_environment_info_fn pfnGetDotnetEnvironmentInfo = NULL;
63
- NETCORESEARCH_STATE state = { };
64
-
65
- state.dwMajorVersion = dwMajorVersion;
66
- state.wzTargetName = wzTargetName;
143
144
hr = PathForCurrentProcess(&sczProcessPath, NULL);
145
ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to get process path.");
@@ -102,50 +178,108 @@ LExit:
178
return hr;
179
}
180
181
+bool 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
+
194
static void HOSTFXR_CALLTYPE GetDotnetEnvironmentInfoResult(
195
__in const hostfxr_dotnet_environment_info* pInfo,
196
__in LPVOID pvContext
197
)
198
{
110
- NETCORESEARCH_STATE* pState = reinterpret_cast<NETCORESEARCH_STATE*>(pvContext);
199
+ NETCORESEARCH_STATE* pState = static_cast<NETCORESEARCH_STATE*>(pvContext);
200
HRESULT hr = S_OK;
112
- VERUTIL_VERSION* pFrameworkVersion = NULL;
201
+ VERUTIL_VERSION* pDotnetVersion = nullptr;
202
int nCompare = 0;
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);
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)
209
{
122
- continue;
123
- }
210
+ const hostfxr_dotnet_environment_sdk_info* pSdkInfo = pInfo->sdks + i;
211
+ ReleaseVerutilVersion(pDotnetVersion);
212
125
- hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pFrameworkVersion);
126
- ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version);
213
+ hr = VerParseVersion(pSdkInfo->version, 0, FALSE, &pDotnetVersion);
214
+ ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse sdk version: %ls", pSdkInfo->version);
215
128
- if (pFrameworkVersion->dwMajor != pState->dwMajorVersion)
129
- {
130
- continue;
131
- }
216
+ if (pDotnetVersion->dwMajor != sdkData.dwMajorVersion)
217
+ {
218
+ continue;
219
+ }
220
+ if (!matches_feature_band(sdkData.dwFeatureBand, pDotnetVersion->dwPatch))
221
+ {
222
+ continue;
223
+ }
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)
245
{
135
- hr = VerCompareParsedVersions(pState->pVersion, pFrameworkVersion, &nCompare);
136
- ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to compare versions.");
246
+ const hostfxr_dotnet_environment_framework_info* pFrameworkInfo = pInfo->frameworks + i;
247
+ ReleaseVerutilVersion(pDotnetVersion);
248
138
- if (nCompare > -1)
249
+ if (string_equal_invariant(runtimeData.wzTargetName, pFrameworkInfo->name))
250
{
251
continue;
252
}
142
- }
253
144
- ReleaseVerutilVersion(pState->pVersion);
145
- pState->pVersion = pFrameworkVersion;
146
- pFrameworkVersion = NULL;
254
+ hr = VerParseVersion(pFrameworkInfo->version, 0, FALSE, &pDotnetVersion);
255
+ ConsoleExitOnFailure(hr, CONSOLE_COLOR_RED, "Failed to parse framework version: %ls", pFrameworkInfo->version);
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.");
281
}
282
283
LExit:
150
- ReleaseVerutilVersion(pFrameworkVersion);
284
+ ReleaseVerutilVersion(pDotnetVersion);
285
}
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x64.wxs
+19
@@ -5,11 +5,15 @@
5
<?define NetCorePlatform = x64?>
6
<?define NetCoreIdVersion = 3112?>
7
<?define NetCoreVersion = 3.1.12?>
8
+ <?define NetCoreSdkPlatform = x64?>
9
+ <?define NetCoreSdkIdVersion = 31425?>
10
+ <?define NetCoreSdkVersion = 3.1.425?>
11
<?include NetCore3_Platform.wxi?>
12
13
<?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/20cf277c-2ccf-449f-a0b8-925ba0c175e7/aa50b052ceb8a8d36a5b4f9b8d0bd91c/aspnetcore-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?>
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?>
17
18
<Fragment>
19
<netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
59
</ExePackage>
60
</PackageGroup>
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) >= 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>
77
</Wix>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3.1.12_x86.wxs
+19
@@ -5,11 +5,15 @@
5
<?define NetCorePlatform = x86?>
6
<?define NetCoreIdVersion = 3112?>
7
<?define NetCoreVersion = 3.1.12?>
8
+ <?define NetCoreSdkPlatform = x86?>
9
+ <?define NetCoreSdkIdVersion = 31425?>
10
+ <?define NetCoreSdkVersion = 3.1.425?>
11
<?include NetCore3_Platform.wxi?>
12
13
<?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/55d6ff56-2725-4657-bffd-fdf35d6816fd/7431d1d3533f0b1ac97df734c45c33f2/aspnetcore-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?>
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?>
17
18
<Fragment>
19
<netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="3" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
59
</ExePackage>
60
</PackageGroup>
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) >= 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>
77
</Wix>
src/ext/NetFx/test/WixToolsetTest.Netfx/TestData/UsingDotNetCorePackages/NetCore3_Platform.wxi
+14
@@ -21,6 +21,12 @@
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)?>
26
+ <?define DotNetCoreSdkRedistLog = DotNetCoreSdk$(var.NetCoreSdkIdVersion)RedistLog?>
27
+ <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
28
+ <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29
+
30
<?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?>
31
32
<Fragment>
@@ -46,4 +52,12 @@
52
53
<bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
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>
63
</Include>
src/ext/NetFx/wixext/NetFxCompiler.cs
+240
-53
@@ -49,6 +49,12 @@ namespace WixToolset.Netfx
49
case "DotNetCoreSearchRef":
50
this.ParseDotNetCoreSearchRefElement(intermediate, section, element);
51
break;
52
+ case "DotNetCoreSdkSearch":
53
+ this.ParseDotNetCoreSdkSearchElement(intermediate, section, element);
54
+ break;
55
+ case "DotNetCoreSdkSearchRef":
56
+ this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
57
+ break;
58
case "DotNetCompatibilityCheck":
59
this.ParseDotNetCompatibilityCheckElement(intermediate, section, element);
60
break;
@@ -69,6 +75,12 @@ namespace WixToolset.Netfx
75
case "DotNetCoreSearchRef":
76
this.ParseDotNetCoreSearchRefElement(intermediate, section, element);
77
break;
78
+ case "DotNetCoreSdkSearch":
79
+ this.ParseDotNetCoreSdkSearchElement(intermediate, section, element);
80
+ break;
81
+ case "DotNetCoreSdkSearchRef":
82
+ this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element);
83
+ break;
84
default:
85
this.ParseHelper.UnexpectedElement(parentElement, element);
86
break;
@@ -248,6 +260,137 @@ namespace WixToolset.Netfx
260
this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element);
261
}
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
+
394
/// <summary>
395
/// Parses a NativeImage element.
396
/// </summary>
@@ -389,66 +532,19 @@ namespace WixToolset.Netfx
532
property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib);
533
break;
534
case "RuntimeType":
392
- runtimeType = this.ParseHelper.GetAttributeValue(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
- }
535
+ runtimeType = this.ParseRuntimeType(element, sourceLineNumbers, attrib);
536
break;
537
case "Platform":
410
- platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib);
411
- switch (platform.ToLower())
412
- {
413
- case "x86":
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
- }
538
+ platform = this.ParsePlatform(element, sourceLineNumbers, attrib);
539
+ break;
540
+ case "FeatureBand":
541
+ platform = this.ParseFeatureBand(element, sourceLineNumbers, attrib);
542
break;
543
case "Version":
544
version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib);
545
break;
546
case "RollForward":
427
- rollForward = this.ParseHelper.GetAttributeValue(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
- }
547
+ rollForward = this.ParseRollForward(element, sourceLineNumbers, attrib);
548
break;
549
default:
550
this.ParseHelper.UnexpectedAttribute(element, attrib);
@@ -503,6 +599,97 @@ namespace WixToolset.Netfx
599
}
600
}
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
+
693
/// <summary>
694
/// Parses a DotNetCompatibilityCheckRef element.
695
/// </summary>
src/ext/NetFx/wixext/NetfxTableDefinitions.cs
+1
-1
@@ -40,7 +40,7 @@ namespace WixToolset.Netfx
40
public static readonly TableDefinition[] All = new[]
41
{
42
NetFxNativeImage,
43
- NetFxDotNetCompatibilityCheck
43
+ NetFxDotNetCompatibilityCheck,
44
};
45
}
46
}
src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs
+17
-17
@@ -11,11 +11,11 @@ namespace WixToolset.Netfx
11
NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck.ToString(),
12
new[]
13
{
14
- new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType), IntermediateFieldType.String),
15
- new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Platform), IntermediateFieldType.String),
16
- new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Version), IntermediateFieldType.String),
17
- new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RollForward), IntermediateFieldType.String),
18
- new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Property), IntermediateFieldType.String),
14
+ new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType), IntermediateFieldType.String),
15
+ new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Platform), IntermediateFieldType.String),
16
+ new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Version), IntermediateFieldType.String),
17
+ new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RollForward), IntermediateFieldType.String),
18
+ new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Property), IntermediateFieldType.String),
19
},
20
typeof(NetFxDotNetCompatibilityCheckSymbol));
21
}
@@ -25,7 +25,7 @@ namespace WixToolset.Netfx.Symbols
25
{
26
using WixToolset.Data;
27
28
- public enum NetFxDotNetCompatibilityCheckSymbollFields
28
+ public enum NetFxDotNetCompatibilityCheckSymbolFields
29
{
30
RuntimeType,
31
Platform,
@@ -44,36 +44,36 @@ namespace WixToolset.Netfx.Symbols
44
{
45
}
46
47
- public IntermediateField this[NetFxDotNetCompatibilityCheckSymbollFields index] => this.Fields[(int)index];
47
+ public IntermediateField this[NetFxDotNetCompatibilityCheckSymbolFields index] => this.Fields[(int)index];
48
49
public string RuntimeType
50
{
51
- get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType].AsString();
52
- set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType, value);
51
+ get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType].AsString();
52
+ set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType, value);
53
}
54
55
public string Platform
56
{
57
- get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Platform].AsString();
58
- set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Platform, value);
57
+ get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Platform].AsString();
58
+ set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Platform, value);
59
}
60
61
public string Version
62
{
63
- get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Version].AsString();
64
- set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Version, value);
63
+ get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Version].AsString();
64
+ set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Version, value);
65
}
66
67
public string RollForward
68
{
69
- get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward].AsString();
70
- set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward, value);
69
+ get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward].AsString();
70
+ set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward, value);
71
}
72
73
public string Property
74
{
75
- get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Property].AsString();
76
- set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Property, value);
75
+ get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Property].AsString();
76
+ set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Property, value);
77
}
78
}
79
}
src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs
new
+64
@@ -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
+
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 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
+
21
+namespace 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
+}
src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs
+7
-2
@@ -10,7 +10,8 @@ namespace WixToolset.Netfx
10
{
11
NetFxNativeImage,
12
NetFxNetCoreSearch,
13
- NetFxDotNetCompatibilityCheck
13
+ NetFxNetCoreSdkSearch,
14
+ NetFxDotNetCompatibilityCheck,
15
}
16
17
public static partial class NetfxSymbolDefinitions
@@ -36,7 +37,10 @@ namespace WixToolset.Netfx
37
38
case NetfxSymbolDefinitionType.NetFxNetCoreSearch:
39
return NetfxSymbolDefinitions.NetFxNetCoreSearch;
39
-
40
+
41
+ case NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch:
42
+ return NetfxSymbolDefinitions.NetFxNetCoreSdkSearch;
43
+
44
case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck:
45
return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck;
46
@@ -48,6 +52,7 @@ namespace WixToolset.Netfx
52
static NetfxSymbolDefinitions()
53
{
54
NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
55
+ NetFxNetCoreSdkSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag);
56
}
57
}
58
}
src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6.0.9_x86.wxs
+19
@@ -5,11 +5,15 @@
5
<?define NetCorePlatform = x86?>
6
<?define NetCoreIdVersion = 609?>
7
<?define NetCoreVersion = 6.0.9?>
8
+ <?define NetCoreSdkPlatform = x86?>
9
+ <?define NetCoreSdkIdVersion = 60403?>
10
+ <?define NetCoreSdkVersion = 6.0.403?>
11
<?include NetCore6_Platform.wxi?>
12
13
<?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/8f583028-b802-4661-b8dd-47139b0561ce/3c0cd3bdc6051759ccae40f78982c86e/aspnetcore-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?>
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?>
17
18
<Fragment>
19
<netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
59
</ExePackage>
60
</PackageGroup>
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) >= 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>
77
</Wix>
src/test/burn/TestData/TestBA/TestBAWixlib/NetCore6_Platform.wxi
+14
@@ -21,6 +21,12 @@
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?>
27
+ <?define DotNetCoreSdkRedistInstallArguments = /install /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
28
+ <?define DotNetCoreSdkRedistUninstallArguments = /uninstall /quiet /log "[$(var.DotNetCoreSdkRedistLog)]"?>
29
+
30
<?define NetCoreEulaLink = https://go.microsoft.com/fwlink/?LinkId=329770?>
31
32
<Fragment>
@@ -46,4 +52,12 @@
52
53
<bal:ManagedBootstrapperApplicationPrereqInformation PackageId="$(var.DotNetCoreRedistId)" LicenseUrl="$(var.NetCoreEulaLink)" />
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>
63
</Include>
src/test/burn/TestData/TestBA/TestBAWixlib_x64/NetCore6.0.9_x64.wxs
+19
@@ -5,11 +5,15 @@
5
<?define NetCorePlatform = x64?>
6
<?define NetCoreIdVersion = 609?>
7
<?define NetCoreVersion = 6.0.9?>
8
+ <?define NetCoreSdkPlatform = x64?>
9
+ <?define NetCoreSdkIdVersion = 60403?>
10
+ <?define NetCoreSdkVersion = 6.0.403?>
11
<?include ..\TestBAWixlib\NetCore6_Platform.wxi?>
12
13
<?define AspNetCoreRedistLink = https://download.visualstudio.microsoft.com/download/pr/98dbe241-8b77-4be0-b130-a5fb6af8d724/27b655adce6250da42be9440abe847a2/aspnetcore-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?>
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?>
17
18
<Fragment>
19
<netfx:DotNetCoreSearch Id="$(var.AspNetCoreId)" RuntimeType="aspnet" Platform="$(var.NetCorePlatform)" MajorVersion="6" Variable="$(var.AspNetCoreId)" />
@@ -55,4 +59,19 @@
59
</ExePackage>
60
</PackageGroup>
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) >= 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>
77
</Wix>