diff --git a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml
index 5d965dfd023a82..cb9cabdc3ea646 100644
--- a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml
+++ b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml
@@ -210,6 +210,9 @@
+
+
+
diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/Versioning/PlatformAttributes.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/Versioning/PlatformAttributes.cs
index 4a0a3753c00b61..ef235aae22261e 100644
--- a/src/libraries/System.Private.CoreLib/src/System/Runtime/Versioning/PlatformAttributes.cs
+++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/Versioning/PlatformAttributes.cs
@@ -102,6 +102,47 @@ sealed class UnsupportedOSPlatformAttribute : OSPlatformAttribute
public UnsupportedOSPlatformAttribute(string platformName) : base(platformName)
{
}
+ public UnsupportedOSPlatformAttribute(string platformName, string? message) : base(platformName)
+ {
+ Message = message;
+ }
+ public string? Message { get; }
+ }
+
+ ///
+ /// Marks APIs that were obsoleted in a given operating system version.
+ ///
+ ///
+ /// Primarily used by OS bindings to indicate APIs that should not be used anymore.
+ ///
+ [AttributeUsage(AttributeTargets.Assembly |
+ AttributeTargets.Class |
+ AttributeTargets.Constructor |
+ AttributeTargets.Enum |
+ AttributeTargets.Event |
+ AttributeTargets.Field |
+ AttributeTargets.Interface |
+ AttributeTargets.Method |
+ AttributeTargets.Module |
+ AttributeTargets.Property |
+ AttributeTargets.Struct,
+ AllowMultiple = true, Inherited = false)]
+#if SYSTEM_PRIVATE_CORELIB
+ public
+#else
+ internal
+#endif
+ sealed class ObsoletedInOSPlatformAttribute : OSPlatformAttribute
+ {
+ public ObsoletedInOSPlatformAttribute(string platformName) : base(platformName)
+ {
+ }
+ public ObsoletedInOSPlatformAttribute(string platformName, string? message) : base(platformName)
+ {
+ Message = message;
+ }
+ public string? Message { get; }
+ public string? Url { get; set; }
}
///
diff --git a/src/libraries/System.Runtime/ref/System.Runtime.cs b/src/libraries/System.Runtime/ref/System.Runtime.cs
index 07abb8a23199f1..b30665c2d7f981 100644
--- a/src/libraries/System.Runtime/ref/System.Runtime.cs
+++ b/src/libraries/System.Runtime/ref/System.Runtime.cs
@@ -13437,6 +13437,14 @@ public FrameworkName(string identifier, System.Version version, string? profile)
public static bool operator !=(System.Runtime.Versioning.FrameworkName? left, System.Runtime.Versioning.FrameworkName? right) { throw null; }
public override string ToString() { throw null; }
}
+ [System.AttributeUsageAttribute(System.AttributeTargets.Assembly | System.AttributeTargets.Class | System.AttributeTargets.Constructor | System.AttributeTargets.Enum | System.AttributeTargets.Event | System.AttributeTargets.Field | System.AttributeTargets.Interface | System.AttributeTargets.Method | System.AttributeTargets.Module | System.AttributeTargets.Property | System.AttributeTargets.Struct, AllowMultiple=true, Inherited=false)]
+ public sealed partial class ObsoletedInOSPlatformAttribute : System.Runtime.Versioning.OSPlatformAttribute
+ {
+ public ObsoletedInOSPlatformAttribute(string platformName) : base(platformName) { }
+ public ObsoletedInOSPlatformAttribute(string platformName, string? message) : base(platformName) { }
+ public string? Message { get { throw null; } }
+ public string? Url { get { throw null; } set {} }
+ }
public abstract partial class OSPlatformAttribute : System.Attribute
{
private protected OSPlatformAttribute(string platformName) { }
@@ -13503,6 +13511,8 @@ public TargetPlatformAttribute(string platformName) : base(platformName) { }
public sealed partial class UnsupportedOSPlatformAttribute : System.Runtime.Versioning.OSPlatformAttribute
{
public UnsupportedOSPlatformAttribute(string platformName) : base(platformName) { }
+ public UnsupportedOSPlatformAttribute(string platformName, string? message) : base(platformName) { }
+ public string? Message { get { throw null; } }
}
[System.AttributeUsageAttribute(System.AttributeTargets.Field | System.AttributeTargets.Method | System.AttributeTargets.Property, AllowMultiple=true, Inherited=false)]
public sealed partial class UnsupportedOSPlatformGuardAttribute : System.Runtime.Versioning.OSPlatformAttribute
diff --git a/src/libraries/System.Runtime/tests/System/Runtime/Versioning/OSPlatformAttributeTests.cs b/src/libraries/System.Runtime/tests/System/Runtime/Versioning/OSPlatformAttributeTests.cs
index 332a98e40dadf2..619bdc7c8f1134 100644
--- a/src/libraries/System.Runtime/tests/System/Runtime/Versioning/OSPlatformAttributeTests.cs
+++ b/src/libraries/System.Runtime/tests/System/Runtime/Versioning/OSPlatformAttributeTests.cs
@@ -28,6 +28,19 @@ public void TestUnsupportedOSPlatformAttribute(string platformName)
var tpa = new UnsupportedOSPlatformAttribute(platformName);
Assert.Equal(platformName, tpa.PlatformName);
+ Assert.Null(tpa.Message);
+ }
+
+ [Theory]
+ [InlineData("Windows8.0", "Message in a bottle")]
+ [InlineData("Android4.1", "Message on a pigeon")]
+ [InlineData("", null)]
+ public void TestUnsupportedOSPlatformAttributeWithMessage(string platformName, string? message)
+ {
+ var tpa = new UnsupportedOSPlatformAttribute(platformName, message);
+
+ Assert.Equal(platformName, tpa.PlatformName);
+ Assert.Equal(message, tpa.Message);
}
[Theory]
@@ -41,6 +54,29 @@ public void TestSupportedOSPlatformAttribute(string platformName)
Assert.Equal(platformName, tpa.PlatformName);
}
+ [Theory]
+ [InlineData("Windows8.0")]
+ [InlineData("Android4.1")]
+ [InlineData("")]
+ public void TestObsoletedInOSPlatformAttribute(string platformName)
+ {
+ var tpa = new ObsoletedInOSPlatformAttribute(platformName);
+
+ Assert.Equal(platformName, tpa.PlatformName);
+ }
+
+ [Theory]
+ [InlineData("Windows8.0", "Message in a bottle")]
+ [InlineData("Android4.1", "Message on a pigeon")]
+ [InlineData("", null)]
+ public void TestObsoletedInOSPlatformAttributeWithMessage(string platformName, string? message)
+ {
+ var tpa = new ObsoletedInOSPlatformAttribute(platformName, message);
+
+ Assert.Equal(platformName, tpa.PlatformName);
+ Assert.Equal(message, tpa.Message);
+ }
+
[Theory]
[InlineData("Windows8.0")]
[InlineData("Android4.1")]