Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0dc3ce9
[xcode27.0] Bump to Xcode 27.0 Beta 1 and raise the iOS/tvOS minimum …
dalexsoto Jun 9, 2026
17c049b
[src] Remove redundant iOS/tvOS availability versions below the 15.0 …
dalexsoto Jun 9, 2026
60112d0
Auto-format source code
Jun 9, 2026
bee05bc
Bump mlaunch and fix some tests
dalexsoto Jun 10, 2026
01427aa
[CI] Run ./configure after provisioning in the simulator test stage
dalexsoto Jun 10, 2026
ea0c50d
[bgen] Update test expectations for the raised iOS/tvOS minimum
dalexsoto Jun 10, 2026
346df76
[xcode27.0] Fix simulator provisioning and ACTool tests for Xcode 27
dalexsoto Jun 11, 2026
04a736d
[xcode27.0] Make the simulator runtime fallback download deterministi…
dalexsoto Jun 11, 2026
dc4c6cf
[msbuild] Make inlined dlfcn native symbol references weak + dlsym fa…
dalexsoto Jun 11, 2026
f2412da
bump xharness
dalexsoto Jun 11, 2026
aeb10c4
[tests] Use an Apple TV 4K simulator device type for tvOS 27+
dalexsoto Jun 11, 2026
69bdf58
[tests] Skip x64 simulator test configurations on Xcode 27+
dalexsoto Jun 11, 2026
19afb2b
Auto-format source code
Jun 11, 2026
a44bb3a
[tests] Use Xcode 27 simulator device types in MLaunchTool
dalexsoto Jun 11, 2026
f4f20a0
bump xharness
dalexsoto Jun 11, 2026
e00f354
[bgen] Propagate simulator availability attributes to smart-enum fiel…
dalexsoto Jun 12, 2026
cb5ed27
[src] Fix introspection simulator availability for the raised iOS/tvO…
dalexsoto Jun 12, 2026
3921131
[tests] Await async cancellation in SecProtocolMetadataTest to avoid …
dalexsoto Jun 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
18 changes: 9 additions & 9 deletions Make.config
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,8 @@ NUGET_RELEASE_BRANCH=release/10.0.1xx
##
## Note that the prerelease identifier should be as short as possible, because otherwise
## the resulting package name can become too long for MSIs.
NUGET_HARDCODED_PRERELEASE_IDENTIFIER=xcode26.5
NUGET_HARDCODED_PRERELEASE_BRANCH=xcode26.5
NUGET_HARDCODED_PRERELEASE_IDENTIFIER=xcode27.0
NUGET_HARDCODED_PRERELEASE_BRANCH=xcode27.0

# compute the alphanumeric version of branch names
NUGET_RELEASE_BRANCH_ALPHANUMERIC:=$(shell export LANG=C; printf "%s" "$(NUGET_RELEASE_BRANCH)" | tr -c '[a-zA-Z0-9-]' '-')
Expand Down Expand Up @@ -209,10 +209,10 @@ MACCATALYST_NUGET_VERSION_FULL=$(MACCATALYST_NUGET_VERSION_NO_METADATA)$(NUGET_B
-include $(TOP)/configure.inc

# Xcode version should have both a major and a minor version (even if the minor version is 0)
XCODE_VERSION=26.5
XCODE_URL=https://bosstoragemirror.blob.core.windows.net/internal-files/xcodes/Xcode_26.5.xip
XCODE_VERSION=27.0
XCODE_URL=https://bosstoragemirror.blob.core.windows.net/internal-files/xcodes/Xcode_27_beta.xip
ifndef NO_XCODE
XCODE_DEVELOPER_ROOT?=/Applications/Xcode_26.5.0.app/Contents/Developer
XCODE_DEVELOPER_ROOT?=/Applications/Xcode_27.0.0-beta.app/Contents/Developer
ifneq (OK,$(shell test -d $(abspath $(XCODE_DEVELOPER_ROOT)) && echo OK))
NO_XCODE=1
$(warning The required Xcode ($(XCODE_VERSION)) is not installed in $(XCODE_DEVELOPER_ROOT) - this directory does not exist. Any parts of the build that require Xcode will be disabled.)
Expand Down Expand Up @@ -290,14 +290,14 @@ MAX_TVOS_SIMULATOR_VERSION=$(TVOS_SDK_VERSION)
endif

# Minimum OS versions for running XI/XM apps.
MIN_IOS_SDK_VERSION=12.2
MIN_IOS_SDK_VERSION=15.0
MIN_MACOS_SDK_VERSION=12.0
MIN_TVOS_SDK_VERSION=12.2
MIN_TVOS_SDK_VERSION=15.0
MIN_MACCATALYST_SDK_VERSION=15.0

# Minimum OS versions for .NET 9 support
DOTNET_MIN_IOS_SDK_VERSION=12.2
DOTNET_MIN_TVOS_SDK_VERSION=12.2
DOTNET_MIN_IOS_SDK_VERSION=15.0
DOTNET_MIN_TVOS_SDK_VERSION=15.0
DOTNET_MIN_MACCATALYST_SDK_VERSION=15.0
DOTNET_MIN_MACOS_SDK_VERSION=12.0

Expand Down
8 changes: 4 additions & 4 deletions Make.versions
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
# IMPORTANT: There must be *no* managed API differences unless the two first
# numbers (major.minor) changes.

IOS_NUGET_OS_VERSION=26.5
TVOS_NUGET_OS_VERSION=26.5
MACOS_NUGET_OS_VERSION=26.5
MACCATALYST_NUGET_OS_VERSION=26.5
IOS_NUGET_OS_VERSION=27.0
TVOS_NUGET_OS_VERSION=27.0
MACOS_NUGET_OS_VERSION=27.0
MACCATALYST_NUGET_OS_VERSION=27.0

# The following are the OS versions we first supported with the current .NET version.
# These versions must *not* change with minor .NET updates, only major .NET releases.
Expand Down
4 changes: 4 additions & 0 deletions builds/Versions-MacCatalyst.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>SupportedTargetPlatformVersions</key>
Expand Down Expand Up @@ -68,6 +69,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>MacCatalystVersionMap</key>
Expand Down Expand Up @@ -132,6 +134,8 @@
<string>26.4</string>
<key>26.5</key>
<string>26.5</string>
<key>27.0</key>
<string>27.0</string>
</dict>
<key>RecommendedXcodeVersion</key>
<string>@XCODE_VERSION@</string>
Expand Down
18 changes: 2 additions & 16 deletions builds/Versions-iOS.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,6 @@
<dict>
<key>iOS</key>
<array>
<string>12.2</string>
<string>12.3</string>
<string>12.4</string>
<string>13.0</string>
<string>13.1</string>
<string>13.2</string>
<string>13.3</string>
<string>13.4</string>
<string>13.5</string>
<string>13.6</string>
<string>14.0</string>
<string>14.1</string>
<string>14.2</string>
<string>14.3</string>
<string>14.4</string>
<string>14.5</string>
<string>15.0</string>
<string>15.2</string>
<string>15.4</string>
Expand All @@ -46,6 +30,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>SupportedTargetPlatformVersions</key>
Expand Down Expand Up @@ -104,6 +89,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>RecommendedXcodeVersion</key>
Expand Down
2 changes: 2 additions & 0 deletions builds/Versions-macOS.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>SupportedTargetPlatformVersions</key>
Expand Down Expand Up @@ -66,6 +67,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>RecommendedXcodeVersion</key>
Expand Down
14 changes: 2 additions & 12 deletions builds/Versions-tvOS.plist.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,6 @@
<dict>
<key>tvOS</key>
<array>
<string>12.2</string>
<string>12.3</string>
<string>12.4</string>
<string>13.0</string>
<string>13.2</string>
<string>13.3</string>
<string>13.4</string>
<string>14.0</string>
<string>14.2</string>
<string>14.3</string>
<string>14.4</string>
<string>14.5</string>
<string>15.0</string>
<string>15.2</string>
<string>15.4</string>
Expand All @@ -41,6 +29,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>SupportedTargetPlatformVersions</key>
Expand Down Expand Up @@ -94,6 +83,7 @@
<string>26.2</string>
<string>26.4</string>
<string>26.5</string>
<string>27.0</string>
</array>
</dict>
<key>RecommendedXcodeVersion</key>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "13.0"
"defaultValue": "15.0"
}
},
"defaultName": "iOSNotificationContentExtension1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "13.0"
"defaultValue": "15.0"
},
"extensionClassName": {
"type": "parameter",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "13.0"
"defaultValue": "15.0"
},
"deviceFamily": {
"type": "parameter",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "13.0"
"defaultValue": "15.0"
},
"deviceFamily": {
"type": "parameter",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "13.0"
"defaultValue": "15.0"
},
"deviceFamily": {
"type": "parameter",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "12.2"
"defaultValue": "15.0"
}
},
"defaultName": "tvOSApp1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"description": "Overrides SupportedOSPlatformVersion in the project file",
"replaces": "minOSVersion",
"datatype": "string",
"defaultValue": "12.2"
"defaultValue": "15.0"
}
},
"defaultName": "tvOSApp1"
Expand Down
2 changes: 1 addition & 1 deletion eng/Version.Details.props
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ This file should be imported by eng/Versions.props
<MicrosofttvOSSdknet90_185PackageVersion>18.5.9227</MicrosofttvOSSdknet90_185PackageVersion>
<MicrosofttvOSSdknet90_265PackageVersion>26.5.9004</MicrosofttvOSSdknet90_265PackageVersion>
<!-- dotnet-xharness dependencies -->
<MicrosoftDotNetXHarnessiOSSharedPackageVersion>11.0.0-prerelease.26264.1</MicrosoftDotNetXHarnessiOSSharedPackageVersion>
<MicrosoftDotNetXHarnessiOSSharedPackageVersion>11.0.0-prerelease.26311.1</MicrosoftDotNetXHarnessiOSSharedPackageVersion>
<!-- xamarin-xamarin-macios dependencies -->
<MicrosoftiOSSdknet90_180PackageVersion>18.0.9617</MicrosoftiOSSdknet90_180PackageVersion>
<MicrosoftMacCatalystSdknet90_180PackageVersion>18.0.9617</MicrosoftMacCatalystSdknet90_180PackageVersion>
Expand Down
4 changes: 2 additions & 2 deletions eng/Version.Details.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,9 @@
<Uri>https://github.com/dotnet/dotnet</Uri>
<Sha>aec921632e75e1f29327709dd52e98c41f3b55cf</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.XHarness.iOS.Shared" Version="11.0.0-prerelease.26264.1">
<Dependency Name="Microsoft.DotNet.XHarness.iOS.Shared" Version="11.0.0-prerelease.26311.1">
<Uri>https://github.com/dotnet/xharness</Uri>
<Sha>51ca379106cfd749a498cb0822210ef1aa926e41</Sha>
<Sha>0e34d7da9bb71292bc9dd802cac9c5c66b480de4</Sha>
</Dependency>
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="10.0.0-beta.26281.104">
<Uri>https://github.com/dotnet/dotnet</Uri>
Expand Down
2 changes: 1 addition & 1 deletion mk/xamarin.mk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Available versions can be seen here:
# https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/Microsoft.Tools.Mlaunch/versions
MLAUNCH_NUGET_VERSION=1.1.113
MLAUNCH_NUGET_VERSION=1.1.127
# https://dev.azure.com/dnceng/public/_artifacts/feed/dotnet-eng/NuGet/AppleDocReader/versions
ADR_NUGET_VERSION=1.0.0
26 changes: 24 additions & 2 deletions msbuild/Xamarin.MacDev.Tasks/Tasks/PostTrimmingProcessing.cs
Original file line number Diff line number Diff line change
Expand Up @@ -246,11 +246,33 @@ void GenerateInlinedDlfcnNativeCode (List<string> items)
// The generated C code uses 'extern void*' declarations and returns the address of the symbol.
// This is intentional: it allows the native linker to resolve the symbol at link time, which
// is the whole point of this optimization (avoiding dlsym at runtime).
//
// The symbols are declared with __attribute__((weak_import)), and we fall back to dlsym if the
// direct reference turns out to be null at runtime. There are two reasons for this:
//
// * The symbol might not exist at runtime even though it existed in the SDK we built against
// (for example when the app runs on an older OS than the one it was built with). Without
// weak_import a missing symbol makes dyld abort at launch; with it the reference resolves to
// null instead.
//
// * A symbol can be exported by more than one framework in the SDK (for example
// UIFontTextStyleBody is exported by both UIKit and AppKit in the macOS SDK). In that case the
// native linker binds our reference to one of them (the order isn't specified), which might not
// be the framework that actually exports the symbol at runtime on older OSes. When the bound
// framework doesn't have it, we use dlsym (RTLD_DEFAULT) to find it in whichever loaded
// framework does, restoring the behavior of the non-inlined dlfcn code path.
//
// The fast path (a direct reference when the symbol is present) is unchanged, and the managed
// caller caches the result, so the dlsym fallback runs at most once per symbol.
sb.AppendLine ("#include <dlfcn.h>");
sb.AppendLine ();
sb.AppendLine ("static void* xamarin_dlfcn_fallback (void* ptr, const char* symbol) { return ptr ? ptr : dlsym (RTLD_DEFAULT, symbol); }");
sb.AppendLine ();
foreach (var field in survivingSymbols.OrderBy (s => s)) {
// Using 'void*' as a stand-in type since we only need the address
sb.AppendLine ($"extern void* {field};");
sb.AppendLine ($"extern void* {field} __attribute__((weak_import));");
sb.AppendLine ($"void* xamarin_Dlfcn_{field}_Native ();");
sb.AppendLine ($"void* xamarin_Dlfcn_{field}_Native () {{ return &{field}; }}");
sb.AppendLine ($"void* xamarin_Dlfcn_{field}_Native () {{ return xamarin_dlfcn_fallback (&{field}, \"{field}\"); }}");
sb.AppendLine ();
}

Expand Down
12 changes: 9 additions & 3 deletions runtime/trampolines.m
Original file line number Diff line number Diff line change
Expand Up @@ -283,9 +283,15 @@
Method method = class_getInstanceMethod (cls, sel);
if (!method)
return NULL;
struct objc_method_description* m_desc;
m_desc = method_getDescription (method);
return m_desc ? m_desc->types : NULL;
// Read the method's Objective-C type encoding. We deliberately use method_getTypeEncoding
// instead of method_getDescription (method)->types: method_getTypeEncoding returns the same
// type-encoding string we previously read from the objc_method_description's 'types' field, but
// method_getDescription was marked deprecated in the Xcode 27 SDK (the <objc/runtime.h>
// annotation reads "first deprecated in macOS 11.0 - Use method_getName and
// method_getTypeEncoding"). The runtime is compiled with -Werror and -Wdeprecated-declarations,
// so a call to method_getDescription would break the build. Since we only ever consumed the
// 'types' field, method_getTypeEncoding is the exact, non-deprecated replacement.
return method_getTypeEncoding (method);
}

static int
Expand Down
26 changes: 23 additions & 3 deletions scripts/generate-vs-workload/generate-vs-workload.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,30 @@
// So implement a custom version scheme for .NET 10 (in .NET 11 the inserted
// package name will be different, so we can use any version number we want,
// so we'll use the correct one).
//
// The scheme keeps the major fixed at 255 and uses the commit distance as the build component, and
// encodes the Xcode version into the minor component so the MSI version increases monotonically every
// time the Xcode major/minor increases (a newer Xcode must produce a higher MSI version), while staying
// just above the last bad version (255.220.39248) and below the MSI minor ceiling of 255.
//
// The minor bump is computed from the Xcode version as:
// minorVersionBump = (Xcode major - 26) * 10 + Xcode minor
// Xcode 26 is the first Xcode that uses Apple's year-based version numbers, so subtracting 26 gives 0
// for the 26.x series, 1 for 27.x, 2 for 28.x, etc. Multiplying by 10 and adding the (single-digit)
// Xcode minor yields a value that strictly increases with the Xcode version:
// 26.5 => 5 (MSI minor 225), 27.0 => 10 (230), 27.5 => 15 (235), 28.0 => 20 (240), ...
// The final MSI minor is 220 + minorVersionBump. For Xcode 27.x and 28.x (and any 26.x with a non-zero
// minor) this is > 220, so the version exceeds the 255.220.39248 baseline on the minor component alone,
// regardless of the build component (only Xcode 26.0 would map to exactly 220, where the build component
// would instead have to exceed 39248). The minor stays <= 255 across .NET 10's supported Xcode range
// (26-28; 28.9 => 249) and would first overflow the 255 ceiling at Xcode 29.6 (=> 256), which is one
// reason this scheme is .NET-10-only. This relies on the Xcode minor being a single digit, which has
// always held.
//
// Note: this was previously written as (26 - Xcode major), which is negative for Xcode 27 and later
// and threw in the System.Version constructor (it rejects negative components), breaking the build.
var minimumVersion = new Version (255, 220, 39248); // This is the last incorrect MSI version, we need to produce something higher than this.
// bump minor version according to current Xcode version:
// minor = minimumVersion.Minor + (26 - Major Xcode version) * 10 + (Minor Xcode version)
var minorVersionBump = int.Parse (new Version (26 - Version.Parse (xcodeVersion).Major, Version.Parse (xcodeVersion).Minor).ToString ().Replace (".", ""));
var minorVersionBump = (Version.Parse (xcodeVersion).Major - 26) * 10 + Version.Parse (xcodeVersion).Minor;
// just use the commit distance for the build version, our minor version will be higher than the minimum version, so we can use any build version.
var buildVersionBump = commitDistances [platform];
var msiVersion = new Version (minimumVersion.Major, minimumVersion.Minor + minorVersionBump, buildVersionBump);
Expand Down
4 changes: 2 additions & 2 deletions src/ARKit/ARSkeleton.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

namespace ARKit {
public partial class ARSkeleton {
[SupportedOSPlatform ("ios14.0")]
[SupportedOSPlatform ("ios")]
[UnsupportedOSPlatform ("maccatalyst")]
[UnsupportedOSPlatform ("tvos")]
[DllImport (Constants.ARKitLibrary)]
static extern IntPtr /* NSString */ ARSkeletonJointNameForRecognizedPointKey (/* NSString */ IntPtr recognizedPointKey);

[SupportedOSPlatform ("ios14.0")]
[SupportedOSPlatform ("ios")]
[UnsupportedOSPlatform ("maccatalyst")]
[UnsupportedOSPlatform ("tvos")]
public static NSString? CreateJointName (NSString recognizedPointKey)
Expand Down
4 changes: 2 additions & 2 deletions src/AVFoundation/AVSpeechSynthesizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ namespace AVFoundation {
/// <include file="../../docs/api/AVFoundation/AVSpeechSynthesizer.xml" path="/Documentation/Docs[@DocId='T:AVFoundation.AVSpeechSynthesizer']/*" />
public partial class AVSpeechSynthesizer {
#if !XAMCORE_5_0
[SupportedOSPlatform ("tvos13.0")]
[SupportedOSPlatform ("ios13.0")]
[SupportedOSPlatform ("tvos")]
[SupportedOSPlatform ("ios")]
[SupportedOSPlatform ("maccatalyst")]
[SupportedOSPlatform ("macos")]
[BindingImpl (BindingImplOptions.Optimizable)]
Expand Down
Loading
Loading