From 29a096b5a98144aa99a85183d74fe8680a404fe7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:46:21 -0500 Subject: [PATCH 01/27] Fix init race in mono_class_try_get_[shortname]_class. (#112297) Backport of #112282 to release/8.0 We observed several crash reports in dotnet Android coming from google play store, like this one: https://github.com/dotnet/runtime/issues/109921#issuecomment-2640412870 and it happens at the following callstack: mono_class_setup_vtable_full at /__w/1/s/src/mono/mono/metadata/class-setup-vtable.c:900 init_io_stream_slots at /__w/1/s/src/mono/mono/metadata/icall.c:3378 ves_icall_System_IO_Stream_HasOverriddenBeginEndRead at /__w/1/s/src/mono/mono/metadata/icall.c:3437 (inlined by) ves_icall_System_IO_Stream_HasOverriddenBeginEndRead_raw at /__w/1/s/src/mono/mono/metadata/../metadata/icall-def.h:228 Looking a little deeper at that that code path expects call to mono_class_try_get_stream_class to succeed since it calls mono_class_setup_vtable on returned class pointer. There are other places where code expectes mono_class_try_get_[shortname]_class to always succeed or it will assert. Other locations handles the case where it returns NULL meaning that the class has been linked out. After looking into the macro implementation generating the mono_class_try_get_[shortname]_class functions it appears that it has a race where one thread could return NULL even if the class successfully gets loaded by another racing thread. Initially that might have been intentionally and callers would need to redo the call, but then there is no way for callers to distinct between hitting the race and class not available. Adding to the fact that code would also expect that some critical classes never fail loading, like what init_io_stream_slots does, this race ended up in race conditions. In the past, this particular race in init_io_stream_slots was hidden due to multiple calls to mono_class_try_get_stream_class minimzing the risk of a race to cause a crash. That implementation was however changed by https://github.com/dotnet/runtime/commit/e74da7c72c81787f8339df93cb6f13ac40b1e39d ending up in just one call to mono_class_try_get_stream_class in the critical paths. Since code relies on mono_class_try_get_[shortname]_class to succeed for some critical classes, code asserts if it returns NULL or crashes. The fix will use acquire/release semantics on the static variable guarding the cached type and make sure memory order is preserved on both read and write. Previous implementation adopted a similar approach but it took a copy of the static tmp_class into a local variable meaning that memory order would not be guaranteed, even if it applied memory barriers and volatile keywords on the static variables. Fix also adds an assert into init_io_stream_slots since it expects failures in calls to mono_class_try_get_stream_class as fatal. Co-authored-by: lateralusX --- src/mono/mono/metadata/class-internals.h | 23 +++++++++-------------- src/mono/mono/metadata/icall.c | 2 ++ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/mono/mono/metadata/class-internals.h b/src/mono/mono/metadata/class-internals.h index 4641ecec43799e..75cad112b38261 100644 --- a/src/mono/mono/metadata/class-internals.h +++ b/src/mono/mono/metadata/class-internals.h @@ -957,25 +957,20 @@ mono_class_get_##shortname##_class (void) \ // GENERATE_TRY_GET_CLASS_WITH_CACHE attempts mono_class_load_from_name approximately // only once. i.e. if it fails, it will return null and not retry. -// In a race it might try a few times, but not indefinitely. -// -// FIXME This maybe has excessive volatile/barriers. -// #define GENERATE_TRY_GET_CLASS_WITH_CACHE(shortname,name_space,name) \ MonoClass* \ mono_class_try_get_##shortname##_class (void) \ { \ - static volatile MonoClass *tmp_class; \ - static volatile gboolean inited; \ - MonoClass *klass = (MonoClass *)tmp_class; \ - mono_memory_barrier (); \ - if (!inited) { \ - klass = mono_class_try_load_from_name (mono_class_generate_get_corlib_impl (), name_space, name); \ - tmp_class = klass; \ - mono_memory_barrier (); \ - inited = TRUE; \ + static MonoClass *cached_class; \ + static gboolean cached_class_inited; \ + gboolean tmp_inited; \ + mono_atomic_load_acquire(tmp_inited, gboolean, &cached_class_inited); \ + if (G_LIKELY(tmp_inited)) { \ + return (MonoClass*)cached_class; \ } \ - return klass; \ + cached_class = mono_class_try_load_from_name (mono_class_generate_get_corlib_impl (), name_space, name); \ + mono_atomic_store_release(&cached_class_inited, TRUE); \ + return (MonoClass*)cached_class; \ } GENERATE_TRY_GET_CLASS_WITH_CACHE_DECL (safehandle) diff --git a/src/mono/mono/metadata/icall.c b/src/mono/mono/metadata/icall.c index 2f612be9859985..947ab70f31089b 100644 --- a/src/mono/mono/metadata/icall.c +++ b/src/mono/mono/metadata/icall.c @@ -3375,6 +3375,8 @@ static void init_io_stream_slots (void) { MonoClass* klass = mono_class_try_get_stream_class (); + g_assert(klass); + mono_class_setup_vtable (klass); MonoMethod **klass_methods = m_class_get_methods (klass); if (!klass_methods) { From bf8ffdfff7c2b570e7645a95bcf0d41e777f8025 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 11:58:38 -0500 Subject: [PATCH 02/27] Internal monitor impl not using coop mutex causing deadlocks on Android. (#112374) Backport of #112358 to release/8.0 On Android we have seen ANR issues, like the one described in https://github.com/dotnet/runtime/issues/111485. After investigating several different dumps including all threads it turns out that we could end up in a deadlock when init a monitor since that code path didn't use a coop mutex and owner of lock could end up in GC code while holding that lock, leading to deadlock if another thread was about to lock the same monitor init lock. In several dumps we see the following two threads: Thread 1: syscall+28 __futex_wait_ex(void volatile*, bool, int, bool, timespec const*)+14 NonPI::MutexLockWithTimeout(pthread_mutex_internal_t*, bool, timespec const*)+384 sgen_gc_lock+105 mono_gc_wait_for_bridge_processing_internal+70 sgen_gchandle_get_target+288 alloc_mon+358 ves_icall_System_Threading_Monitor_Monitor_wait+452 ves_icall_System_Threading_Monitor_Monitor_wait_raw+583 Thread 2: syscall+28 __futex_wait_ex(void volatile*, bool, int, bool, timespec const*)+144 NonPI::MutexLockWithTimeout(pthread_mutex_internal_t*, bool, timespec const*)+652 alloc_mon+105 ves_icall_System_Threading_Monitor_Monitor_wait+452 ves_icall_System_Threading_Monitor_Monitor_wait_raw+583 So in this scenario Thread 1 holds monitor_mutex that is not a coop mutex and end up trying to take GC lock, since it calls, mono_gc_wait_for_bridge_processing_internal, but since a GC is already started (waiting on STW to complete), Thread 1 will block holding monitor_mutex. Thread 2 will try to lock monitor_mutex as well, and since its not a coop mutex it will block on OS __futex_wait_ex without changing Mono thread state to blocking, preventing the STW from processing. Fix is to switch to coop aware implementation of monitor_mutex. Normally this should have been resolved on Android since we run hybrid suspend meaning we should be able to run a signal handler on the blocking thread that would suspend it meaning that STW would continue, but for some reason the signal can't have been executed in this case putting the app under coop suspend limitations. This fix will take care of the deadlock, but if there are issues running Signals on Android, then threads not attached to runtime using coop attach methods could end up in similar situations blocking STW. Co-authored-by: lateralusX --- src/mono/mono/metadata/monitor.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/mono/mono/metadata/monitor.c b/src/mono/mono/metadata/monitor.c index 1e861f8dec1b8e..14e3d31127b269 100644 --- a/src/mono/mono/metadata/monitor.c +++ b/src/mono/mono/metadata/monitor.c @@ -82,9 +82,9 @@ struct _MonitorArray { MonoThreadsSync monitors [MONO_ZERO_LEN_ARRAY]; }; -#define mono_monitor_allocator_lock() mono_os_mutex_lock (&monitor_mutex) -#define mono_monitor_allocator_unlock() mono_os_mutex_unlock (&monitor_mutex) -static mono_mutex_t monitor_mutex; +#define mono_monitor_allocator_lock() mono_coop_mutex_lock (&monitor_mutex) +#define mono_monitor_allocator_unlock() mono_coop_mutex_unlock (&monitor_mutex) +static MonoCoopMutex monitor_mutex; static MonoThreadsSync *monitor_freelist; static MonitorArray *monitor_allocated; static int array_size = 16; @@ -255,7 +255,7 @@ lock_word_new_flat (gint32 owner) void mono_monitor_init (void) { - mono_os_mutex_init_recursive (&monitor_mutex); + mono_coop_mutex_init_recursive (&monitor_mutex); } static int From 6f7daef57efe6d6aac88a11c500fa9c6c8621ab0 Mon Sep 17 00:00:00 2001 From: Radek Zikmund <32671551+rzikm@users.noreply.github.com> Date: Thu, 13 Feb 2025 10:26:48 +0100 Subject: [PATCH 03/27] Skip NegotiateStream_StreamToStream_Authentication_EmptyCredentials_Fails on WinSrv 2025 (#112472) --- .../TestUtilities/System/PlatformDetection.Windows.cs | 1 + .../FunctionalTests/NegotiateStreamStreamToStreamTest.cs | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libraries/Common/tests/TestUtilities/System/PlatformDetection.Windows.cs b/src/libraries/Common/tests/TestUtilities/System/PlatformDetection.Windows.cs index 6a166b298cd517..1cd57d147a77ed 100644 --- a/src/libraries/Common/tests/TestUtilities/System/PlatformDetection.Windows.cs +++ b/src/libraries/Common/tests/TestUtilities/System/PlatformDetection.Windows.cs @@ -26,6 +26,7 @@ public static partial class PlatformDetection public static bool IsWindows10OrLater => IsWindowsVersionOrLater(10, 0); public static bool IsWindowsServer2019 => IsWindows && IsNotWindowsNanoServer && GetWindowsVersion() == 10 && GetWindowsMinorVersion() == 0 && GetWindowsBuildVersion() == 17763; public static bool IsWindowsServer2022 => IsWindows && IsNotWindowsNanoServer && GetWindowsVersion() == 10 && GetWindowsMinorVersion() == 0 && GetWindowsBuildVersion() == 20348; + public static bool IsWindowsServer2025 => IsWindows && IsNotWindowsNanoServer && GetWindowsVersion() == 10 && GetWindowsMinorVersion() == 0 && GetWindowsBuildVersion() == 26100; public static bool IsWindowsNanoServer => IsWindows && (IsNotWindowsIoTCore && GetWindowsInstallationType().Equals("Nano Server", StringComparison.OrdinalIgnoreCase)); public static bool IsWindowsServerCore => IsWindows && GetWindowsInstallationType().Equals("Server Core", StringComparison.OrdinalIgnoreCase); public static int WindowsVersion => IsWindows ? (int)GetWindowsVersion() : -1; diff --git a/src/libraries/System.Net.Security/tests/FunctionalTests/NegotiateStreamStreamToStreamTest.cs b/src/libraries/System.Net.Security/tests/FunctionalTests/NegotiateStreamStreamToStreamTest.cs index 7b8cc18c40f3b7..662f7d1fa48e93 100644 --- a/src/libraries/System.Net.Security/tests/FunctionalTests/NegotiateStreamStreamToStreamTest.cs +++ b/src/libraries/System.Net.Security/tests/FunctionalTests/NegotiateStreamStreamToStreamTest.cs @@ -9,8 +9,9 @@ using System.Text; using System.Threading; using System.Threading.Tasks; - +using Microsoft.DotNet.XUnitExtensions; using Xunit; +using Xunit.Abstractions; namespace System.Net.Security.Tests { @@ -192,6 +193,11 @@ public async Task NegotiateStream_StreamToStream_Authentication_EmptyCredentials { string targetName = "testTargetName"; + if (PlatformDetection.IsWindowsServer2025) + { + throw new SkipTestException("Empty credentials not supported on Server 2025"); + } + // Ensure there is no confusion between DefaultCredentials / DefaultNetworkCredentials and a // NetworkCredential object with empty user, password and domain. NetworkCredential emptyNetworkCredential = new NetworkCredential("", "", ""); From 52ce550559181c30f34dca36938e51f1e95a8c2c Mon Sep 17 00:00:00 2001 From: Eric StJohn Date: Wed, 19 Feb 2025 11:19:59 -0800 Subject: [PATCH 04/27] Move generation of SuggestedBindingRedirects.targets to inner build (#112379) (#112494) * Move generation of SuggestedBindingRedirects.targets to inner build These targets depend on the AssemblyVersion of the library which is specific to the inner-build of the library. Generate them in the inner-build. * Update src/libraries/System.Resources.Extensions/src/System.Resources.Extensions.csproj --- .../src/System.Resources.Extensions.csproj | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Resources.Extensions/src/System.Resources.Extensions.csproj b/src/libraries/System.Resources.Extensions/src/System.Resources.Extensions.csproj index 02d2e48dd5b55c..56cc33a539d702 100644 --- a/src/libraries/System.Resources.Extensions/src/System.Resources.Extensions.csproj +++ b/src/libraries/System.Resources.Extensions/src/System.Resources.Extensions.csproj @@ -7,7 +7,6 @@ true true $(BaseIntermediateOutputPath)SuggestedBindingRedirects.targets - $(BeforePack);GeneratePackageTargetsFile Provides classes which read and write resources in a format that supports non-primitive objects. Commonly Used Types: @@ -41,7 +40,7 @@ System.Resources.Extensions.PreserializedResourceWriter - @@ -51,10 +50,11 @@ System.Resources.Extensions.PreserializedResourceWriter - + AfterTargets="CoreCompile" + Condition="'$(TargetFramework)' == '$(NetFrameworkMinimum)'"> + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.get_TrustedCertificatesDirectory + lib/net6.0/System.DirectoryServices.Protocols.dll + lib/net6.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.set_TrustedCertificatesDirectory(System.String) + lib/net6.0/System.DirectoryServices.Protocols.dll + lib/net6.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.StartNewTlsSessionContext + lib/net6.0/System.DirectoryServices.Protocols.dll + lib/net6.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.get_TrustedCertificatesDirectory + lib/net7.0/System.DirectoryServices.Protocols.dll + lib/net7.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.set_TrustedCertificatesDirectory(System.String) + lib/net7.0/System.DirectoryServices.Protocols.dll + lib/net7.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.StartNewTlsSessionContext + lib/net7.0/System.DirectoryServices.Protocols.dll + lib/net7.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.get_TrustedCertificatesDirectory + lib/net8.0/System.DirectoryServices.Protocols.dll + lib/net8.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.set_TrustedCertificatesDirectory(System.String) + lib/net8.0/System.DirectoryServices.Protocols.dll + lib/net8.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.StartNewTlsSessionContext + lib/net8.0/System.DirectoryServices.Protocols.dll + lib/net8.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.get_TrustedCertificatesDirectory + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.set_TrustedCertificatesDirectory(System.String) + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + true + + + CP0002 + M:System.DirectoryServices.Protocols.LdapSessionOptions.StartNewTlsSessionContext + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + lib/netstandard2.0/System.DirectoryServices.Protocols.dll + true + + \ No newline at end of file diff --git a/src/libraries/System.DirectoryServices.Protocols/src/Resources/Strings.resx b/src/libraries/System.DirectoryServices.Protocols/src/Resources/Strings.resx index b63f103619fbdb..1f6c9734a7384c 100644 --- a/src/libraries/System.DirectoryServices.Protocols/src/Resources/Strings.resx +++ b/src/libraries/System.DirectoryServices.Protocols/src/Resources/Strings.resx @@ -426,4 +426,7 @@ Only ReferralChasingOptions.None and ReferralChasingOptions.All are supported on Linux. + + The directory '{0}' does not exist. + \ No newline at end of file diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj index cfcab2e34245e8..dff002915f8770 100644 --- a/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj +++ b/src/libraries/System.DirectoryServices.Protocols/src/System.DirectoryServices.Protocols.csproj @@ -4,6 +4,8 @@ true true true + true + 1 true true Provides the methods defined in the Lightweight Directory Access Protocol (LDAP) version 3 (V3) and Directory Services Markup Language (DSML) version 2.0 (V2) standards. diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Linux.cs b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Linux.cs index e1cfffebb531fc..5059c40499d5c6 100644 --- a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Linux.cs +++ b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Linux.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; +using System.IO; +using System.Runtime.Versioning; namespace System.DirectoryServices.Protocols { @@ -11,6 +13,34 @@ public partial class LdapSessionOptions private bool _secureSocketLayer; + /// + /// Specifies the path of the directory containing CA certificates in the PEM format. + /// Multiple directories may be specified by separating with a semi-colon. + /// + /// + /// The certificate files are looked up by the CA subject name hash value where that hash can be + /// obtained by using, for example, openssl x509 -hash -noout -in CA.crt. + /// It is a common practice to have the certificate file be a symbolic link to the actual certificate file + /// which can be done by using openssl rehash . or c_rehash . in the directory + /// containing the certificate files. + /// + /// The directory not exist. + [UnsupportedOSPlatform("windows")] + public string TrustedCertificatesDirectory + { + get => GetStringValueHelper(LdapOption.LDAP_OPT_X_TLS_CACERTDIR, releasePtr: true); + + set + { + if (!Directory.Exists(value)) + { + throw new DirectoryNotFoundException(SR.Format(SR.DirectoryNotFound, value)); + } + + SetStringOptionHelper(LdapOption.LDAP_OPT_X_TLS_CACERTDIR, value); + } + } + public bool SecureSocketLayer { get @@ -52,6 +82,16 @@ public ReferralChasingOptions ReferralChasing } } + /// + /// Create a new TLS library context. + /// Calling this is necessary after setting TLS-based options, such as TrustedCertificatesDirectory. + /// + [UnsupportedOSPlatform("windows")] + public void StartNewTlsSessionContext() + { + SetIntValueHelper(LdapOption.LDAP_OPT_X_TLS_NEWCTX, 0); + } + private bool GetBoolValueHelper(LdapOption option) { if (_connection._disposed) throw new ObjectDisposedException(GetType().Name); @@ -71,5 +111,14 @@ private void SetBoolValueHelper(LdapOption option, bool value) ErrorChecking.CheckAndSetLdapError(error); } + + private void SetStringOptionHelper(LdapOption option, string value) + { + if (_connection._disposed) throw new ObjectDisposedException(GetType().Name); + + int error = LdapPal.SetStringOption(_connection._ldapHandle, option, value); + + ErrorChecking.CheckAndSetLdapError(error); + } } } diff --git a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Windows.cs b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Windows.cs index 813005c5ecb72b..cc73449104adf4 100644 --- a/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Windows.cs +++ b/src/libraries/System.DirectoryServices.Protocols/src/System/DirectoryServices/Protocols/ldap/LdapSessionOptions.Windows.cs @@ -10,6 +10,13 @@ public partial class LdapSessionOptions { private static void PALCertFreeCRLContext(IntPtr certPtr) => Interop.Ldap.CertFreeCRLContext(certPtr); + [UnsupportedOSPlatform("windows")] + public string TrustedCertificatesDirectory + { + get => throw new PlatformNotSupportedException(); + set => throw new PlatformNotSupportedException(); + } + public bool SecureSocketLayer { get @@ -24,6 +31,9 @@ public bool SecureSocketLayer } } + [UnsupportedOSPlatform("windows")] + public void StartNewTlsSessionContext() => throw new PlatformNotSupportedException(); + public int ProtocolVersion { get => GetIntValueHelper(LdapOption.LDAP_OPT_VERSION); diff --git a/src/libraries/System.DirectoryServices.Protocols/tests/DirectoryServicesProtocolsTests.cs b/src/libraries/System.DirectoryServices.Protocols/tests/DirectoryServicesProtocolsTests.cs index b31cf294f4d217..92a5c9558563bd 100644 --- a/src/libraries/System.DirectoryServices.Protocols/tests/DirectoryServicesProtocolsTests.cs +++ b/src/libraries/System.DirectoryServices.Protocols/tests/DirectoryServicesProtocolsTests.cs @@ -2,12 +2,10 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using System.Diagnostics; using System.DirectoryServices.Tests; using System.Globalization; +using System.IO; using System.Net; -using System.Text; -using System.Threading; using Xunit; namespace System.DirectoryServices.Protocols.Tests @@ -16,7 +14,7 @@ public partial class DirectoryServicesProtocolsTests { internal static bool IsLdapConfigurationExist => LdapConfiguration.Configuration != null; internal static bool IsActiveDirectoryServer => IsLdapConfigurationExist && LdapConfiguration.Configuration.IsActiveDirectoryServer; - + internal static bool UseTls => IsLdapConfigurationExist && LdapConfiguration.Configuration.UseTls; internal static bool IsServerSideSortSupported => IsLdapConfigurationExist && LdapConfiguration.Configuration.SupportsServerSideSort; [ConditionalFact(nameof(IsLdapConfigurationExist))] @@ -694,6 +692,64 @@ public void TestMultipleServerBind() connection.Timeout = new TimeSpan(0, 3, 0); } +#if NET + [ConditionalFact(nameof(UseTls))] + [PlatformSpecific(TestPlatforms.Linux)] + public void StartNewTlsSessionContext() + { + using (var connection = GetConnection(bind: false)) + { + // We use "." as the directory since it must be a valid directory for StartNewTlsSessionContext() + Bind() to be successful even + // though there are no client certificates in ".". + connection.SessionOptions.TrustedCertificatesDirectory = "."; + + // For a real-world scenario, we would call 'StartTransportLayerSecurity(null)' here which would do the TLS handshake including + // providing the client certificate to the server and validating the server certificate. However, this requires additional + // setup that we don't have including trusting the server certificate and by specifying "demand" in the setup of the server + // via 'LDAP_TLS_VERIFY_CLIENT=demand' to force the TLS handshake to occur. + + connection.SessionOptions.StartNewTlsSessionContext(); + connection.Bind(); + + SearchRequest searchRequest = new (LdapConfiguration.Configuration.SearchDn, "(objectClass=*)", SearchScope.Subtree); + _ = (SearchResponse)connection.SendRequest(searchRequest); + } + } + + [ConditionalFact(nameof(UseTls))] + [PlatformSpecific(TestPlatforms.Linux)] + public void StartNewTlsSessionContext_ThrowsLdapException() + { + using (var connection = GetConnection(bind: false)) + { + // Create a new session context without setting TrustedCertificatesDirectory. + connection.SessionOptions.StartNewTlsSessionContext(); + Assert.Throws(() => connection.Bind()); + } + } + + [ConditionalFact(nameof(IsLdapConfigurationExist))] + [PlatformSpecific(TestPlatforms.Linux)] + public void TrustedCertificatesDirectory_ThrowsDirectoryNotFoundException() + { + using (var connection = GetConnection(bind: false)) + { + Assert.Throws(() => connection.SessionOptions.TrustedCertificatesDirectory = "nonexistent"); + } + } + + [ConditionalFact(nameof(IsLdapConfigurationExist))] + [PlatformSpecific(TestPlatforms.Windows)] + public void StartNewTlsSessionContext_ThrowsPlatformNotSupportedException() + { + using (var connection = new LdapConnection("server")) + { + LdapSessionOptions options = connection.SessionOptions; + Assert.Throws(() => options.StartNewTlsSessionContext()); + } + } +#endif + private void DeleteAttribute(LdapConnection connection, string entryDn, string attributeName) { string dn = entryDn + "," + LdapConfiguration.Configuration.SearchDn; @@ -774,13 +830,18 @@ private SearchResultEntry SearchUser(LdapConnection connection, string rootDn, s return null; } - private LdapConnection GetConnection() + private LdapConnection GetConnection(bool bind = true) { LdapDirectoryIdentifier directoryIdentifier = string.IsNullOrEmpty(LdapConfiguration.Configuration.Port) ? new LdapDirectoryIdentifier(LdapConfiguration.Configuration.ServerName, true, false) : new LdapDirectoryIdentifier(LdapConfiguration.Configuration.ServerName, int.Parse(LdapConfiguration.Configuration.Port, NumberStyles.None, CultureInfo.InvariantCulture), - true, false); + fullyQualifiedDnsHostName: true, connectionless: false); + return GetConnection(directoryIdentifier, bind); + } + + private static LdapConnection GetConnection(LdapDirectoryIdentifier directoryIdentifier, bool bind = true) + { NetworkCredential credential = new NetworkCredential(LdapConfiguration.Configuration.UserName, LdapConfiguration.Configuration.Password); LdapConnection connection = new LdapConnection(directoryIdentifier, credential) @@ -792,7 +853,11 @@ private LdapConnection GetConnection() // to LDAP v2, which we do not support, and will return LDAP_PROTOCOL_ERROR connection.SessionOptions.ProtocolVersion = 3; connection.SessionOptions.SecureSocketLayer = LdapConfiguration.Configuration.UseTls; - connection.Bind(); + + if (bind) + { + connection.Bind(); + } connection.Timeout = new TimeSpan(0, 3, 0); return connection; diff --git a/src/libraries/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs b/src/libraries/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs index 5f6a737834ac23..39c708bd340b53 100644 --- a/src/libraries/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs +++ b/src/libraries/System.DirectoryServices.Protocols/tests/LdapSessionOptionsTests.cs @@ -756,5 +756,32 @@ public void StopTransportLayerSecurity_Disposed_ThrowsObjectDisposedException() Assert.Throws(() => connection.SessionOptions.StopTransportLayerSecurity()); } + +#if NET + [Fact] + [PlatformSpecific(TestPlatforms.Linux)] + public void CertificateDirectoryProperty() + { + using (var connection = new LdapConnection("server")) + { + LdapSessionOptions options = connection.SessionOptions; + Assert.Null(options.TrustedCertificatesDirectory); + + options.TrustedCertificatesDirectory = "."; + Assert.Equal(".", options.TrustedCertificatesDirectory); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Windows)] + public void CertificateDirectoryProperty_ThrowsPlatformNotSupportedException() + { + using (var connection = new LdapConnection("server")) + { + LdapSessionOptions options = connection.SessionOptions; + Assert.Throws(() => options.TrustedCertificatesDirectory = "CertificateDirectory"); + } + } +#endif } } From 316eab86303a8794ee1e6ab608b53103b0709266 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Mon, 3 Mar 2025 09:37:09 -0800 Subject: [PATCH 07/27] Make CPU utilization checks in the thread pool configurable (#112790) - On Windows, checking CPU utilization seems to involve a small amount of overhead, which can become noticeable or even significant in some scenarios. This change makes the intervals of time over which CPU utilization is computed configurable. Increasing the interval increases the period at which CPU utilization is updated. The same config var can also be used to disable CPU utilization checks and have features that use it behave as though CPU utilization is low. - CPU utilization is used by the starvation heuristic and hill climbing. When CPU utilization is very high, the starvation heuristic reduces the rate of thread injection in starved cases. When CPU utilization is high, hill climbing avoids settling on higher thread count control values. - CPU utilization is currently updated when the gate thread performs periodic activities, which happens typically every 500 ms when a worker thread is active. There is one gate thread per .NET process. - In scenarios where there are many .NET processes running, and where many of them frequently but lightly use the thread pool, overall CPU usage may be relatively low, but the overhead from CPU utilization checks can bubble up to a noticeable portion of overall CPU usage. In a scenario involving 100s of .NET processes, it was seen that CPU utilization checks amount to 0.5-1% of overall CPU usage on the machine, which was considered significant. --- .../PortableThreadPool.GateThread.cs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs index 5d1b79a3098e05..d59cde103713e5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/PortableThreadPool.GateThread.cs @@ -27,10 +27,26 @@ private static void GateThreadStart() bool debuggerBreakOnWorkStarvation = AppContextConfigHelper.GetBooleanConfig("System.Threading.ThreadPool.DebugBreakOnWorkerStarvation", false); + // CPU utilization is updated when the gate thread performs periodic activities (GateActivitiesPeriodMs), so + // that would also affect the actual interval. Set to 0 to disable using CPU utilization and have components + // behave as though CPU utilization is low. The default value of 1 causes CPU utilization to be updated whenever + // the gate thread performs periodic activities. + int cpuUtilizationIntervalMs = + AppContextConfigHelper.GetInt32Config( + "System.Threading.ThreadPool.CpuUtilizationIntervalMs", + "DOTNET_ThreadPool_CpuUtilizationIntervalMs", + defaultValue: 1, + allowNegative: false); + // The first reading is over a time range other than what we are focusing on, so we do not use the read other // than to send it to any runtime-specific implementation that may also use the CPU utilization. CpuUtilizationReader cpuUtilizationReader = default; - _ = cpuUtilizationReader.CurrentUtilization; + int lastCpuUtilizationRefreshTimeMs = 0; + if (cpuUtilizationIntervalMs > 0) + { + lastCpuUtilizationRefreshTimeMs = Environment.TickCount; + _ = cpuUtilizationReader.CurrentUtilization; + } PortableThreadPool threadPoolInstance = ThreadPoolInstance; LowLevelLock threadAdjustmentLock = threadPoolInstance._threadAdjustmentLock; @@ -102,8 +118,17 @@ private static void GateThreadStart() (uint)threadPoolInstance.GetAndResetHighWatermarkCountOfThreadsProcessingUserCallbacks()); } - int cpuUtilization = (int)cpuUtilizationReader.CurrentUtilization; - threadPoolInstance._cpuUtilization = cpuUtilization; + // Determine whether CPU utilization should be updated. CPU utilization is only used by the starvation + // heuristic and hill climbing, and neither of those are active when there is a pending blocking + // adjustment. + if (cpuUtilizationIntervalMs > 0 && + threadPoolInstance._pendingBlockingAdjustment == PendingBlockingAdjustment.None && + (uint)(currentTimeMs - lastCpuUtilizationRefreshTimeMs) >= (uint)cpuUtilizationIntervalMs) + { + lastCpuUtilizationRefreshTimeMs = currentTimeMs; + int cpuUtilization = (int)cpuUtilizationReader.CurrentUtilization; + threadPoolInstance._cpuUtilization = cpuUtilization; + } if (!disableStarvationDetection && threadPoolInstance._pendingBlockingAdjustment == PendingBlockingAdjustment.None && From bbfb162c7fbe44a3e363d768c02f0beea5eacaf6 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Wed, 5 Mar 2025 13:25:24 -0500 Subject: [PATCH 08/27] Use invariant culture when formatting transfer capture in regex source generator (#113081) (#113151) A balancing group can result in TransferCapture being emitted with a negative "capnum". If the compiler is running under a culture that uses something other than '-' as the negative sign, the resulting generated code will fail to compile. --- .../gen/RegexGenerator.Emitter.cs | 2 +- .../RegexGeneratorHelper.netcoreapp.cs | 29 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs b/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs index efe4f0e40b4390..7e5bf4149c0bb4 100644 --- a/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs +++ b/src/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs @@ -2419,7 +2419,7 @@ void EmitCapture(RegexNode node, RegexNode? subsequent = null) } else { - writer.WriteLine($"base.TransferCapture({capnum}, {uncapnum}, {startingPos}, pos);"); + writer.WriteLine($"base.TransferCapture({capnum.ToString(CultureInfo.InvariantCulture)}, {uncapnum}, {startingPos}, pos);"); } if (isAtomic || !childBacktracks) diff --git a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexGeneratorHelper.netcoreapp.cs b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexGeneratorHelper.netcoreapp.cs index bf0d3316bd2b26..5538f111d9b931 100644 --- a/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexGeneratorHelper.netcoreapp.cs +++ b/src/libraries/System.Text.RegularExpressions/tests/FunctionalTests/RegexGeneratorHelper.netcoreapp.cs @@ -134,6 +134,12 @@ internal static async Task SourceGenRegexAsync( return results[0]; } + private static readonly CultureInfo s_cultureWithMinusNegativeSign = new CultureInfo("") + { + // To validate that generation still succeeds even when something other than '-' is used. + NumberFormat = new NumberFormatInfo() { NegativeSign = $"{(char)0x2212}" } + }; + internal static async Task SourceGenRegexAsync( (string pattern, CultureInfo? culture, RegexOptions? options, TimeSpan? matchTimeout)[] regexes, CancellationToken cancellationToken = default) { @@ -212,13 +218,24 @@ internal static async Task SourceGenRegexAsync( comp = comp.ReplaceSyntaxTree(comp.SyntaxTrees.First(), CSharpSyntaxTree.ParseText(SourceText.From(code.ToString(), Encoding.UTF8), s_previewParseOptions)); // Run the generator - GeneratorDriverRunResult generatorResults = s_generatorDriver.RunGenerators(comp!, cancellationToken).GetRunResult(); - ImmutableArray generatorDiagnostics = generatorResults.Diagnostics.RemoveAll(d => d.Severity <= DiagnosticSeverity.Hidden); - if (generatorDiagnostics.Length != 0) + CultureInfo origCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = s_cultureWithMinusNegativeSign; + GeneratorDriverRunResult generatorResults; + ImmutableArray generatorDiagnostics; + try { - throw new ArgumentException( - string.Join(Environment.NewLine, generatorResults.GeneratedTrees.Select(t => NumberLines(t.ToString()))) + Environment.NewLine + - string.Join(Environment.NewLine, generatorDiagnostics)); + generatorResults = s_generatorDriver.RunGenerators(comp!, cancellationToken).GetRunResult(); + generatorDiagnostics = generatorResults.Diagnostics.RemoveAll(d => d.Severity <= DiagnosticSeverity.Hidden); + if (generatorDiagnostics.Length != 0) + { + throw new ArgumentException( + string.Join(Environment.NewLine, generatorResults.GeneratedTrees.Select(t => NumberLines(t.ToString()))) + Environment.NewLine + + string.Join(Environment.NewLine, generatorDiagnostics)); + } + } + finally + { + CultureInfo.CurrentCulture = origCulture; } // Compile the assembly to a stream From 5748afbd6a99be702d2f7ffb6a71d7c49366f877 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:36:55 -0800 Subject: [PATCH 09/27] [release/8.0-staging] Include PDB for all TfmRuntimeSpecificPackageFile (#112140) * Include PDB for all TfmRuntimeSpecificPackageFile Previously this would only include the PDB for the primary output which missed any other additions to TfmRuntimeSpecificPackageFile - such as those from references or packages. * Update System.Diagnostics.EventLog.csproj --------- Co-authored-by: Eric StJohn --- eng/packaging.targets | 2 +- .../src/System.Diagnostics.EventLog.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/packaging.targets b/eng/packaging.targets index 2207a9d1f29a84..2c8d30b905fe53 100644 --- a/eng/packaging.targets +++ b/eng/packaging.targets @@ -148,7 +148,7 @@ - <_RuntimeSymbolPath Include="$(RuntimeSymbolPath)" /> + <_RuntimeSymbolPath Include="@(TfmRuntimeSpecificPackageFile->'%(RootDir)%(Directory)%(FileName).pdb')" Condition="'%(TfmRuntimeSpecificPackageFile.Extension)' == '.dll'" KeepMetadata="None" /> $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent);$(NetCoreAppPrevious)-windows;$(NetCoreAppPrevious);$(NetCoreAppMinimum)-windows;$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum) true true - false - 1 + true + 2 Provides the System.Diagnostics.EventLog class, which allows the applications to use the Windows event log service. Commonly Used Types: From 99a103f0589e2de099e0b8e0c6da52a71c94f4ef Mon Sep 17 00:00:00 2001 From: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com> Date: Fri, 7 Mar 2025 09:32:36 -0800 Subject: [PATCH 10/27] Update branding to 8.0.15 (#113225) --- eng/Versions.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 968e942fd774eb..7ea26f531ab69e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -1,11 +1,11 @@ - 8.0.14 + 8.0.15 8 0 - 14 + 15 8.0.100 7.0.20 6.0.36 From 0ffc9168c1f90be64f9d41f072306f5117167e28 Mon Sep 17 00:00:00 2001 From: Koundinya Veluri Date: Fri, 7 Mar 2025 11:13:30 -0800 Subject: [PATCH 11/27] [8.0] Make counting of IO completion work items more precise on Windows (#112795) * Stop counting work items from ThreadPoolTypedWorkItemQueue for ThreadPool.CompletedWorkItemCount (#106854) * Stop counting work items from ThreadPoolTypedWorkItemQueue as completed work items --------- Co-authored-by: Eduardo Manuel Velarde Polar Co-authored-by: Koundinya Veluri * Make counting of IO completion work items more precise on Windows - Follow-up to https://github.com/dotnet/runtime/pull/106854. Issue: https://github.com/dotnet/runtime/issues/104284. - Before the change, the modified test case often yields 5 or 6 completed work items, due to queue-processing work items that happen to not process any user work items. After the change, it always yields 4. - Looks like it doesn't hurt to have more-precise counting, and there was a request to backport a fix to .NET 8, where it's more necessary to fix the issue --------- Co-authored-by: Eduardo Velarde <32459232+eduardo-vp@users.noreply.github.com> Co-authored-by: Eduardo Manuel Velarde Polar --- .../Threading/ThreadInt64PersistentCounter.cs | 35 ++++++++++++++++-- .../System/Threading/ThreadPoolWorkQueue.cs | 9 ++++- .../System.Threading.ThreadPool.Tests.csproj | 1 + .../tests/ThreadPoolTests.cs | 36 +++++++++++++++++++ ....ThreadPool.WindowsThreadPool.Tests.csproj | 1 + 5 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadInt64PersistentCounter.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadInt64PersistentCounter.cs index 0f7fbc06a9a8eb..29cf2dce305657 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadInt64PersistentCounter.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadInt64PersistentCounter.cs @@ -15,6 +15,7 @@ internal sealed class ThreadInt64PersistentCounter private static List? t_nodeFinalizationHelpers; private long _overflowCount; + private long _lastReturnedCount; // dummy node serving as a start and end of the ring list private readonly ThreadLocalNode _nodes; @@ -31,6 +32,13 @@ public static void Increment(object threadLocalCountObject) Unsafe.As(threadLocalCountObject).Increment(); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Decrement(object threadLocalCountObject) + { + Debug.Assert(threadLocalCountObject is ThreadLocalNode); + Unsafe.As(threadLocalCountObject).Decrement(); + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Add(object threadLocalCountObject, uint count) { @@ -76,6 +84,17 @@ public long Count count += node.Count; node = node._next; } + + // Ensure that the returned value is monotonically increasing + long lastReturnedCount = _lastReturnedCount; + if (count > lastReturnedCount) + { + _lastReturnedCount = count; + } + else + { + count = lastReturnedCount; + } } finally { @@ -134,6 +153,18 @@ public void Increment() OnAddOverflow(1); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Decrement() + { + if (_count != 0) + { + _count--; + return; + } + + OnAddOverflow(-1); + } + public void Add(uint count) { Debug.Assert(count != 0); @@ -149,7 +180,7 @@ public void Add(uint count) } [MethodImpl(MethodImplOptions.NoInlining)] - private void OnAddOverflow(uint count) + private void OnAddOverflow(long count) { Debug.Assert(count != 0); @@ -161,7 +192,7 @@ private void OnAddOverflow(uint count) counter._lock.Acquire(); try { - counter._overflowCount += (long)_count + count; + counter._overflowCount += _count + count; _count = 0; } finally diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs index 696c2960b05b5b..ebd1e58bae4fe1 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/ThreadPoolWorkQueue.cs @@ -1204,6 +1204,9 @@ void IThreadPoolWorkItem.Execute() Interlocked.MemoryBarrier(); if (!_workItems.TryDequeue(out T workItem)) { + // Discount a work item here to avoid counting this queue processing work item + ThreadInt64PersistentCounter.Decrement( + ThreadPoolWorkQueueThreadLocals.threadLocals!.threadLocalCompletionCountObject!); return; } @@ -1247,7 +1250,11 @@ void IThreadPoolWorkItem.Execute() currentThread.ResetThreadPoolThread(); } - ThreadInt64PersistentCounter.Add(tl.threadLocalCompletionCountObject!, completedCount); + // Discount a work item here to avoid counting this queue processing work item + if (completedCount > 1) + { + ThreadInt64PersistentCounter.Add(tl.threadLocalCompletionCountObject!, completedCount - 1); + } } } diff --git a/src/libraries/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj b/src/libraries/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj index 0cb21c9d38492b..a50fbed0ffb702 100644 --- a/src/libraries/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj +++ b/src/libraries/System.Threading.ThreadPool/tests/System.Threading.ThreadPool.Tests.csproj @@ -2,6 +2,7 @@ true $(NetCoreAppCurrent) + true true diff --git a/src/libraries/System.Threading.ThreadPool/tests/ThreadPoolTests.cs b/src/libraries/System.Threading.ThreadPool/tests/ThreadPoolTests.cs index 59764268029fac..2d305482d9e114 100644 --- a/src/libraries/System.Threading.ThreadPool/tests/ThreadPoolTests.cs +++ b/src/libraries/System.Threading.ThreadPool/tests/ThreadPoolTests.cs @@ -1265,6 +1265,42 @@ public static void PrioritizationExperimentConfigVarTest() }).Dispose(); } + + [ConditionalFact(nameof(IsThreadingAndRemoteExecutorSupported))] + [PlatformSpecific(TestPlatforms.Windows)] + public static unsafe void ThreadPoolCompletedWorkItemCountTest() + { + // Run in a separate process to test in a clean thread pool environment such that we don't count external work items + RemoteExecutor.Invoke(() => + { + const int WorkItemCount = 4; + + int completedWorkItemCount = 0; + using var allWorkItemsCompleted = new AutoResetEvent(false); + + IOCompletionCallback callback = + (errorCode, numBytes, innerNativeOverlapped) => + { + Overlapped.Free(innerNativeOverlapped); + if (Interlocked.Increment(ref completedWorkItemCount) == WorkItemCount) + { + allWorkItemsCompleted.Set(); + } + }; + for (int i = 0; i < WorkItemCount; i++) + { + ThreadPool.UnsafeQueueNativeOverlapped(new Overlapped().Pack(callback, null)); + } + + allWorkItemsCompleted.CheckedWait(); + + // Allow work items to be marked as completed during this time + ThreadTestHelpers.WaitForCondition(() => ThreadPool.CompletedWorkItemCount >= WorkItemCount); + Thread.Sleep(50); + Assert.Equal(WorkItemCount, ThreadPool.CompletedWorkItemCount); + }).Dispose(); + } + public static bool IsThreadingAndRemoteExecutorSupported => PlatformDetection.IsThreadingSupported && RemoteExecutor.IsSupported; diff --git a/src/libraries/System.Threading.ThreadPool/tests/WindowsThreadPool/System.Threading.ThreadPool.WindowsThreadPool.Tests.csproj b/src/libraries/System.Threading.ThreadPool/tests/WindowsThreadPool/System.Threading.ThreadPool.WindowsThreadPool.Tests.csproj index f39bea77d0fbcd..b4925716d96e2c 100644 --- a/src/libraries/System.Threading.ThreadPool/tests/WindowsThreadPool/System.Threading.ThreadPool.WindowsThreadPool.Tests.csproj +++ b/src/libraries/System.Threading.ThreadPool/tests/WindowsThreadPool/System.Threading.ThreadPool.WindowsThreadPool.Tests.csproj @@ -3,6 +3,7 @@ true $(NetCoreAppCurrent)-windows + true true From 97b46846d3e29d47a06c246712edcaa4a087fcf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Sat, 8 Mar 2025 09:07:38 +0100 Subject: [PATCH 12/27] [release/8.0-staging] Remove --no-lock brew flag (#113282) Backport of https://github.com/dotnet/runtime/pull/113280 --- eng/install-native-dependencies.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/install-native-dependencies.sh b/eng/install-native-dependencies.sh index 60265718a35b93..e2d82ddc86ff7e 100755 --- a/eng/install-native-dependencies.sh +++ b/eng/install-native-dependencies.sh @@ -40,7 +40,7 @@ case "$os" in export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 # Skip brew update for now, see https://github.com/actions/setup-python/issues/577 # brew update --preinstall - brew bundle --no-upgrade --no-lock --file "$(dirname "$0")/Brewfile" + brew bundle --no-upgrade --file "$(dirname "$0")/Brewfile" ;; *) From 1f87c0ad024007ddcf6c5a95adbe15ab278b62c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marie=20P=C3=ADchov=C3=A1?= <11718369+ManickaP@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:01:59 +0100 Subject: [PATCH 13/27] Update MsQuic.dll version (#113206) --- eng/Versions.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/Versions.props b/eng/Versions.props index 968e942fd774eb..3f78d81b771b9f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -221,7 +221,7 @@ 8.0.0-rtm.23523.2 - 2.3.5 + 2.4.8 8.0.0-alpha.1.23527.1 16.0.5-alpha.1.24362.2 From 7ea3ab4c50a3752e680ebd5c621c060b01aa5a6d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 07:49:38 -0700 Subject: [PATCH 14/27] [release/8.0-staging] Change assembler to clang in android MonoAOT (#111666) * Change assembler to clang in android MonoAOT * Disabled NdkToolFinder task * Port changes to sample app * Allowed overwriting AsOptions * Since we bumped the NDK in https://github.com/dotnet/dotnet-buildtools-prereqs-docker/pull/1278, libClang.so is no longer found in the place we expect. As a result, the android aot offsets won't be generated and the dedicated CI leg will fail. This change fixes the path. * Backported parts of #96332 * Fix build with Android 26 NDK (which has some nullability annotations) (#97976) * Fix build with Android 26 NDK (which has some nullability annotations) * One more error in System.Security.Cryptography.Native.Android --------- Co-authored-by: Jeremi Kurdek Co-authored-by: Steve Pfister Co-authored-by: Filip Navara Co-authored-by: Jeremi Kurdek <59935235+jkurdek@users.noreply.github.com> Co-authored-by: Jeff Schwartz --- src/mono/mono.proj | 4 +- src/mono/mono/mini/aot-compiler.c | 36 ++++++++++++++--- .../android/build/AndroidBuild.targets | 39 +++++++++---------- .../sample/Android/AndroidSampleApp.csproj | 34 +++++++++------- .../System.Native/pal_interfaceaddresses.c | 23 +++++++---- .../pal_cipher.c | 2 +- src/tasks/AotCompilerTask/MonoAOTCompiler.cs | 32 ++++++++++++++- .../MobileBuildTasks/Android/Ndk/NdkTools.cs | 4 +- 8 files changed, 122 insertions(+), 52 deletions(-) diff --git a/src/mono/mono.proj b/src/mono/mono.proj index a643e5a049e79c..d0e704abbdf5a7 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -688,7 +688,9 @@ - <_LibClang Include="$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/lib64/libclang.so.*"/> + <_LibClang Include="$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/lib/libclang.so" Condition=" Exists('$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/lib/libclang.so') "/> + <_LibClang Include="$(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/$(MonoToolchainPrebuiltOS)/lib64/libclang.so.*" Condition=" '@(_LibClang)' == '' "/> + <_LibClang Include="/usr/local/lib/libclang.so" Condition="'@(_LibClang)' == ''" /> true diff --git a/src/mono/mono/mini/aot-compiler.c b/src/mono/mono/mini/aot-compiler.c index c342ef5d007571..9b4527cfb6f97b 100644 --- a/src/mono/mono/mini/aot-compiler.c +++ b/src/mono/mono/mini/aot-compiler.c @@ -240,8 +240,11 @@ typedef struct MonoAotOptions { gboolean allow_errors; char *tool_prefix; char *as_prefix; + char *as_name; + char *as_options; char *ld_flags; char *ld_name; + char *ld_options; char *mtriple; char *llvm_path; char *temp_path; @@ -8866,10 +8869,16 @@ mono_aot_parse_options (const char *aot_options, MonoAotOptions *opts) opts->tool_prefix = g_strdup (arg + strlen ("tool-prefix=")); } else if (str_begins_with (arg, "as-prefix=")) { opts->as_prefix = g_strdup (arg + strlen ("as-prefix=")); + } else if (str_begins_with (arg, "as-name=")) { + opts->as_name = g_strdup (arg + strlen ("as-name=")); + } else if (str_begins_with (arg, "as-options=")) { + opts->as_options = g_strdup (arg + strlen ("as-options=")); } else if (str_begins_with (arg, "ld-flags=")) { opts->ld_flags = g_strdup (arg + strlen ("ld-flags=")); } else if (str_begins_with (arg, "ld-name=")) { opts->ld_name = g_strdup (arg + strlen ("ld-name=")); + } else if (str_begins_with (arg, "ld-options=")) { + opts->ld_options = g_strdup (arg + strlen ("ld-options=")); } else if (str_begins_with (arg, "soft-debug")) { opts->soft_debug = TRUE; // Intentionally undocumented x2-- deprecated @@ -13275,7 +13284,16 @@ compile_asm (MonoAotCompile *acfg) g_string_append (acfg->as_args, "-c -x assembler "); #endif - command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", as_prefix, AS_NAME, AS_OPTIONS, + const char *as_binary_name = acfg->aot_opts.as_name; + if (as_binary_name == NULL) { + as_binary_name = AS_NAME; + } + const char *as_options = acfg->aot_opts.as_options; + if (as_options == NULL) { + as_options = AS_OPTIONS; + } + + command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", as_prefix, as_binary_name, as_options, acfg->as_args ? acfg->as_args->str : "", wrap_path (objfile), wrap_path (acfg->tmpfname)); aot_printf (acfg, "Executing the native assembler: %s\n", command); @@ -13286,7 +13304,7 @@ compile_asm (MonoAotCompile *acfg) } if (acfg->llvm && !acfg->llvm_owriter) { - command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", as_prefix, AS_NAME, AS_OPTIONS, + command = g_strdup_printf ("\"%s%s\" %s %s -o %s %s", as_prefix, as_binary_name, as_options, acfg->as_args ? acfg->as_args->str : "", wrap_path (acfg->llvm_ofile), wrap_path (acfg->llvm_sfile)); aot_printf (acfg, "Executing the native assembler: %s\n", command); @@ -13335,16 +13353,21 @@ compile_asm (MonoAotCompile *acfg) str = g_string_new (""); const char *ld_binary_name = acfg->aot_opts.ld_name; + + const char *ld_options = acfg->aot_opts.ld_options; + if (ld_options == NULL) { + ld_options = LD_OPTIONS; + } #if defined(LD_NAME) if (ld_binary_name == NULL) { ld_binary_name = LD_NAME; } if (acfg->aot_opts.tool_prefix) - g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, LD_OPTIONS); + g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, ld_options); else if (acfg->aot_opts.llvm_only) g_string_append_printf (str, "%s", acfg->aot_opts.clangxx); else - g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, LD_OPTIONS); + g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, ld_options); #else if (ld_binary_name == NULL) { ld_binary_name = "ld"; @@ -13353,7 +13376,7 @@ compile_asm (MonoAotCompile *acfg) // Default (linux) if (acfg->aot_opts.tool_prefix) /* Cross compiling */ - g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, LD_OPTIONS); + g_string_append_printf (str, "\"%s%s\" %s", tool_prefix, ld_binary_name, ld_options); else if (acfg->aot_opts.llvm_only) g_string_append_printf (str, "%s", acfg->aot_opts.clangxx); else @@ -14284,8 +14307,11 @@ aot_opts_free (MonoAotOptions *aot_opts) g_free (aot_opts->dedup_include); g_free (aot_opts->tool_prefix); g_free (aot_opts->as_prefix); + g_free (aot_opts->as_name); + g_free (aot_opts->as_options); g_free (aot_opts->ld_flags); g_free (aot_opts->ld_name); + g_free (aot_opts->ld_options); g_free (aot_opts->mtriple); g_free (aot_opts->llvm_path); g_free (aot_opts->temp_path); diff --git a/src/mono/msbuild/android/build/AndroidBuild.targets b/src/mono/msbuild/android/build/AndroidBuild.targets index 99a226aafc603a..f8cca5121ea20c 100644 --- a/src/mono/msbuild/android/build/AndroidBuild.targets +++ b/src/mono/msbuild/android/build/AndroidBuild.targets @@ -125,12 +125,21 @@ <_AotOutputType>ObjectFile - - - - - + + <_Triple Condition="'$(TargetArchitecture)' == 'arm'">armv7-linux-gnueabi + <_Triple Condition="'$(TargetArchitecture)' == 'arm64'">aarch64-linux-android + <_Triple Condition="'$(TargetArchitecture)' == 'x86'">i686-linux-android + <_Triple Condition="'$(TargetArchitecture)' == 'x64'">x86_64-linux-android + + + + <_AsOptions>-target $(_Triple) -c -x assembler + <_LdName>clang + <_LdOptions>-fuse-ld=lld + <_AsName>clang + + @@ -154,19 +163,6 @@ 21 - - - - - - - - - <_AsPrefixPath>$([MSBuild]::EnsureTrailingSlash('$(_AsPrefixPath)')) <_ToolPrefixPath>$([MSBuild]::EnsureTrailingSlash('$(_ToolPrefixPath)')) @@ -234,20 +230,23 @@ diff --git a/src/mono/sample/Android/AndroidSampleApp.csproj b/src/mono/sample/Android/AndroidSampleApp.csproj index c5316052559933..fd222fb3a4fb32 100644 --- a/src/mono/sample/Android/AndroidSampleApp.csproj +++ b/src/mono/sample/Android/AndroidSampleApp.csproj @@ -70,36 +70,40 @@ 21 - - - - - - - - - <_AsPrefixPath>$([MSBuild]::EnsureTrailingSlash('$(_AsPrefixPath)')) <_ToolPrefixPath>$([MSBuild]::EnsureTrailingSlash('$(_ToolPrefixPath)')) + + <_Triple Condition="'$(TargetArchitecture)' == 'arm'">armv7-linux-gnueabi + <_Triple Condition="'$(TargetArchitecture)' == 'arm64'">aarch64-linux-android + <_Triple Condition="'$(TargetArchitecture)' == 'x86'">i686-linux-android + <_Triple Condition="'$(TargetArchitecture)' == 'x64'">x86_64-linux-android + + + + <_AsOptions>-target $(_Triple) -c -x assembler + <_LdName>clang + <_LdOptions>-fuse-ld=lld + <_AsName>clang + + diff --git a/src/native/libs/System.Native/pal_interfaceaddresses.c b/src/native/libs/System.Native/pal_interfaceaddresses.c index 8fee3e0e3e9649..fe42cd91dac609 100644 --- a/src/native/libs/System.Native/pal_interfaceaddresses.c +++ b/src/native/libs/System.Native/pal_interfaceaddresses.c @@ -117,7 +117,7 @@ static inline uint8_t mask2prefix(uint8_t* mask, int length) static int (*getifaddrs)(struct ifaddrs**) = NULL; static void (*freeifaddrs)(struct ifaddrs*) = NULL; -static void try_loading_getifaddrs() +static void try_loading_getifaddrs(void) { if (android_get_device_api_level() >= 24) { @@ -139,7 +139,7 @@ static void try_loading_getifaddrs() } } -static bool ensure_getifaddrs_is_loaded() +static bool ensure_getifaddrs_is_loaded(void) { static pthread_once_t getifaddrs_is_loaded = PTHREAD_ONCE_INIT; pthread_once(&getifaddrs_is_loaded, try_loading_getifaddrs); @@ -169,11 +169,12 @@ int32_t SystemNative_EnumerateInterfaceAddresses(void* context, for (struct ifaddrs* current = headAddr; current != NULL; current = current->ifa_next) { - if (current->ifa_addr == NULL) + char *ifa_name = current->ifa_name; + if (current->ifa_addr == NULL || ifa_name == NULL) { continue; } - uint32_t interfaceIndex = if_nametoindex(current->ifa_name); + uint32_t interfaceIndex = if_nametoindex(ifa_name); // ifa_name may be an aliased interface name. // Use if_indextoname to map back to the true device name. char actualName[IF_NAMESIZE]; @@ -376,9 +377,17 @@ int32_t SystemNative_GetNetworkInterfaces(int32_t * interfaceCount, NetworkInter while (ifaddrsEntry != NULL) { + char *ifa_name = ifaddrsEntry->ifa_name; + + if (ifa_name == NULL) + { + ifaddrsEntry = ifaddrsEntry->ifa_next; + continue; + } + //current = NULL; nii = NULL; - uint ifindex = if_nametoindex(ifaddrsEntry->ifa_name); + uint ifindex = if_nametoindex(ifa_name); for (index = 0; index < (int)ifcount; index ++) { if (((NetworkInterfaceInfo*)memoryBlock)[index].InterfaceIndex == ifindex) @@ -393,8 +402,8 @@ int32_t SystemNative_GetNetworkInterfaces(int32_t * interfaceCount, NetworkInter // We git new interface. nii = &((NetworkInterfaceInfo*)memoryBlock)[ifcount++]; - memcpy(nii->Name, ifaddrsEntry->ifa_name, sizeof(nii->Name)); - nii->InterfaceIndex = if_nametoindex(ifaddrsEntry->ifa_name); + memcpy(nii->Name, ifa_name, sizeof(nii->Name)); + nii->InterfaceIndex = ifindex; nii->Speed = -1; nii->HardwareType = ((ifaddrsEntry->ifa_flags & IFF_LOOPBACK) == IFF_LOOPBACK) ? NetworkInterfaceType_Loopback : NetworkInterfaceType_Unknown; diff --git a/src/native/libs/System.Security.Cryptography.Native.Android/pal_cipher.c b/src/native/libs/System.Security.Cryptography.Native.Android/pal_cipher.c index b09932392eea08..d60dbdd02df060 100644 --- a/src/native/libs/System.Security.Cryptography.Native.Android/pal_cipher.c +++ b/src/native/libs/System.Security.Cryptography.Native.Android/pal_cipher.c @@ -20,7 +20,7 @@ typedef struct CipherInfo } CipherInfo; #define DEFINE_CIPHER(cipherId, width, javaName, flags) \ -CipherInfo* AndroidCryptoNative_ ## cipherId() \ +CipherInfo* AndroidCryptoNative_ ## cipherId(void) \ { \ static CipherInfo info = { flags, width, javaName }; \ return &info; \ diff --git a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs index 0a761b44a4c8f2..f4be178f274919 100644 --- a/src/tasks/AotCompilerTask/MonoAOTCompiler.cs +++ b/src/tasks/AotCompilerTask/MonoAOTCompiler.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -231,6 +231,16 @@ public class MonoAOTCompiler : Microsoft.Build.Utilities.Task /// public string? ToolPrefix { get; set; } + /// + /// Name of the assembler tool ran by the AOT compiler. + /// + public string? AsName { get; set; } + + /// + /// Passes as-options to the AOT compiler + /// + public string? AsOptions { get; set; } + /// /// Prepends a prefix to the name of the assembler (as) tool ran by the AOT compiler. /// @@ -278,6 +288,11 @@ public class MonoAOTCompiler : Microsoft.Build.Utilities.Task /// public string? LdFlags { get; set; } + /// + /// Passes ld-options to the AOT compiler + /// + public string? LdOptions { get; set; } + /// /// Specify WorkingDirectory for the AOT compiler /// @@ -728,6 +743,16 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st aotArgs.Add($"tool-prefix={ToolPrefix}"); } + if (!string.IsNullOrEmpty(AsName)) + { + aotArgs.Add($"as-name={AsName}"); + } + + if (!string.IsNullOrEmpty(AsOptions)) + { + aotArgs.Add($"as-options={AsOptions}"); + } + if (!string.IsNullOrEmpty(AsPrefix)) { aotArgs.Add($"as-prefix={AsPrefix}"); @@ -943,6 +968,11 @@ private PrecompileArguments GetPrecompileArgumentsFor(ITaskItem assemblyItem, st aotArgs.Add($"ld-flags={LdFlags}"); } + if (!string.IsNullOrEmpty(LdOptions)) + { + aotArgs.Add($"ld-options={LdOptions}"); + } + // we need to quote the entire --aot arguments here to make sure it is parsed // on Windows as one argument. Otherwise it will be split up into multiple // values, which wont work. diff --git a/src/tasks/MobileBuildTasks/Android/Ndk/NdkTools.cs b/src/tasks/MobileBuildTasks/Android/Ndk/NdkTools.cs index 6370c49df85405..0741e92dfe8116 100644 --- a/src/tasks/MobileBuildTasks/Android/Ndk/NdkTools.cs +++ b/src/tasks/MobileBuildTasks/Android/Ndk/NdkTools.cs @@ -101,9 +101,9 @@ public string ClangPath private void ValidateRequiredProps(string hostOS) { - if (Ndk.NdkVersion.Main.Major != 23) + if (Ndk.NdkVersion.Main.Major != 27) { - throw new Exception($"NDK 23 is required. An unsupported NDK version was found ({Ndk.NdkVersion.Main.Major})."); + throw new Exception($"NDK 27 is required. An unsupported NDK version was found ({Ndk.NdkVersion.Main.Major})."); } try From 2f9dcfdb2200567bb4ac1fdfec87a139b04e3da9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:21:56 +0100 Subject: [PATCH 15/27] [release/8.0-staging] [browser] Remove experimental args from NodeJS WBT runner (#113008) --- .../wasm/Wasm.Build.Tests/ConfigSrcTests.cs | 2 +- .../HostRunner/NodeJSHostRunner.cs | 4 +-- .../wasm/Wasm.Build.Tests/WasmSIMDTests.cs | 2 -- .../Wasm.Build.Tests/WasmTemplateTestBase.cs | 27 ------------------- 4 files changed, 3 insertions(+), 32 deletions(-) diff --git a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs index 329ecbe0b49ca7..6c525fa4eab22c 100644 --- a/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/ConfigSrcTests.cs @@ -16,7 +16,7 @@ public ConfigSrcTests(ITestOutputHelper output, SharedBuildPerTestClassFixture b // NOTE: port number determinizes dynamically, so could not generate absolute URI [Theory] - [BuildAndRun(host: RunHost.V8 | RunHost.NodeJS)] + [BuildAndRun(host: RunHost.V8)] public void ConfigSrcAbsolutePath(BuildArgs buildArgs, RunHost host, string id) { buildArgs = buildArgs with { ProjectName = $"configsrcabsolute_{buildArgs.Config}_{buildArgs.AOT}" }; diff --git a/src/mono/wasm/Wasm.Build.Tests/HostRunner/NodeJSHostRunner.cs b/src/mono/wasm/Wasm.Build.Tests/HostRunner/NodeJSHostRunner.cs index 3f1bc819ba2a6e..cf311557c27f2e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/HostRunner/NodeJSHostRunner.cs +++ b/src/mono/wasm/Wasm.Build.Tests/HostRunner/NodeJSHostRunner.cs @@ -8,8 +8,8 @@ namespace Wasm.Build.Tests; public class NodeJSHostRunner : IHostRunner { public string GetTestCommand() => "wasm test"; - public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => $"--js-file={options.jsRelativePath} --engine=NodeJS -v trace --engine-arg=--experimental-wasm-simd --engine-arg=--experimental-wasm-eh"; - public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => $"--js-file={options.jsRelativePath} --engine=NodeJS -v trace --locale={options.environmentLocale} --engine-arg=--experimental-wasm-simd --engine-arg=--experimental-wasm-eh"; + public string GetXharnessArgsWindowsOS(XHarnessArgsOptions options) => $"--js-file={options.jsRelativePath} --engine=NodeJS -v trace"; + public string GetXharnessArgsOtherOS(XHarnessArgsOptions options) => $"--js-file={options.jsRelativePath} --engine=NodeJS -v trace --locale={options.environmentLocale}"; public bool UseWasmConsoleOutput() => true; public bool CanRunWBT() => true; } diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs index 46fb36135d6f2a..08ac8512665b75 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmSIMDTests.cs @@ -41,7 +41,6 @@ public void Build_NoAOT_ShouldNotRelink(BuildArgs buildArgs, RunHost host, strin Assert.DoesNotContain("Compiling native assets with emcc", output); RunAndTestWasmApp(buildArgs, - extraXHarnessArgs: host == RunHost.NodeJS ? "--engine-arg=--experimental-wasm-simd --engine-arg=--experimental-wasm-eh" : "", expectedExitCode: 42, test: output => { @@ -66,7 +65,6 @@ public void PublishWithSIMD_AOT(BuildArgs buildArgs, RunHost host, string id) DotnetWasmFromRuntimePack: false)); RunAndTestWasmApp(buildArgs, - extraXHarnessArgs: host == RunHost.NodeJS ? "--engine-arg=--experimental-wasm-simd --engine-arg=--experimental-wasm-eh" : "", expectedExitCode: 42, test: output => { diff --git a/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs index 1cc70d823ef14e..ea2e49fd35c38e 100644 --- a/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/WasmTemplateTestBase.cs @@ -49,38 +49,11 @@ public string CreateWasmTemplateProject(string id, string template = "wasmbrowse if (runAnalyzers) extraProperties += "true"; - if (template == "wasmconsole") - { - UpdateRuntimeconfigTemplateForNode(_projectDir); - } - AddItemsPropertiesToProject(projectfile, extraProperties); return projectfile; } - private static void UpdateRuntimeconfigTemplateForNode(string projectDir) - { - // TODO: Can be removed once Node >= 20 - - string runtimeconfigTemplatePath = Path.Combine(projectDir, "runtimeconfig.template.json"); - string runtimeconfigTemplateContent = File.ReadAllText(runtimeconfigTemplatePath); - var runtimeconfigTemplate = JsonObject.Parse(runtimeconfigTemplateContent); - if (runtimeconfigTemplate == null) - throw new Exception($"Unable to parse runtimeconfigtemplate at '{runtimeconfigTemplatePath}'"); - - var perHostConfigs = runtimeconfigTemplate?["wasmHostProperties"]?["perHostConfig"]?.AsArray(); - if (perHostConfigs == null || perHostConfigs.Count == 0 || perHostConfigs[0] == null) - throw new Exception($"Unable to find perHostConfig in runtimeconfigtemplate at '{runtimeconfigTemplatePath}'"); - - perHostConfigs[0]!["host-args"] = new JsonArray( - "--experimental-wasm-simd", - "--experimental-wasm-eh" - ); - - File.WriteAllText(runtimeconfigTemplatePath, runtimeconfigTemplate!.ToString()); - } - public (string projectDir, string buildOutput) BuildTemplateProject(BuildArgs buildArgs, string id, BuildProjectOptions buildProjectOptions) From ff2e6afc4f4966042f699f4fcadc848fa9ecf96d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:50:06 -0700 Subject: [PATCH 16/27] Update branding to 8.0.15 (#113225) (#113263) Co-authored-by: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com> --- eng/Versions.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 3f78d81b771b9f..6b35d14142a0fd 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -1,11 +1,11 @@ - 8.0.14 + 8.0.15 8 0 - 14 + 15 8.0.100 7.0.20 6.0.36 From 15c59cb7754b8e3ffa64e3aa8196cf221abe716f Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:57:10 -0700 Subject: [PATCH 17/27] Update dependencies from https://github.com/dotnet/xharness build 20250203.2 (#112503) Microsoft.DotNet.XHarness.CLI , Microsoft.DotNet.XHarness.TestRunners.Common , Microsoft.DotNet.XHarness.TestRunners.Xunit From Version 8.0.0-prerelease.25064.4 -> To Version 8.0.0-prerelease.25103.2 Co-authored-by: dotnet-maestro[bot] --- .config/dotnet-tools.json | 2 +- NuGet.config | 8 -------- eng/Version.Details.xml | 12 ++++++------ eng/Versions.props | 6 +++--- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index f9290ddaeb0ed8..0496625f2aec1d 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -15,7 +15,7 @@ ] }, "microsoft.dotnet.xharness.cli": { - "version": "8.0.0-prerelease.25064.4", + "version": "8.0.0-prerelease.25103.2", "commands": [ "xharness" ] diff --git a/NuGet.config b/NuGet.config index d77971e4e05b10..c2b8657f147c48 100644 --- a/NuGet.config +++ b/NuGet.config @@ -10,14 +10,6 @@ - - - - - - - - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a18cf63ebb8954..c703db7172043b 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -322,17 +322,17 @@ https://github.com/dotnet/runtime edbd5c769a19798b6955050baccf99e6797d3208 - + https://github.com/dotnet/xharness - 3ba447103e5b0a23bbe544d6c3701f0fc64d2cfe + d33548342ade8e537d891c8f0f593aa206418625 - + https://github.com/dotnet/xharness - 3ba447103e5b0a23bbe544d6c3701f0fc64d2cfe + d33548342ade8e537d891c8f0f593aa206418625 - + https://github.com/dotnet/xharness - 3ba447103e5b0a23bbe544d6c3701f0fc64d2cfe + d33548342ade8e537d891c8f0f593aa206418625 https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 6b35d14142a0fd..83523c5af18b0a 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -185,9 +185,9 @@ 1.1.0 17.4.0-preview-20220707-01 - 8.0.0-prerelease.25064.4 - 8.0.0-prerelease.25064.4 - 8.0.0-prerelease.25064.4 + 8.0.0-prerelease.25103.2 + 8.0.0-prerelease.25103.2 + 8.0.0-prerelease.25103.2 8.0.0-alpha.0.25077.2 2.4.2 1.0.0 From 10e2d9789030a7516c8be3b776cf871237fc7165 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:59:08 -0700 Subject: [PATCH 18/27] Update dependencies from https://github.com/dotnet/runtime-assets build 20250213.1 (#112551) Microsoft.DotNet.CilStrip.Sources , System.ComponentModel.TypeConverter.TestData , System.Data.Common.TestData , System.Drawing.Common.TestData , System.Formats.Tar.TestData , System.IO.Compression.TestData , System.IO.Packaging.TestData , System.Net.TestData , System.Private.Runtime.UnicodeData , System.Runtime.Numerics.TestData , System.Runtime.TimeZoneData , System.Security.Cryptography.X509Certificates.TestData , System.Text.RegularExpressions.TestData , System.Windows.Extensions.TestData From Version 8.0.0-beta.25071.1 -> To Version 8.0.0-beta.25113.1 Co-authored-by: dotnet-maestro[bot] --- eng/Version.Details.xml | 56 ++++++++++++++++++++--------------------- eng/Versions.props | 28 ++++++++++----------- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index c703db7172043b..217e672568ff40 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -185,57 +185,57 @@ https://github.com/dotnet/arcade c255aae7f2b128fa20a4441f0e192c3c53561621 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 https://github.com/dotnet/llvm-project @@ -358,9 +358,9 @@ https://github.com/dotnet/hotreload-utils feeef0335323285595eff5fdb6fcb9f3f724a37d - + https://github.com/dotnet/runtime-assets - 6db56a1a9a15801f7095ed88bb0c44def23c8ccd + 88293463a34f5451d8a01b77b292b059bcacc3e4 https://github.com/dotnet/roslyn diff --git a/eng/Versions.props b/eng/Versions.props index 83523c5af18b0a..bc974eb7e0bba8 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -145,20 +145,20 @@ 4.5.0 8.0.0-rc.1.23406.6 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 - 8.0.0-beta.25071.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 + 8.0.0-beta.25113.1 1.0.0-prerelease.23566.3 1.0.0-prerelease.23566.3 From 36d276b7e6cdfef222ee44bb336b9f339c1809df Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:59:51 -0700 Subject: [PATCH 19/27] [release/8.0] Update dependencies from dotnet/emsdk (#112516) * Update dependencies from https://github.com/dotnet/emsdk build 20250212.2 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.14-servicing.25112.2 * Update dependencies from https://github.com/dotnet/emsdk build 20250213.1 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.14-servicing.25113.1 * Update dependencies from https://github.com/dotnet/emsdk build 20250214.1 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.14-servicing.25114.1 * Update dependencies from https://github.com/dotnet/emsdk build 20250217.2 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.14-servicing.25117.2 * Update dependencies from https://github.com/dotnet/emsdk build 20250218.2 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.14-servicing.25118.2 * Update dependencies from https://github.com/dotnet/emsdk build 20250307.1 Microsoft.SourceBuild.Intermediate.emsdk , Microsoft.NET.Workload.Emscripten.Current.Manifest-8.0.100 From Version 8.0.14-servicing.25105.1 -> To Version 8.0.15-servicing.25157.1 --------- Co-authored-by: dotnet-maestro[bot] --- NuGet.config | 10 +--------- eng/Version.Details.xml | 8 ++++---- eng/Versions.props | 2 +- 3 files changed, 6 insertions(+), 14 deletions(-) diff --git a/NuGet.config b/NuGet.config index d77971e4e05b10..3795f6e59e8c2b 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,15 +9,7 @@ - - - - - - - - - + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index a18cf63ebb8954..8700607995a761 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -90,13 +90,13 @@ 45dd3a73dd5b64b010c4251303b3664bb30df029 - + https://github.com/dotnet/emsdk - ec84e775d21d3b7a6698ec30f7b2a5a9e3acd314 + 6afd7b9f34943078f2e3b747f33350e5fe114269 - + https://github.com/dotnet/emsdk - ec84e775d21d3b7a6698ec30f7b2a5a9e3acd314 + 6afd7b9f34943078f2e3b747f33350e5fe114269 diff --git a/eng/Versions.props b/eng/Versions.props index 7ea26f531ab69e..30c882f5cdc240 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -242,7 +242,7 @@ Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport --> - 8.0.14 + 8.0.15 $(MicrosoftNETWorkloadEmscriptenCurrentManifest80100Version) 1.1.87-gba258badda From 6c4a5f0400689917993e03f872bf32a2df4af196 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:01:17 -0700 Subject: [PATCH 20/27] [release/8.0-staging] Update dependencies from dotnet/arcade (#112504) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update dependencies from https://github.com/dotnet/arcade build 20250211.4 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Build.Tasks.Archives , Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Build.Tasks.Installers , Microsoft.DotNet.Build.Tasks.Packaging , Microsoft.DotNet.Build.Tasks.TargetFramework , Microsoft.DotNet.Build.Tasks.Templating , Microsoft.DotNet.Build.Tasks.Workloads , Microsoft.DotNet.CodeAnalysis , Microsoft.DotNet.GenAPI , Microsoft.DotNet.GenFacades , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.PackageTesting , Microsoft.DotNet.RemoteExecutor , Microsoft.DotNet.SharedFramework.Sdk , Microsoft.DotNet.VersionTools.Tasks , Microsoft.DotNet.XUnitConsoleRunner , Microsoft.DotNet.XUnitExtensions From Version 8.0.0-beta.25060.1 -> To Version 8.0.0-beta.25111.4 * Update dependencies from https://github.com/dotnet/arcade build 20250214.5 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Build.Tasks.Archives , Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Build.Tasks.Installers , Microsoft.DotNet.Build.Tasks.Packaging , Microsoft.DotNet.Build.Tasks.TargetFramework , Microsoft.DotNet.Build.Tasks.Templating , Microsoft.DotNet.Build.Tasks.Workloads , Microsoft.DotNet.CodeAnalysis , Microsoft.DotNet.GenAPI , Microsoft.DotNet.GenFacades , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.PackageTesting , Microsoft.DotNet.RemoteExecutor , Microsoft.DotNet.SharedFramework.Sdk , Microsoft.DotNet.VersionTools.Tasks , Microsoft.DotNet.XUnitConsoleRunner , Microsoft.DotNet.XUnitExtensions From Version 8.0.0-beta.25060.1 -> To Version 8.0.0-beta.25114.5 * Bump SdkVersionForWorkloadTesting to 8.0.113 --------- Co-authored-by: dotnet-maestro[bot] Co-authored-by: Alexander Köplinger Co-authored-by: Larry Ewing Co-authored-by: Carlos Sánchez López <1175054+carlossanlop@users.noreply.github.com> --- eng/Version.Details.xml | 72 +++++++++---------- eng/Versions.props | 32 ++++----- eng/common/sdk-task.ps1 | 2 +- .../steps/send-to-helix.yml | 7 +- eng/common/templates/steps/send-to-helix.yml | 7 +- eng/common/tools.ps1 | 4 +- global.json | 10 +-- 7 files changed, 68 insertions(+), 66 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 217e672568ff40..d5d94ff4f699de 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -111,9 +111,9 @@ - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd @@ -121,69 +121,69 @@ 73f0850939d96131c28cf6ea6ee5aacb4da0083a - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd https://github.com/dotnet/runtime-assets @@ -334,9 +334,9 @@ https://github.com/dotnet/xharness d33548342ade8e537d891c8f0f593aa206418625 - + https://github.com/dotnet/arcade - c255aae7f2b128fa20a4441f0e192c3c53561621 + 221fba21fbd6a29f17af7a7004f8ef18a51519bd https://dev.azure.com/dnceng/internal/_git/dotnet-optimization diff --git a/eng/Versions.props b/eng/Versions.props index bc974eb7e0bba8..02792b5e567c9f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -87,21 +87,21 @@ 8.0.100 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 2.5.1-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 - 8.0.0-beta.25060.1 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 2.5.1-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 + 8.0.0-beta.25114.5 6.0.0-preview.1.102 @@ -259,7 +259,7 @@ 3.1.7 1.0.406601 - 8.0.110 + 8.0.113 $(MicrosoftDotnetSdkInternalVersion) diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 index 73828dd30d3179..4f0546dce1208d 100644 --- a/eng/common/sdk-task.ps1 +++ b/eng/common/sdk-task.ps1 @@ -64,7 +64,7 @@ try { $GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty } if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) { - $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.8.1-2" -MemberType NoteProperty + $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.12.0" -MemberType NoteProperty } if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") { $xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true diff --git a/eng/common/templates-official/steps/send-to-helix.yml b/eng/common/templates-official/steps/send-to-helix.yml index 3eb7e2d5f840c7..22f2501307d4ba 100644 --- a/eng/common/templates-official/steps/send-to-helix.yml +++ b/eng/common/templates-official/steps/send-to-helix.yml @@ -8,6 +8,7 @@ parameters: HelixConfiguration: '' # optional -- additional property attached to a job HelixPreCommands: '' # optional -- commands to run before Helix work item execution HelixPostCommands: '' # optional -- commands to run after Helix work item execution + HelixProjectArguments: '' # optional -- arguments passed to the build command for helixpublish.proj WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects @@ -24,12 +25,12 @@ parameters: IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net ) Creator: '' # optional -- if the build is external, use this to specify who is sending the job - DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO + DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false steps: - - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj ${{ parameters.HelixProjectArguments }} /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' displayName: ${{ parameters.DisplayNamePrefix }} (Windows) env: BuildConfig: $(_BuildConfig) @@ -59,7 +60,7 @@ steps: SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) continueOnError: ${{ parameters.continueOnError }} - - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj ${{ parameters.HelixProjectArguments }} /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog displayName: ${{ parameters.DisplayNamePrefix }} (Unix) env: BuildConfig: $(_BuildConfig) diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml index 3eb7e2d5f840c7..22f2501307d4ba 100644 --- a/eng/common/templates/steps/send-to-helix.yml +++ b/eng/common/templates/steps/send-to-helix.yml @@ -8,6 +8,7 @@ parameters: HelixConfiguration: '' # optional -- additional property attached to a job HelixPreCommands: '' # optional -- commands to run before Helix work item execution HelixPostCommands: '' # optional -- commands to run after Helix work item execution + HelixProjectArguments: '' # optional -- arguments passed to the build command for helixpublish.proj WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects @@ -24,12 +25,12 @@ parameters: IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net ) Creator: '' # optional -- if the build is external, use this to specify who is sending the job - DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO + DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false steps: - - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj ${{ parameters.HelixProjectArguments }} /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' displayName: ${{ parameters.DisplayNamePrefix }} (Windows) env: BuildConfig: $(_BuildConfig) @@ -59,7 +60,7 @@ steps: SYSTEM_ACCESSTOKEN: $(System.AccessToken) condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) continueOnError: ${{ parameters.continueOnError }} - - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj ${{ parameters.HelixProjectArguments }} /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog displayName: ${{ parameters.DisplayNamePrefix }} (Unix) env: BuildConfig: $(_BuildConfig) diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index 60352ede194ec3..a00577ed17aa44 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -384,8 +384,8 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements = # If the version of msbuild is going to be xcopied, # use this version. Version matches a package here: - # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/RoslynTools.MSBuild/versions/17.8.1-2 - $defaultXCopyMSBuildVersion = '17.8.1-2' + # https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/RoslynTools.MSBuild/versions/17.12.0 + $defaultXCopyMSBuildVersion = '17.12.0' if (!$vsRequirements) { if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') { diff --git a/global.json b/global.json index 6abaf940387f48..50ee710d83fdc4 100644 --- a/global.json +++ b/global.json @@ -1,16 +1,16 @@ { "sdk": { - "version": "8.0.110", + "version": "8.0.113", "allowPrerelease": true, "rollForward": "major" }, "tools": { - "dotnet": "8.0.110" + "dotnet": "8.0.113" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25060.1", - "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25060.1", - "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25060.1", + "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25114.5", + "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25114.5", + "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25114.5", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.NET.Sdk.IL": "8.0.0-rc.1.23406.6" From c10888fd60e35862a8e6b9d19bb6e0b6aacd28ed Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 11:03:11 -0700 Subject: [PATCH 21/27] [release/8.0-staging] Update dependencies from dotnet/hotreload-utils (#112520) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update dependencies from https://github.com/dotnet/hotreload-utils build 20250213.1 Microsoft.DotNet.HotReload.Utils.Generator.BuildTool From Version 8.0.0-alpha.0.25077.2 -> To Version 8.0.0-alpha.0.25113.1 * Update dependencies from https://github.com/dotnet/hotreload-utils build 20250217.1 Microsoft.DotNet.HotReload.Utils.Generator.BuildTool From Version 8.0.0-alpha.0.25077.2 -> To Version 8.0.0-alpha.0.25117.1 * Update dependencies from https://github.com/dotnet/hotreload-utils build 20250224.2 Microsoft.DotNet.HotReload.Utils.Generator.BuildTool From Version 8.0.0-alpha.0.25077.2 -> To Version 8.0.0-alpha.0.25124.2 --------- Co-authored-by: dotnet-maestro[bot] Co-authored-by: Carlos Sánchez López <1175054+carlossanlop@users.noreply.github.com> --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index d5d94ff4f699de..4b5f1e516d5834 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -354,9 +354,9 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization 67613417f5e1af250e6ddfba79f8f2885d8e90fb - + https://github.com/dotnet/hotreload-utils - feeef0335323285595eff5fdb6fcb9f3f724a37d + 232793be175603f21989ca3be5dbe53dc41fc96d https://github.com/dotnet/runtime-assets diff --git a/eng/Versions.props b/eng/Versions.props index 02792b5e567c9f..51b7f29a82ccbe 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -188,7 +188,7 @@ 8.0.0-prerelease.25103.2 8.0.0-prerelease.25103.2 8.0.0-prerelease.25103.2 - 8.0.0-alpha.0.25077.2 + 8.0.0-alpha.0.25124.2 2.4.2 1.0.0 2.4.5 From 165b4c9898a616b3ac26865428f3078cd2180b1a Mon Sep 17 00:00:00 2001 From: Kevin Jones Date: Mon, 10 Mar 2025 17:39:44 -0400 Subject: [PATCH 22/27] [release/8.0-staging] Fix OpenSsl directory store refresh frequency --- .../X509Certificates/OpenSslCachedDirectoryStoreProvider.cs | 2 ++ .../X509Certificates/OpenSslCachedSystemStoreProvider.cs | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedDirectoryStoreProvider.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedDirectoryStoreProvider.cs index da0fc5dff15808..decc699c4495d4 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedDirectoryStoreProvider.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedDirectoryStoreProvider.cs @@ -46,6 +46,8 @@ internal SafeX509StackHandle GetNativeCollection() { _storeDirectoryInfo.Refresh(); DirectoryInfo info = _storeDirectoryInfo; + ret = _nativeCollection; + elapsed = _recheckStopwatch.Elapsed; if (ret == null || _forceRefresh || diff --git a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedSystemStoreProvider.cs b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedSystemStoreProvider.cs index e66b3d1ad11022..57566692d087a2 100644 --- a/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedSystemStoreProvider.cs +++ b/src/libraries/System.Security.Cryptography/src/System/Security/Cryptography/X509Certificates/OpenSslCachedSystemStoreProvider.cs @@ -93,6 +93,9 @@ private static Tuple GetCollections() { lock (s_recheckStopwatch) { + ret = s_nativeCollections; + elapsed = s_recheckStopwatch.Elapsed; + if (ret == null || elapsed > s_assumeInvalidInterval || LastWriteTimesHaveChanged()) From c8cdafd934bfc276a3bec98293b6e8be471d01f0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:29:46 +0100 Subject: [PATCH 23/27] [release/8.0-staging] Fix HttpHandlerDiagnosticListenerTests.TestW3CHeadersTraceStateAndCorrelationContext (#112881) Backport of #112753 to release/8.0-staging --- .../tests/HttpHandlerDiagnosticListenerTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/tests/HttpHandlerDiagnosticListenerTests.cs b/src/libraries/System.Diagnostics.DiagnosticSource/tests/HttpHandlerDiagnosticListenerTests.cs index 0c23059c17ae88..ecfe219e072843 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/tests/HttpHandlerDiagnosticListenerTests.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/tests/HttpHandlerDiagnosticListenerTests.cs @@ -145,6 +145,7 @@ public async Task TestBasicReceiveAndResponseEvents() } } + [ActiveIssue("https://github.com/dotnet/runtime/issues/112792")] [OuterLoop] [ConditionalFact(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] public void TestW3CHeaders() @@ -194,6 +195,7 @@ public void TestW3CHeadersTraceStateAndCorrelationContext() { using (var eventRecords = new EventObserverAndRecorder()) { + Activity.DefaultIdFormat = ActivityIdFormat.W3C; var parent = new Activity("w3c activity"); parent.SetParentId(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom()); parent.TraceStateString = "some=state"; From f4764bfc7546ee338ce5117bfe436fcd0f3d5989 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Wed, 12 Mar 2025 22:25:15 +0000 Subject: [PATCH 24/27] Update dependencies from https://github.com/dotnet/arcade build 20250220.1 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Build.Tasks.Archives , Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Build.Tasks.Installers , Microsoft.DotNet.Build.Tasks.Packaging , Microsoft.DotNet.Build.Tasks.TargetFramework , Microsoft.DotNet.Build.Tasks.Templating , Microsoft.DotNet.Build.Tasks.Workloads , Microsoft.DotNet.CodeAnalysis , Microsoft.DotNet.GenAPI , Microsoft.DotNet.GenFacades , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.PackageTesting , Microsoft.DotNet.RemoteExecutor , Microsoft.DotNet.SharedFramework.Sdk , Microsoft.DotNet.VersionTools.Tasks , Microsoft.DotNet.XUnitConsoleRunner , Microsoft.DotNet.XUnitExtensions From Version 8.0.0-beta.25114.5 -> To Version 8.0.0-beta.25120.1 --- NuGet.config | 1 - eng/Version.Details.xml | 72 ++++++++++++++++---------------- eng/Versions.props | 30 ++++++------- eng/common/cross/toolchain.cmake | 4 ++ global.json | 6 +-- 5 files changed, 58 insertions(+), 55 deletions(-) diff --git a/NuGet.config b/NuGet.config index 4b6a2da9147bbc..3795f6e59e8c2b 100644 --- a/NuGet.config +++ b/NuGet.config @@ -9,7 +9,6 @@ - diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1a54f27bb2af56..1dcc321065a7f1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -111,9 +111,9 @@ - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc @@ -121,69 +121,69 @@ 73f0850939d96131c28cf6ea6ee5aacb4da0083a - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc https://github.com/dotnet/runtime-assets @@ -334,9 +334,9 @@ https://github.com/dotnet/xharness d33548342ade8e537d891c8f0f593aa206418625 - + https://github.com/dotnet/arcade - 221fba21fbd6a29f17af7a7004f8ef18a51519bd + 4ff4ce248e95ae74b0040de6a6c5939aa63120dc https://dev.azure.com/dnceng/internal/_git/dotnet-optimization diff --git a/eng/Versions.props b/eng/Versions.props index 09b899fa13341f..65ebc153d93e10 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -87,21 +87,21 @@ 8.0.100 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 2.5.1-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 - 8.0.0-beta.25114.5 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 2.5.1-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 + 8.0.0-beta.25120.1 6.0.0-preview.1.102 diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake index dafabdcaef00d4..f93dc440df0e9c 100644 --- a/eng/common/cross/toolchain.cmake +++ b/eng/common/cross/toolchain.cmake @@ -280,6 +280,8 @@ elseif(TARGET_ARCH_NAME MATCHES "^(arm64|x64)$") add_toolchain_linker_flag("-Wl,--rpath-link=${CROSS_ROOTFS}/usr/lib64") add_toolchain_linker_flag("-Wl,--rpath-link=${TIZEN_TOOLCHAIN_PATH}") endif() +elseif(TARGET_ARCH_NAME STREQUAL "s390x") + add_toolchain_linker_flag("--target=${TOOLCHAIN}") elseif(TARGET_ARCH_NAME STREQUAL "x86") if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl) add_toolchain_linker_flag("--target=${TOOLCHAIN}") @@ -327,6 +329,8 @@ if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") if(TARGET_ARCH_NAME STREQUAL "armel") add_compile_options(-mfloat-abi=softfp) endif() +elseif(TARGET_ARCH_NAME STREQUAL "s390x") + add_compile_options("--target=${TOOLCHAIN}") elseif(TARGET_ARCH_NAME STREQUAL "x86") if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/i586-alpine-linux-musl) add_compile_options(--target=${TOOLCHAIN}) diff --git a/global.json b/global.json index 50ee710d83fdc4..c63eebc644eae3 100644 --- a/global.json +++ b/global.json @@ -8,9 +8,9 @@ "dotnet": "8.0.113" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25114.5", - "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25114.5", - "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25114.5", + "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25120.1", + "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25120.1", + "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25120.1", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.NET.Sdk.IL": "8.0.0-rc.1.23406.6" From 160b2be35b9b5244c5c452bda662b932872841a5 Mon Sep 17 00:00:00 2001 From: Haruna Ogweda Date: Thu, 13 Mar 2025 22:05:17 -0700 Subject: [PATCH 25/27] update runtime release/8.0 branch to produce SBOM after signing artifacts (#113504) Co-authored-by: Haruna Ogweda --- eng/pipelines/official/jobs/prepare-signed-artifacts.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml index 24fd2df48d74be..79f11bb09d282c 100644 --- a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml +++ b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml @@ -8,6 +8,8 @@ jobs: - job: PrepareSignedArtifacts displayName: Prepare Signed Artifacts dependsOn: ${{ parameters.dependsOn }} + # Disable SBOM at job template level + enableSbom: false pool: name: $(DncEngInternalBuildPool) demands: ImageOverride -equals 1es-windows-2022 @@ -64,6 +66,10 @@ jobs: /bl:$(Build.SourcesDirectory)\prepare-artifacts.binlog displayName: Prepare artifacts and upload to build + - template: /eng/common/templates-official/steps/generate-sbom.yml + parameters: + BuildDropPath: $(Build.SourcesDirectory)\artifacts + - task: CopyFiles@2 displayName: Copy Files to $(Build.StagingDirectory)\BuildLogs inputs: From b16872e0d5c93cd03272c6b1f8fff9716f4c54a6 Mon Sep 17 00:00:00 2001 From: Juan Hoyos <19413848+hoyosjs@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:08:12 -0700 Subject: [PATCH 26/27] Remove unnecessary parameter for SBOM generation (#113544) --- eng/pipelines/official/jobs/prepare-signed-artifacts.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml index 79f11bb09d282c..4327746620095b 100644 --- a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml +++ b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml @@ -8,8 +8,6 @@ jobs: - job: PrepareSignedArtifacts displayName: Prepare Signed Artifacts dependsOn: ${{ parameters.dependsOn }} - # Disable SBOM at job template level - enableSbom: false pool: name: $(DncEngInternalBuildPool) demands: ImageOverride -equals 1es-windows-2022 @@ -79,4 +77,4 @@ jobs: **/*.binlog TargetFolder: '$(Build.StagingDirectory)\BuildLogs' continueOnError: true - condition: succeededOrFailed() \ No newline at end of file + condition: succeededOrFailed() From b17f0594b28bc51ef41ed2804d55539f4db78349 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 19:25:14 -0700 Subject: [PATCH 27/27] [release/8.0] Update dependencies from dotnet/arcade (#113551) * backport #113432 (#113479) Backport of #113432 to release/8.0-staging Contributes to #113372. * Update dependencies from https://github.com/dotnet/arcade build 20250314.5 Microsoft.DotNet.Arcade.Sdk , Microsoft.DotNet.Build.Tasks.Archives , Microsoft.DotNet.Build.Tasks.Feed , Microsoft.DotNet.Build.Tasks.Installers , Microsoft.DotNet.Build.Tasks.Packaging , Microsoft.DotNet.Build.Tasks.TargetFramework , Microsoft.DotNet.Build.Tasks.Templating , Microsoft.DotNet.Build.Tasks.Workloads , Microsoft.DotNet.CodeAnalysis , Microsoft.DotNet.GenAPI , Microsoft.DotNet.GenFacades , Microsoft.DotNet.Helix.Sdk , Microsoft.DotNet.PackageTesting , Microsoft.DotNet.RemoteExecutor , Microsoft.DotNet.SharedFramework.Sdk , Microsoft.DotNet.VersionTools.Tasks , Microsoft.DotNet.XUnitConsoleRunner , Microsoft.DotNet.XUnitExtensions From Version 8.0.0-beta.25114.5 -> To Version 8.0.0-beta.25164.5 * Update wasm test SDK --------- Co-authored-by: Anton Firszov Co-authored-by: dotnet-maestro[bot] Co-authored-by: vseanreesermsft <78103370+vseanreesermsft@users.noreply.github.com> Co-authored-by: Juan Sebastian Hoyos Ayala --- eng/Version.Details.xml | 72 +++++++++---------- eng/Versions.props | 32 ++++----- eng/common/generate-sbom-prep.ps1 | 20 ++++-- eng/common/generate-sbom-prep.sh | 17 +++-- eng/common/templates-official/job/job.yml | 3 +- .../steps/generate-sbom.yml | 2 +- eng/common/tools.ps1 | 4 +- eng/common/tools.sh | 4 +- eng/pipelines/libraries/stress/http.yml | 5 +- eng/pipelines/libraries/stress/ssl.yml | 5 +- global.json | 10 +-- 11 files changed, 93 insertions(+), 81 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 1dcc321065a7f1..23e581ade23d81 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -111,9 +111,9 @@ - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c @@ -121,69 +121,69 @@ 73f0850939d96131c28cf6ea6ee5aacb4da0083a - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c https://github.com/dotnet/runtime-assets @@ -334,9 +334,9 @@ https://github.com/dotnet/xharness d33548342ade8e537d891c8f0f593aa206418625 - + https://github.com/dotnet/arcade - 4ff4ce248e95ae74b0040de6a6c5939aa63120dc + 802042c6e779b73b4edb012ee1d5bae02ec8d41c https://dev.azure.com/dnceng/internal/_git/dotnet-optimization diff --git a/eng/Versions.props b/eng/Versions.props index 65ebc153d93e10..0b891b622d4037 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -87,21 +87,21 @@ 8.0.100 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 2.5.1-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 - 8.0.0-beta.25120.1 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 2.5.1-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 + 8.0.0-beta.25164.5 6.0.0-preview.1.102 @@ -259,7 +259,7 @@ 3.1.7 1.0.406601 - 8.0.113 + 8.0.114 $(MicrosoftDotnetSdkInternalVersion) diff --git a/eng/common/generate-sbom-prep.ps1 b/eng/common/generate-sbom-prep.ps1 index 3e5c1c74a1c50d..a0c7d792a76fbe 100644 --- a/eng/common/generate-sbom-prep.ps1 +++ b/eng/common/generate-sbom-prep.ps1 @@ -4,18 +4,26 @@ Param( . $PSScriptRoot\pipeline-logging-functions.ps1 +# Normally - we'd listen to the manifest path given, but 1ES templates will overwrite if this level gets uploaded directly +# with their own overwriting ours. So we create it as a sub directory of the requested manifest path. +$ArtifactName = "${env:SYSTEM_STAGENAME}_${env:AGENT_JOBNAME}_SBOM" +$SafeArtifactName = $ArtifactName -replace '["/:<>\\|?@*"() ]', '_' +$SbomGenerationDir = Join-Path $ManifestDirPath $SafeArtifactName + +Write-Host "Artifact name before : $ArtifactName" +Write-Host "Artifact name after : $SafeArtifactName" + Write-Host "Creating dir $ManifestDirPath" + # create directory for sbom manifest to be placed -if (!(Test-Path -path $ManifestDirPath)) +if (!(Test-Path -path $SbomGenerationDir)) { - New-Item -ItemType Directory -path $ManifestDirPath - Write-Host "Successfully created directory $ManifestDirPath" + New-Item -ItemType Directory -path $SbomGenerationDir + Write-Host "Successfully created directory $SbomGenerationDir" } else{ Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." } Write-Host "Updating artifact name" -$artifact_name = "${env:SYSTEM_STAGENAME}_${env:AGENT_JOBNAME}_SBOM" -replace '["/:<>\\|?@*"() ]', '_' -Write-Host "Artifact name $artifact_name" -Write-Host "##vso[task.setvariable variable=ARTIFACT_NAME]$artifact_name" +Write-Host "##vso[task.setvariable variable=ARTIFACT_NAME]$SafeArtifactName" diff --git a/eng/common/generate-sbom-prep.sh b/eng/common/generate-sbom-prep.sh index d5c76dc827b496..bbb4922151e625 100644 --- a/eng/common/generate-sbom-prep.sh +++ b/eng/common/generate-sbom-prep.sh @@ -14,19 +14,24 @@ done scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" . $scriptroot/pipeline-logging-functions.sh +# replace all special characters with _, some builds use special characters like : in Agent.Jobname, that is not a permissible name while uploading artifacts. +artifact_name=$SYSTEM_STAGENAME"_"$AGENT_JOBNAME"_SBOM" +safe_artifact_name="${artifact_name//["/:<>\\|?@*$" ]/_}" + manifest_dir=$1 -if [ ! -d "$manifest_dir" ] ; then - mkdir -p "$manifest_dir" - echo "Sbom directory created." $manifest_dir +# Normally - we'd listen to the manifest path given, but 1ES templates will overwrite if this level gets uploaded directly +# with their own overwriting ours. So we create it as a sub directory of the requested manifest path. +sbom_generation_dir="$manifest_dir/$safe_artifact_name" + +if [ ! -d "$sbom_generation_dir" ] ; then + mkdir -p "$sbom_generation_dir" + echo "Sbom directory created." $sbom_generation_dir else Write-PipelineTelemetryError -category 'Build' "Unable to create sbom folder." fi -artifact_name=$SYSTEM_STAGENAME"_"$AGENT_JOBNAME"_SBOM" echo "Artifact name before : "$artifact_name -# replace all special characters with _, some builds use special characters like : in Agent.Jobname, that is not a permissible name while uploading artifacts. -safe_artifact_name="${artifact_name//["/:<>\\|?@*$" ]/_}" echo "Artifact name after : "$safe_artifact_name export ARTIFACT_NAME=$safe_artifact_name echo "##vso[task.setvariable variable=ARTIFACT_NAME]$safe_artifact_name" diff --git a/eng/common/templates-official/job/job.yml b/eng/common/templates-official/job/job.yml index 1f035fee73f4a9..98ccbd7a9c16ec 100644 --- a/eng/common/templates-official/job/job.yml +++ b/eng/common/templates-official/job/job.yml @@ -38,6 +38,7 @@ parameters: enableSbom: true PackageVersion: 7.0.0 BuildDropPath: '$(Build.SourcesDirectory)/artifacts' + ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom jobs: - job: ${{ parameters.name }} @@ -261,4 +262,4 @@ jobs: targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration' artifactName: 'BuildConfiguration' displayName: 'Publish build retry configuration' - continueOnError: true \ No newline at end of file + continueOnError: true diff --git a/eng/common/templates-official/steps/generate-sbom.yml b/eng/common/templates-official/steps/generate-sbom.yml index 1bf43bf807af39..daf0957b68d762 100644 --- a/eng/common/templates-official/steps/generate-sbom.yml +++ b/eng/common/templates-official/steps/generate-sbom.yml @@ -35,7 +35,7 @@ steps: PackageName: ${{ parameters.packageName }} BuildDropPath: ${{ parameters.buildDropPath }} PackageVersion: ${{ parameters.packageVersion }} - ManifestDirPath: ${{ parameters.manifestDirPath }} + ManifestDirPath: ${{ parameters.manifestDirPath }}/$(ARTIFACT_NAME) ${{ if ne(parameters.IgnoreDirectories, '') }}: AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}' diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1 index a00577ed17aa44..82b2798ba307d5 100644 --- a/eng/common/tools.ps1 +++ b/eng/common/tools.ps1 @@ -42,7 +42,7 @@ [bool]$useInstalledDotNetCli = if (Test-Path variable:useInstalledDotNetCli) { $useInstalledDotNetCli } else { $true } # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.ps1 +# default URL: https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.ps1 [string]$dotnetInstallScriptVersion = if (Test-Path variable:dotnetInstallScriptVersion) { $dotnetInstallScriptVersion } else { 'v1' } # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -263,7 +263,7 @@ function GetDotNetInstallScript([string] $dotnetRoot) { if (!(Test-Path $installScript)) { Create-Directory $dotnetRoot $ProgressPreference = 'SilentlyContinue' # Don't display the console progress UI - it's a huge perf hit - $uri = "https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" + $uri = "https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.ps1" Retry({ Write-Host "GET $uri" diff --git a/eng/common/tools.sh b/eng/common/tools.sh index b9b329ce37fff4..68db15430230ae 100755 --- a/eng/common/tools.sh +++ b/eng/common/tools.sh @@ -54,7 +54,7 @@ warn_as_error=${warn_as_error:-true} use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} # Enable repos to use a particular version of the on-line dotnet-install scripts. -# default URL: https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh +# default URL: https://builds.dotnet.microsoft.com/dotnet/scripts/v1/dotnet-install.sh dotnetInstallScriptVersion=${dotnetInstallScriptVersion:-'v1'} # True to use global NuGet cache instead of restoring packages to repository-local directory. @@ -297,7 +297,7 @@ function with_retries { function GetDotNetInstallScript { local root=$1 local install_script="$root/dotnet-install.sh" - local install_script_url="https://dotnet.microsoft.com/download/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" + local install_script_url="https://builds.dotnet.microsoft.com/dotnet/scripts/$dotnetInstallScriptVersion/dotnet-install.sh" if [[ ! -a "$install_script" ]]; then mkdir -p "$root" diff --git a/eng/pipelines/libraries/stress/http.yml b/eng/pipelines/libraries/stress/http.yml index 43ae5d096861aa..9b77085862e6c9 100644 --- a/eng/pipelines/libraries/stress/http.yml +++ b/eng/pipelines/libraries/stress/http.yml @@ -8,12 +8,11 @@ pr: schedules: - cron: "0 13 * * *" # 1PM UTC => 5 AM PST displayName: HttpStress nightly run + always: true branches: include: - main - - release/6.0 - - release/7.0 - - release/8.0 + - release/*-staging variables: - template: ../variables.yml diff --git a/eng/pipelines/libraries/stress/ssl.yml b/eng/pipelines/libraries/stress/ssl.yml index 1e8cddf228bcb1..ed1306990e294b 100644 --- a/eng/pipelines/libraries/stress/ssl.yml +++ b/eng/pipelines/libraries/stress/ssl.yml @@ -8,12 +8,11 @@ pr: schedules: - cron: "0 13 * * *" # 1PM UTC => 5 AM PST displayName: SslStress nightly run + always: true branches: include: - main - - release/6.0 - - release/7.0 - - release/8.0 + - release/*-staging variables: - template: ../variables.yml diff --git a/global.json b/global.json index c63eebc644eae3..00765629ae001a 100644 --- a/global.json +++ b/global.json @@ -1,16 +1,16 @@ { "sdk": { - "version": "8.0.113", + "version": "8.0.114", "allowPrerelease": true, "rollForward": "major" }, "tools": { - "dotnet": "8.0.113" + "dotnet": "8.0.114" }, "msbuild-sdks": { - "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25120.1", - "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25120.1", - "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25120.1", + "Microsoft.DotNet.Arcade.Sdk": "8.0.0-beta.25164.5", + "Microsoft.DotNet.Helix.Sdk": "8.0.0-beta.25164.5", + "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.25164.5", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", "Microsoft.NET.Sdk.IL": "8.0.0-rc.1.23406.6"