Note
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãµã€ã³ã€ã³ãŸãã¯ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ èŠã§ãã ãã£ã¬ã¯ããªã®å€æŽã詊ãããšãã§ããŸãã
.NET ã¯ãããããçš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åäžã®çµ±åãã©ãããã©ãŒã ã§ãã ããã¯ã.NET ã®ããŸããŸãªçš®é¡ã«ã€ããŠæšè«ããå¿ èŠã¯ãããŸããããåºã«ãªããªãã¬ãŒãã£ã³ã° ã·ã¹ãã (OS) ãå®å šã«æœè±¡åããããšããªããšã¯ã¹ããªãšã³ã¹ãæäŸããããåªããŠããŸãã åŒãç¶ããã©ãããã©ãŒã åºæã® API (P/Invokes ã WinRT ãªã©) ãåŒã³åºãããšãã§ããŸãã
ãã ããã³ã³ããŒãã³ãã§ãã©ãããã©ãŒã åºæã® API ã䜿çšãããšããã¹ãŠã®ãã©ãããã©ãŒã ã§ã³ãŒããæ©èœããªããªããŸãã ãã©ãããã©ãŒã äºææ§ã¢ãã©ã€ã¶ãŒãšè£å® API ã¯ãå¿ èŠã«å¿ããŠãã©ãããã©ãŒã åºæã® API ãèå¥ããŠäœ¿çšããã®ã«åœ¹ç«ã€èšºæãæäŸããŸãã
è£å®ç㪠API ã¯æ¬¡ã®ãšããã§ãã
- SupportedOSPlatformAttribute API ã«ãã©ãããã©ãŒã åºæã®æ³šéãä»ããç¹å®ã® OS ã§ãµããŒããããŠããªã API ã«æ³šéãä»ãã UnsupportedOSPlatformAttribute ã ãããã®å±æ§ã«ã¯ãå¿ èŠã«å¿ããŠããŒãžã§ã³çªå·ãå«ããããšãã§ããŸãããŸããã³ã¢ .NET ã©ã€ãã©ãªã®äžéšã®ãã©ãããã©ãŒã åºæã® API ã«æ¢ã«é©çšãããŠããŸãã
-
Is<Platform>()ã¯ã©ã¹ã®Is<Platform>VersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)åã³System.OperatingSysteméçã¡ãœããã¯ããã©ãããã©ãŒã åºæã®APIãå®å šã«åŒã³åºãããã«äœ¿çšãããŸãã ããšãã°ã OperatingSystem.IsWindows() ã䜿çšã㊠Windows åºæã® API ã®åŒã³åºããä¿è·ãã OperatingSystem.IsWindowsVersionAtLeast() ã䜿çšããŠããŒãžã§ã³ç®¡çããã Windows åºæã® API åŒã³åºããä¿è·ã§ããŸãã ãããã®ã¡ãœãã ã ãã©ãããã©ãŒã åºæã® API åç §ã®ä¿è·ãšããŠäœ¿çšããæ¹æ³ã®äŸãåç §ããŠãã ããã
[åææ¡ä»¶]
ãã©ãããã©ãŒã äºææ§ã¢ãã©ã€ã¶ãŒã¯ãRoslyn ã³ãŒãå質ã¢ãã©ã€ã¶ãŒã® 1 ã€ã§ãã ãããã®ã¢ãã©ã€ã¶ãŒã¯ ã.NET SDK ã«å«ãŸããŠããŸãã ãã©ãããã©ãŒã äºææ§ã¢ãã©ã€ã¶ãŒã¯ã net5.0 以éã®ããŒãžã§ã³ã察象ãšãããããžã§ã¯ãã«å¯ŸããŠã®ã¿ãæ¢å®ã§æå¹ã«ãªã£ãŠããŸãã ãã ããä»ã®ãã¬ãŒã ã¯ãŒã¯ã察象ãšãããããžã§ã¯ãã§ æå¹ã« ããããšã¯ã§ããŸãã
ã¢ãã©ã€ã¶ãŒããã©ãããã©ãŒã ã®äŸåé¢ä¿ã決å®ããæ¹æ³
åž°å±ãããŠããªã API ã¯ããã¹ãŠã® OS ãã©ãããã©ãŒã ã§åäœãããšèŠãªãããŸãã
[SupportedOSPlatform("platform")]ã§ããŒã¯ããã API ã¯ãæå®ããããã©ãããã©ãŒã ãšãã®ãµãã»ããã§ãããã©ãããã©ãŒã ã«ã®ã¿ç§»æ€å¯èœãšèŠãªãããŸãã- 屿§ãè€æ°åé©çšããŠããªã©ã
[SupportedOSPlatform("windows"), SupportedOSPlatform("Android29.0")]ã瀺ãããšãã§ããŸãã - ãã©ãããã©ãŒã ã å¥ã®ãã©ãããã©ãŒã ã®ãµãã»ããã§ããå Žåã屿§ã¯ã¹ãŒããŒã»ãã ãã©ãããã©ãŒã ããµããŒããããŠããããšãæå³ããŸãã ããšãã°ã
[SupportedOSPlatform("iOS")]ã¯ãiOSããã³ã¹ãŒããŒã»ãã ãã©ãããã©ãŒã (MacCatalyst) ã§ã API ããµããŒããããŠããããšãæå³ããŸãã - ãã©ãããã©ãŒã åºæã® API ãé©åãªãã©ãããã©ãŒã ã³ã³ããã¹ããªãã§åç
§ãããŠããå Žåãã¢ãã©ã€ã¶ãŒã¯èŠåãçæããŸãã
- ãããžã§ã¯ãããµããŒããããŠãããã©ãããã©ãŒã ãã¿ãŒã²ããã«ããŠããªãå Žåã«èŠåããŸã (ããšãã°ãiOS
<TargetFramework>net5.0-ios14.0</TargetFramework>ãã¿ãŒã²ãããšãããããžã§ã¯ãããåŒã³åºããã Windows åºæã® API)ã - ãããžã§ã¯ããã¯ãã¹ãã©ãããã©ãŒã ã§ããããã©ãããã©ãŒã åºæã® API (ããšãã°ãã¯ãã¹ ãã©ãããã©ãŒã TFM ããåŒã³åºããã Windows åºæã® API) ãåŒã³åºãå Žåã«
<TargetFramework>net5.0</TargetFramework>ããŸãã - ãã©ãããã©ãŒã åºæã® API ããæå®ããããã©ãããã©ãŒã ã®ããããã察象ãšãããããžã§ã¯ãå
ã§åç
§ãããŠããå Žåã¯èŠåããŸãã (ããšãã°ãWindows
<TargetFramework>net5.0-windows</TargetFramework>ãã¿ãŒã²ãããšãããããžã§ã¯ãããåŒã³åºããã Windows åºæã® API ã®å Žåãããããžã§ã¯ãã«å¯ŸããŠAssemblyInfo.csãã¡ã€ã«ã®çæãæå¹ã«ãªã£ãŠããå Žåãªã©)ã - ãã©ãããã©ãŒã åºæã® API åŒã³åºãã察å¿ãããã©ãããã©ãŒã ãã§ã㯠ã¡ãœãã (ããšãã°ãã«ãã£ãŠä¿è·ããã Windows åºæã® API åŒã³åºã) ã«ãã£ãŠä¿è·ãããŠããå Žåã¯
OperatingSystem.IsWindows()ã - ãã©ãããã©ãŒã åºæã® API ãåããã©ãããã©ãŒã åºæã®ã³ã³ããã¹ãããåç
§ãããŠããå Žåã¯èŠåããŸãã (åŒã³åºããµã€ãã
[SupportedOSPlatform("platform")屿§ä»ã)ã
- ãããžã§ã¯ãããµããŒããããŠãããã©ãããã©ãŒã ãã¿ãŒã²ããã«ããŠããªãå Žåã«èŠåããŸã (ããšãã°ãiOS
- 屿§ãè€æ°åé©çšããŠããªã©ã
æå®ããããã©ãããã©ãŒã ããã³ãã®ãµãã»ãããšãªããã©ãããã©ãŒã ã§ã¯
[UnsupportedOSPlatform("platform")]ã§ããŒã¯ãããAPIã¯ãµããŒããããŠããªããšèŠãªãããŸããããã®ä»ãã¹ãŠã®ãã©ãããã©ãŒã ã§ã¯ãµããŒããããŠããŸãã- 屿§ã¯ã
[UnsupportedOSPlatform("iOS"), UnsupportedOSPlatform("Android29.0")]ãªã©ãç°ãªããã©ãããã©ãŒã ã§è€æ°åé©çšã§ããŸãã - ãã©ãããã©ãŒã ã å¥ã®ãã©ãããã©ãŒã ã®ãµãã»ããã§ããå Žåã屿§ã¯ã¹ãŒããŒã»ãã ãã©ãããã©ãŒã ããµããŒããããŠããªãããšãæå³ããŸãã ããšãã°ã
[UnsupportedOSPlatform("iOS")]ã¯ãiOSããã³ã¹ãŒããŒã»ãã ãã©ãããã©ãŒã (MacCatalyst) ã§ã API ããµããŒããããŠããªãããšãæå³ããŸãã - ã¢ãã©ã€ã¶ãŒã¯ãåŒã³åºããµã€ãã«å¯ŸããŠãæå¹ãªå Žåã«ã®ã¿
platformãçæããŸãããããžã§ã¯ãããµããŒããããŠããªããšå±æ§ä»ãããããã©ãããã©ãŒã ãã¿ãŒã²ããã«ããŠããå Žåã«èŠåããŸã (ããšãã°ãAPI ã
[UnsupportedOSPlatform("windows")]ã§å±æ§ä»ããããåŒã³åºããµã€ãã<TargetFramework>net5.0-windows</TargetFramework>ãã¿ãŒã²ãããšããå Žå)ããããžã§ã¯ããè€æ°ã¿ãŒã²ããã§ããæ¢å®ã®
platformé ç®ã°ã«ãŒãã«å«ãŸããŠããå ŽåããŸãã¯<SupportedPlatform>ãplatformé ç®ã°ã«ãŒãã«æåã§å«ãŸããŠããå Žåã«MSBuildããŸãã<ItemGroup> <SupportedPlatform Include="platform" /> </ItemGroup>ãµããŒããããŠããªããã©ãããã©ãŒã ãã¿ãŒã²ããã«ããŠããªãã¢ããªããã«ãã¿ãŒã²ããã¢ããªãæ§ç¯ããŠããŠããã®ãã©ãããã©ãŒã ãæ¢å®ã® é ç®ã°ã«ãŒãã«å«ãŸããŠããªãå Žåã¯
<SupportedPlatform>ã衚瀺ããŸããã
- 屿§ã¯ã
ã©ã¡ãã®å±æ§ãããã©ãããã©ãŒã åã®äžéšãšããŠããŒãžã§ã³çªå·ãå«ããŠããå«ããªããŠãã€ã³ã¹ã¿ã³ã¹åã§ããŸãã ããŒãžã§ã³çªå·ã¯
major.minor[.build[.revision]]ã®åœ¢åŒã§ããmajor.minorãå¿ èŠã§ãããbuildãšrevisionã®éšåã¯çç¥å¯èœã§ãã ããšãã°ã"Windows6.1" 㯠Windows ããŒãžã§ã³ 6.1 ã瀺ããŸããã"Windows" 㯠Windows 0.0 ãšè§£éãããŸãã
詳现ã«ã€ããŠã¯ã 屿§ã®åäœãšåå ãšãªã蚺æã®äŸãåç §ããŠãã ããã
ã¢ãã©ã€ã¶ãŒã TFM ã¿ãŒã²ãã ãã©ãããã©ãŒã ãèªèããæ¹æ³
ã¢ãã©ã€ã¶ãŒã¯ãMSBuild ããããã£ãã <TargetFramework> ã <TargetFrameworks> ãªã©ã®ã¿ãŒã²ãã ãã¬ãŒã ã¯ãŒã¯ ã¢ãã«ãŒ (TFM) ã¿ãŒã²ãã ãã©ãããã©ãŒã ããã§ãã¯ããŸããã TFM ã«ã¿ãŒã²ãã ãã©ãããã©ãŒã ãããå ŽåãMSBuild ã¯ã¿ãŒã²ãã ãã©ãããã©ãŒã åãæã€ SupportedOSPlatform 屿§ã AssemblyInfo.cs ãã¡ã€ã«ã«æ¿å
¥ããŸããããã¯ã¢ãã©ã€ã¶ãŒã«ãã£ãŠäœ¿çšãããŸãã ããšãã°ãTFM ã net5.0-windows10.0.19041ãããŠããå ŽåãMSBuild ã«ãã£ãŠ [assembly: System.Runtime.Versioning.SupportedOSPlatform("windows10.0.19041")] 屿§ã AssemblyInfo.cs ãã¡ã€ã«ã«æ¿å
¥ãããã¢ã»ã³ããªå
šäœã Windows ã®ã¿ãšèŠãªãããŸãã ãã®ããã7.0 以äžã®ããŒãžã§ã³ã® Windows å°çš API ãåŒã³åºãããå Žåããããžã§ã¯ãã§ã¯èŠåã¯è¡šç€ºãããŸããã
泚
ãããžã§ã¯ãã«å¯Ÿ ããŠAssemblyInfo.cs ãã¡ã€ã«ã®çæãç¡å¹ã«ãªã£ãŠããå Žå (ã€ãŸãã <GenerateAssemblyInfo> ããããã£ã false ã«èšå®ãããŠããå Žå)ãå¿
èŠãªã¢ã»ã³ã㪠ã¬ãã« SupportedOSPlatform 屿§ã MSBuild ã§è¿œå ããããšã¯ã§ããŸããã ãã®å Žåããã®ãã©ãããã©ãŒã ãã¿ãŒã²ãããšããŠããã«ããããããããã©ãããã©ãŒã åºæã® API ã®äœ¿çšã«é¢ããèŠåã衚瀺ãããããšããããŸãã ãã®èŠåã¯ãAssemblyInfo.cs ãã¡ã€ã«ã®çæãæå¹ã«ããããèªåã®ãããžã§ã¯ãã«å±æ§ãæåã§è¿œå ããããšã«ãã£ãŠè§£æ±ºã§ããŸãã
ãã©ãããã©ãŒã ãžã®åå ¥
.NET 6 ã§ã¯ã1 ã€ã®ãã©ãããã©ãŒã ãå¥ã®ãã©ãããã©ãŒã ã®ãµãã»ããã«ããããšãã§ãããã©ãããã©ãŒã ã€ã³ã¯ã«ãŒãžã§ã³ã®æŠå¿µãå°å
¥ãããŸããã ãµãã»ãã ãã©ãããã©ãŒã ã®æ³šéã¯ãã¹ãŒããŒã»ãã ãã©ãããã©ãŒã ã«å¯ŸããŠåããµããŒã (ãŸãã¯ãã®æ¬ åŠ) ãæå³ããŸãã
OperatingSystemåã®ãã©ãããã©ãŒã ãã§ã㯠ã¡ãœããã«SupportedOSPlatformGuard("supersetPlatform")]屿§ãããå ŽåãsupersetPlatformã¯ãã¡ãœããããã§ãã¯ãã OS ãã©ãããã©ãŒã ã®ã¹ãŒããŒã»ãããšèŠãªãããŸãã
ããšãã°ã OperatingSystem.IsIOS() ã¡ãœãã㯠[SupportedOSPlatformGuard("MacCatalyst")]屿§ä»ãã§ãã ãããã£ãŠã次ã®ã¹ããŒãã¡ã³ããé©çšãããŸãã
-
OperatingSystem.IsIOS()ã¡ãœãããšOperatingSystem.IsIOSVersionAtLeastã¡ãœããã¯ã
iOSãã©ãããã©ãŒã ã ãã§ãªããMacCatalystãã©ãããã©ãŒã ããã§ãã¯ããŸãã -
[SupportedOSPlatform("iOS")]ã¯ãAPI ãiOSããã³ã¹ãŒããŒã»ãã ãã©ãããã©ãŒã ã®MacCatalystã§ãµããŒããããŠããããšãæå³ããŸãã ãã®æé»çãªãµããŒããé€å€ããã«ã¯ã[UnsupportedOSPlatform("MacCatalyst")]屿§ã䜿çšã§ããŸãã -
[UnsupportedOSPlatform("iOS")ã¯ãAPI ãiOSããã³MacCatalystã§ãµããŒããããŠããªãããšãæå³ããŸãã ãã®æé»çãªãµããŒãäžè¶³ãé€å€ããã«ã¯ã[SupportedOSPlatform("MacCatalyst")]屿§ã䜿çšã§ããŸãã
次ã®ã«ãã¬ããž ãããªãã¯ã¹ã«ã€ããŠèããŠã¿ãŸããããããã§âïžããã©ãããã©ãŒã ããµããŒããããŠããããšã瀺ãã â ã¯ãã©ãããã©ãŒã ããµããŒã ãããŠããªãããš ã瀺ããŸãã
| ãã©ããããŒã | SupportedOSPlatform(subset) |
SupportedOSPlatform(superset) |
UnsupportedOSPlatform(subset) |
UnsupportedOSPlatform(superset) |
|---|---|---|---|---|
| ãµãã»ãã | âïž | â | âïž | â |
| ã¹ãŒããŒã»ãã | âïž | âïž | âïž | âïž |
ãã³ã
SupportedOSPlatformGuard屿§ãšUnsupportedOSPlatformGuard屿§ã«ãåãèŠåãé©çšãããŸãã
次ã®ã³ãŒã ã¹ããããã¯ã屿§ãçµã¿åãããŠé©åãªã¬ãã«ã®ãµããŒããèšå®ããæ¹æ³ã瀺ããŠããŸãã
// MacCatalyst is a superset of iOS therefore supported on iOS and MacCatalyst
[SupportedOSPlatform("iOS")]
public void ApiOnlySupportedOnIOSAndMacCatalyst() { }
// Does not imply iOS, only supported on MacCatalyst
[SupportedOSPlatform("MacCatalyst")]
public void ApiOnlySupportedOnMacCatalyst() { }
[SupportedOSPlatform("iOS")] // Supported on iOS and MacCatalyst
[UnsupportedOSPlatform("MacCatalyst")] // Removes implied MacCatalyst support
public void ApiOnlySupportedOnIos() { }
// Unsupported on iOS and MacCatalyst
[UnsupportedOSPlatform("iOS")]
public void ApiUnsupportedOnIOSAndMacCatalyst();
// Does not imply iOS, only unsupported on MacCatalyst
[UnsupportedOSPlatform("MacCatalyst")]
public void ApiUnsupportedOnMacCatalyst() { }
[UnsupportedOSPlatform("iOS")] // Unsupported on iOS and MacCatalyst
[SupportedOSPlatform("MacCatalyst")] // Removes implied MacCatalyst unsupportedness
public void ApiUnsupportedOnIos() { }
屿§ã®çµã¿åããã®é«åºŠãªã·ããªãª
[SupportedOSPlatform]屿§ãš[UnsupportedOSPlatform]屿§ã®çµã¿åãããååšããå Žåããã¹ãŠã®å±æ§ã¯ OS ãã©ãããã©ãŒã èå¥åã«ãã£ãŠã°ã«ãŒãåãããŸãããµããŒããããŠããäžèЧã®ã¿ã å OS ãã©ãããã©ãŒã ã®æå°ããŒãžã§ã³ã
[SupportedOSPlatform]屿§ã§ããå Žåããã® API ã¯ãªã¹ãã«å«ãŸããŠãããã©ãããã©ãŒã ã§ã®ã¿ãµããŒããããä»ã®ãã¹ãŠã®ãã©ãããã©ãŒã ã§ã¯ãµããŒããããªããšèŠãªãããŸãã åãã©ãããã©ãŒã ã®çç¥å¯èœãª[UnsupportedOSPlatform]屿§ã¯ããµããŒããããŠããæå°ããŒãžã§ã³ã®äžäœããŒãžã§ã³ã®ã¿ãæã€ããšãã§ããŸããããã¯ãAPI ãæå®ãããããŒãžã§ã³ããåé€ãããããšã瀺ããŸãã// API is only supported on Windows from version 6.2 to 10.0.19041.0 and all versions of Linux // The API is considered not supported for all other platforms. [SupportedOSPlatform("windows6.2")] [UnsupportedOSPlatform("windows10.0.19041.0")] [SupportedOSPlatform("linux")] public void ApiSupportedFromWindows80SupportFromCertainVersion();ãµããŒã察象å€ã®ã¿ã®ãªã¹ãã å OS ãã©ãããã©ãŒã ã®æå°ããŒãžã§ã³ã
[UnsupportedOSPlatform]屿§ã§ããå Žåããã® API ã¯ãªã¹ãã«å«ãŸããŠãããã©ãããã©ãŒã ã§ã®ã¿ãµããŒãããããä»ã®ãã¹ãŠã®ãã©ãããã©ãŒã ã§ã¯ãµããŒãããããšèŠãªãããŸãã ãã®äžèЧã«ã¯ãåããã©ãããã©ãŒã ã§äžäœããŒãžã§ã³ã®[SupportedOSPlatform]屿§ãæã€ããšãã§ããŸããããã¯ããã®ããŒãžã§ã³ãã API ããµããŒããããŠããããšã瀺ããŸãã// The API is unsupported on all Linux versions was unsupported on Windows until version 10.0.19041.0. // The API is considered supported everywhere else without constraints. [UnsupportedOSPlatform("windows")] [SupportedOSPlatform("windows10.0.19041.0")] [UnsupportedOSPlatform("linux")] public void ApiSupportedFromWindows8UnsupportedFromWindows10();äžæŽåãªãªã¹ãã äžéšã®ãã©ãããã©ãŒã ã§ã®æå°ããŒãžã§ã³ã
[SupportedOSPlatform]ã§ãä»ã®ãã©ãããã©ãŒã ã[UnsupportedOSPlatform]ã®å ŽåãäžäžèŽãšèŠãªãããã¢ãã©ã€ã¶ãŒã§ã¯ãµããŒããããŠããŸããã äžæŽåãçºçããå Žåãã¢ãã©ã€ã¶ãŒã¯[UnsupportedOSPlatform]ãã©ãããã©ãŒã ãç¡èŠããŸãã-
[SupportedOSPlatform]屿§ãš[UnsupportedOSPlatform]屿§ã®æå°ããŒãžã§ã³ãçããå Žåãã¢ãã©ã€ã¶ãŒã¯ãã©ãããã©ãŒã ããµããŒã察象ã®ã¿ã®äžèЧã®äžéšãšèŠãªããŸãã
-
ãã©ãããã©ãŒã 屿§ã¯ãç°ãªããã©ãããã©ãŒã åãŸãã¯ããŒãžã§ã³ãæã€åãã¡ã³ã㌠(ã¡ãœããããã£ãŒã«ããããããã£ãããã³ã€ãã³ã) ããã³ã¢ã»ã³ããªã«é©çšã§ããŸãã
- æäžäœã¬ãã«ã§é©çšããã屿§
targetããã®ãã¹ãŠã®ã¡ã³ããŒãšåã«åœ±é¿ããŸãã - åã¬ãã«ã®å±æ§ã¯ã"åæ³šéã¯ãã©ãããã©ãŒã ã®ãµããŒããçµã蟌ãããšãã§ããŸãããæ¡å€§ããããšã¯ã§ããŸãã" ãšããã«ãŒã«ã«æºæ ããŠããå Žåã«ã®ã¿é©çšãããŸãã
- 芪ã [ãµããŒãã®ã¿] ãªã¹ãã æã£ãŠããå Žåãåã¡ã³ããŒå±æ§ã¯æ°ãããã©ãããã©ãŒã ãµããŒãã远å ã§ããŸãããããã¯èŠªãµããŒããæ¡åŒµãããã®ã§ãã æ°ãããã©ãããã©ãŒã ã®ãµããŒãã¯ã芪èªäœã«ã®ã¿è¿œå ã§ããŸãã ãã ããåãåããã©ãããã©ãŒã ã®ãã以éã®ããŒãžã§ã³ã«å¯ŸããŠ
Supported屿§ãæã€ããšã¯ã§ããŸããããã«ãããµããŒããçµã蟌ãŸããããã§ãã ãŸããåãåããã©ãããã©ãŒã ã§Unsupported屿§ãæã€ããšãã§ããŸãã芪ã®ãµããŒããçµã蟌ãŸããããã§ãã - 芪ã ãµããŒããããŠããªããªã¹ãã®ã¿ã æã£ãŠããå Žåãåã¡ã³ããŒå±æ§ã¯èŠªã®ãµããŒããçµã蟌ããããæ°ãããã©ãããã©ãŒã ã®ãµããŒãã远å ã§ããŸãã ãã ãã芪ãµããŒããæ¡åŒµãããããã芪ãšåããã©ãããã©ãŒã ã®
Supported屿§ãæã€ããšã¯ã§ããŸããã åããã©ãããã©ãŒã ã®ãµããŒãã¯ãå ã®Unsupported屿§ãé©çšããã芪ã«ã®ã¿è¿œå ã§ããŸãã
- 芪ã [ãµããŒãã®ã¿] ãªã¹ãã æã£ãŠããå Žåãåã¡ã³ããŒå±æ§ã¯æ°ãããã©ãããã©ãŒã ãµããŒãã远å ã§ããŸãããããã¯èŠªãµããŒããæ¡åŒµãããã®ã§ãã æ°ãããã©ãããã©ãŒã ã®ãµããŒãã¯ã芪èªäœã«ã®ã¿è¿œå ã§ããŸãã ãã ããåãåããã©ãããã©ãŒã ã®ãã以éã®ããŒãžã§ã³ã«å¯ŸããŠ
-
[SupportedOSPlatform("platformVersion")]ãåãplatformåã® API ã«è€æ°åé©çšãããå Žåãã¢ãã©ã€ã¶ãŒã¯æå°ããŒãžã§ã³ã® API ã®ã¿ãèæ ®ããŸãã -
[UnsupportedOSPlatform("platformVersion")]ãåãplatformåãæã€ API ã«å¯Ÿã㊠2 å以äžé©çšãããå Žåãã¢ãã©ã€ã¶ãŒã¯æãå€ãããŒãžã§ã³ã® 2 ã€ã®ã¿ãèæ ®ããŸãã
泚
æåã¯ãµããŒããããŠããããæ°ããããŒãžã§ã³ã§ã¯ãµããŒããããŠããªã (åé€ããã) API ã¯ããã以éã®ããŒãžã§ã³ã§ã¯åãµããŒããããŸããã
- æäžäœã¬ãã«ã§é©çšããã屿§
屿§ã®ããã¿ãšã屿§ã«ãã£ãŠçæããã蚺æã®äŸ
// An API supported only on Windows all versions.
[SupportedOSPlatform("Windows")]
public void WindowsOnlyApi() { }
// an API supported on Windows and Linux.
[SupportedOSPlatform("Windows")]
[SupportedOSPlatform("Linux")]
public void SupportedOnWindowsAndLinuxOnly() { }
// an API only supported on Windows 6.2 and later, not supported for all other.
// an API is removed/unsupported from version 10.0.19041.0.
[SupportedOSPlatform("windows6.2")]
[UnsupportedOSPlatform("windows10.0.19041.0")]
public void ApiSupportedFromWindows8UnsupportedFromWindows10() { }
// an Assembly supported on Windows, the API added from version 10.0.19041.0.
[assembly: SupportedOSPlatform("Windows")]
[SupportedOSPlatform("windows10.0.19041.0")]
public void AssemblySupportedOnWindowsApiSupportedFromWindows10() { }
public void Caller()
{
WindowsOnlyApi(); // warns: This call site is reachable on all platforms. 'WindowsOnlyApi()' is only supported on: 'windows'
// This call site is reachable on all platforms. 'SupportedOnWindowsAndLinuxOnly()' is only supported on: 'Windows', 'Linux'
SupportedOnWindowsAndLinuxOnly();
// This call site is reachable on all platforms. 'ApiSupportedFromWindows8UnsupportedFromWindows10()' is only supported on: 'windows' from version 6.2 to 10.0.19041.0
ApiSupportedFromWindows8UnsupportedFromWindows10();
// for same platform analyzer only warn for the latest version.
// This call site is reachable on all platforms. 'AssemblySupportedOnWindowsApiSupportedFromWindows10()' is only supported on: 'windows' 10.0.19041.0 and later
AssemblySupportedOnWindowsApiSupportedFromWindows10();
}
// an API not supported on android but supported on all other.
[UnsupportedOSPlatform("android")]
public void DoesNotWorkOnAndroid() { }
// an API was unsupported on Windows until version 6.2.
// The API is considered supported everywhere else without constraints.
[UnsupportedOSPlatform("windows")]
[SupportedOSPlatform("windows6.2")]
public void StartedWindowsSupportFromVersion8() { }
// an API was unsupported on Windows until version 6.2.
// Then the API is removed (unsupported) from version 10.0.19041.0.
// The API is considered supported everywhere else without constraints.
[UnsupportedOSPlatform("windows")]
[SupportedOSPlatform("windows6.2")]
[UnsupportedOSPlatform("windows10.0.19041.0")]
public void StartedWindowsSupportFrom8UnsupportedFrom10() { }
public void Caller2()
{
DoesNotWorkOnAndroid(); // This call site is reachable on all platforms.'DoesNotWorkOnAndroid()' is unsupported on: 'android'
// This call site is reachable on all platforms. 'StartedWindowsSupportFromVersion8()' is unsupported on: 'windows' 6.2 and before.
StartedWindowsSupportFromVersion8();
// This call site is reachable on all platforms. 'StartedWindowsSupportFrom8UnsupportedFrom10()' is supported on: 'windows' from version 6.2 to 10.0.19041.0
StartedWindowsSupportFrom8UnsupportedFrom10();
}
å ±åãããèŠåãåŠçãã
ãããã®èšºæã«å¯ŸåŠããããã«æšå¥šãããæ¹æ³ã¯ãé©åãªãã©ãããã©ãŒã ã§å®è¡ãããŠããå Žåã«ã®ã¿ãã©ãããã©ãŒã åºæã® API ãåŒã³åºãæ¹æ³ã§ãã èŠåã«å¯ŸåŠããããã«äœ¿çšã§ãããªãã·ã§ã³ã次ã«ç€ºããŸããç¶æ³ã«æãé©ããæ¹ãéžæããŸãã
åŒã³åºããä¿è·ããŸãã ãããå®çŸããã«ã¯ãå®è¡æã«ã³ãŒããæ¡ä»¶ä»ãã§åŒã³åºããŸãã
PlatformãOperatingSystem.Is<Platform>()ãªã©ããã©ãããã©ãŒã ãã§ãã¯ã®ããããã®æ¹æ³ã䜿çšããŠãç®çã®OperatingSystem.Is<Platform>VersionAtLeast(int major, int minor = 0, int build = 0, int revision = 0)ã§å®è¡ããŠãããã©ããã確èªããŸãã äŸãé話ãµã€ãããã©ãããã©ãŒã åºæãšããŠããŒã¯ããŸãã ãŸããç¬èªã® API ããã©ãããã©ãŒã åºæãšããŠããŒã¯ããããšãã§ããŸãããã®ãããèŠä»¶ãåŒã³åºãå ã«å¹æçã«è»¢éããã ãã§ãã åç §å ã®ãã©ãããã©ãŒã äŸååŒã³åºããšåã屿§ã䜿çšããŠãå å«ã¡ãœãããŸãã¯åããŸãã¯ã¢ã»ã³ããªå šäœãããŒã¯ããŸãã äŸã
ãã©ãããã©ãŒã ãã§ãã¯ã䜿çšããŠåŒã³åºããµã€ããã¢ãµãŒãããŸãã å®è¡æã«è¿œå ã®
ifã¹ããŒãã¡ã³ãã®ãªãŒããŒããããäžèŠãªå Žåã¯ã Debug.Assert(Boolean)ã䜿çšããŸãã äŸãã³ãŒããåé€ããŸãã äžè¬ã«ãWindows ãŠãŒã¶ãŒãã³ãŒãã䜿çšãããšå¿ 宿§ã倱ãããããšãæå³ãããããå¿ èŠãªãã®ã§ã¯ãããŸããã ã¯ãã¹ãã©ãããã©ãŒã ã®ä»£æ¿ææ®µãååšããå Žåã¯ããã©ãããã©ãŒã åºæã® API ããããã®ä»£æ¿ææ®µã䜿çšããããšããå§ãããŸãã
èŠåãæå¶ããŸãã EditorConfig ãšã³ããªãŸãã¯
#pragma warning disable CA1416ã䜿çšããŠãèŠåãæå¶ããããšãã§ããŸãã ãã ãããã®ãªãã·ã§ã³ã¯ããã©ãããã©ãŒã åºæã® API ã䜿çšããå Žåã®æåŸã®ææ®µã§ããå¿ èŠããããŸãããã³ã
#pragmaããªã³ã³ãã€ã© ãã£ã¬ã¯ãã£ãã䜿çšããŠèŠåãç¡å¹ã«ãããšãã¿ãŒã²ãããšããèå¥åã®å€§æåãšå°æåãåºå¥ãããŸãã ããšãã°ãca1416ã¯å®éã«ã¯èŠå CA1416 ãç¡å¹ã«ããŸããã
ã¬ãŒã ã¡ãœããã䜿çšããŠãã©ãããã©ãŒã åºæã® API ãä¿è·ãã
ã¬ãŒã ã¡ãœããã®ãã©ãããã©ãŒã åã¯ãåŒã³åºãå ã®ãã©ãããã©ãŒã ã«äŸåãã API ãã©ãããã©ãŒã åãšäžèŽããå¿ èŠããããŸãã åŒã³åºãå API ã®ãã©ãããã©ãŒã æååã«ããŒãžã§ã³ãå«ãŸããŠããå Žå:
[SupportedOSPlatform("platformVersion")]屿§ã®å Žåãã¬ãŒã ã¡ãœãã ãã©ãããã©ãŒã ã®versionã¯ãåŒã³åºãå ã®ãã©ãããã©ãŒã ã®Version以äžã§ããå¿ èŠããããŸãã[UnsupportedOSPlatform("platformVersion")]屿§ã®å Žåãã¬ãŒã ã¡ãœããã®ãã©ãããã©ãŒãversionã¯ãåŒã³åºãå ã®ãã©ãããã©ãŒã ã®Version以äžã«ããå¿ èŠããããŸããpublic void CallingSupportedOnlyApis() // Allow list calls { if (OperatingSystem.IsWindows()) { WindowsOnlyApi(); // will not warn } if (OperatingSystem.IsLinux()) { SupportedOnWindowsAndLinuxOnly(); // will not warn, within one of the supported context } // Can use &&, || logical operators to guard combined attributes if (OperatingSystem.IsWindowsVersionAtLeast(6, 2) && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 19041))) { ApiSupportedFromWindows8UnsupportedFromWindows10(); } if (OperatingSystem.IsWindowsVersionAtLeast(10, 0, 19041, 0)) { AssemblySupportedOnWindowsApiSupportedFromWindows10(); // Only need to check latest supported version } } public void CallingUnsupportedApis() { if (!OperatingSystem.IsAndroid()) { DoesNotWorkOnAndroid(); // will not warn } if (!OperatingSystem.IsWindows() || OperatingSystem.IsWindowsVersionAtLeast(6, 2)) { StartedWindowsSupportFromVersion8(); // will not warn } if (!OperatingSystem.IsWindows() || // supported all other platforms (OperatingSystem.IsWindowsVersionAtLeast(6, 2) && !OperatingSystem.IsWindowsVersionAtLeast(10, 0, 19041))) { StartedWindowsSupportFrom8UnsupportedFrom10(); // will not warn } }æ°ãã
netstandardAPI ã䜿çšã§ããªãnetcoreappãŸãã¯OperatingSystemã察象ãšããã³ãŒããä¿è·ããå¿ èŠãããå Žåã¯ãRuntimeInformation.IsOSPlatform API ã䜿çšã§ããã¢ãã©ã€ã¶ãŒã«ãã£ãŠå°éãããŸãã ãã ãã OperatingSystemã§è¿œå ãããæ°ãã API ã»ã©æé©åãããŠããŸããã ãã©ãããã©ãŒã ã OSPlatform æ§é äœã§ãµããŒããããŠããªãå Žåã¯ã OSPlatform.Create(String) ãåŒã³åºããŠãã©ãããã©ãŒã åãæž¡ãããšãã§ããŸããããã¯ã¢ãã©ã€ã¶ãŒãèæ ®ããŸããpublic void CallingSupportedOnlyApis() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { SupportedOnWindowsAndLinuxOnly(); // will not warn } if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("browser"))) { ApiOnlySupportedOnBrowser(); // call of browser specific API } }
ãã©ãããã©ãŒã ã¬ãŒã屿§ã䜿çšã㊠API ã«æ³šéãä»ããã«ã¹ã¿ã ã¬ãŒããšããŠäœ¿çšãã
åã«ç€ºããããã«ãã¢ãã©ã€ã¶ãŒã¯ãOperatingSystemãªã©ã®OperatingSystem.IsWindowsåã®ãã©ãããã©ãŒã ã¬ãŒãéçã¡ãœãããšRuntimeInformation.IsOSPlatformãèªèããŸãã ãã ããã¬ãŒãã®çµæããã£ãŒã«ãã«ãã£ãã·ã¥ããŠåå©çšããããã«ã¹ã¿ã ã¬ãŒã ã¡ãœããã䜿çšããŠãã©ãããã©ãŒã ã確èªãããã§ããŸãã ã¢ãã©ã€ã¶ãŒã¯ããã®ãã㪠API ãã«ã¹ã¿ã ã¬ãŒããšããŠèªèããå¿
èŠãããããããã® API ã«ãã£ãŠä¿è·ãããŠãã API ã«å¯ŸããŠèŠåã衚瀺ããªãããã«ããå¿
èŠããããŸãã ãã®ã·ããªãªããµããŒãããããã«ã.NET 6 ã§ã¬ãŒã屿§ãå°å
¥ãããŸããã
-
SupportedOSPlatformGuardAttributeã¯ã SupportedOSPlatformAttributeã§æ³šéä»ãããã API ã®ã¬ãŒããšããŠäœ¿çšã§ãã API ã«æ³šéãä»ããŸãã -
UnsupportedOSPlatformGuardAttributeã¯ã UnsupportedOSPlatformAttributeã§æ³šéä»ãããã API ã®ã¬ãŒããšããŠäœ¿çšã§ãã API ã«æ³šéãä»ããŸãã
ãããã®å±æ§ã«ã¯ãå¿ èŠã«å¿ããŠããŒãžã§ã³çªå·ãå«ããããšãã§ããŸãã è€æ°ã®ãã©ãããã©ãŒã ãä¿è·ããããã«è€æ°åé©çšã§ãããã£ãŒã«ããããããã£ããŸãã¯ã¡ãœããã«æ³šéãä»ããããã«äœ¿çšã§ããŸãã
class Test
{
[UnsupportedOSPlatformGuard("browser")] // The platform guard attribute
#if TARGET_BROWSER
internal bool IsSupported => false;
#else
internal bool IsSupported => true;
#endif
[UnsupportedOSPlatform("browser")]
void ApiNotSupportedOnBrowser() { }
void M1()
{
ApiNotSupportedOnBrowser(); // Warns: This call site is reachable on all platforms.'ApiNotSupportedOnBrowser()' is unsupported on: 'browser'
if (IsSupported)
{
ApiNotSupportedOnBrowser(); // Not warn
}
}
[SupportedOSPlatform("Windows")]
[SupportedOSPlatform("Linux")]
void ApiOnlyWorkOnWindowsLinux() { }
[SupportedOSPlatformGuard("Linux")]
[SupportedOSPlatformGuard("Windows")]
private readonly bool _isWindowOrLinux = OperatingSystem.IsLinux() || OperatingSystem.IsWindows();
void M2()
{
ApiOnlyWorkOnWindowsLinux(); // This call site is reachable on all platforms.'ApiOnlyWorkOnWindowsLinux()' is only supported on: 'Linux', 'Windows'.
if (_isWindowOrLinux)
{
ApiOnlyWorkOnWindowsLinux(); // Not warn
}
}
}
é話ãµã€ãããã©ãããã©ãŒã åºæãšããŠããŒã¯ãã
ãã©ãããã©ãŒã åã¯ãåŒã³åºãå ã®ãã©ãããã©ãŒã äŸå API ãšäžèŽããå¿ èŠããããŸãã ãã©ãããã©ãŒã æååã«ããŒãžã§ã³ãå«ãŸããŠããå Žå:
[SupportedOSPlatform("platformVersion")]屿§ã®å ŽåãåŒã³åºããµã€ã ãã©ãããã©ãŒã ã®versionã¯ãåŒã³åºãå ã®ãã©ãããã©ãŒã ã®ä»¥äžã§ããå¿ èŠããããŸããVersion[UnsupportedOSPlatform("platformVersion")]屿§ã®å ŽåãåŒã³åºããµã€ã ãã©ãããã©ãŒã ã®versionã¯ãåŒã³åºãå ãã©ãããã©ãŒã ã®Version以äžã§ããå¿ èŠããããŸãã// an API supported only on Windows. [SupportedOSPlatform("windows")] public void WindowsOnlyApi() { } // an API supported on Windows and Linux. [SupportedOSPlatform("Windows")] [SupportedOSPlatform("Linux")] public void SupportedOnWindowsAndLinuxOnly() { } // an API only supported on Windows 6.2 and later, not supported for all other. // an API is removed/unsupported from version 10.0.19041.0. [SupportedOSPlatform("windows6.2")] [UnsupportedOSPlatform("windows10.0.19041.0")] public void ApiSupportedFromWindows8UnsupportedFromWindows10() { } // an Assembly supported on Windows, the API added from version 10.0.19041.0. [assembly: SupportedOSPlatform("Windows")] [SupportedOSPlatform("windows10.0.19041.0")] public void AssemblySupportedOnWindowsApiSupportedFromWindows10() { } [SupportedOSPlatform("windows6.2")] // call site attributed Windows 6.2 or above. public void Caller() { WindowsOnlyApi(); // will not warn as call site is for Windows. // will not warn as call site is for Windows all versions. SupportedOnWindowsAndLinuxOnly(); // will not warn for the [SupportedOSPlatform("windows6.2")] attribute, but warns for [UnsupportedOSPlatform("windows10.0.19041.0")] // This call site is reachable on: 'windows' 6.2 and later. 'ApiSupportedFromWindows8UnsupportedFromWindows10()' is unsupported on: 'windows' 10.0.19041.0 and later. ApiSupportedFromWindows8UnsupportedFromWindows10(); // The call site version is lower than the calling version, so warns: // This call site is reachable on: 'windows' 6.2 and later. 'AssemblySupportedOnWindowsApiSupportedFromWindows10()' is only supported on: 'windows' 10.0.19041.0 and later AssemblySupportedOnWindowsApiSupportedFromWindows10(); } [SupportedOSPlatform("windows10.0.22000")] // call site attributed with windows 10.0.22000 or above. public void Caller2() { // This call site is reachable on: 'windows' 10.0.22000 and later. 'ApiSupportedFromWindows8UnsupportedFromWindows10()' is unsupported on: 'windows' 10.0.19041.0 and later. ApiSupportedFromWindows8UnsupportedFromWindows10(); // will not warn as call site version higher than calling API. AssemblySupportedOnWindowsApiSupportedFromWindows10(); } [SupportedOSPlatform("windows6.2")] [UnsupportedOSPlatform("windows10.0.19041.0")] // call site supports Windows from version 6.2 to 10.0.19041.0. public void Caller3() { // will not warn as caller has exact same attributes. ApiSupportedFromWindows8UnsupportedFromWindows10(); // The call site reachable for the version not supported in the calling API, therefore warns: // This call site is reachable on: 'windows' from version 6.2 to 10.0.19041.0. 'AssemblySupportedOnWindowsApiSupportedFromWindows10()' is only supported on: 'windows' 10.0.19041.0 and later. AssemblySupportedOnWindowsApiSupportedFromWindows10(); } // an API not supported on Android but supported on all other. [UnsupportedOSPlatform("android")] public void DoesNotWorkOnAndroid() { } // an API was unsupported on Windows until version 6.2. // The API is considered supported everywhere else without constraints. [UnsupportedOSPlatform("windows")] [SupportedOSPlatform("windows6.2")] public void StartedWindowsSupportFromVersion8() { } // an API was unsupported on Windows until version 6.2. // Then the API is removed (unsupported) from version 10.0.19041.0. // The API is considered supported everywhere else without constraints. [UnsupportedOSPlatform("windows")] [SupportedOSPlatform("windows6.2")] [UnsupportedOSPlatform("windows10.0.19041.0")] public void StartedWindowsSupportFrom8UnsupportedFrom10() { } [UnsupportedOSPlatform("windows")] // Caller no support Windows for any version. public void Caller4() { // This call site is reachable on all platforms.'DoesNotWorkOnAndroid()' is unsupported on: 'android' DoesNotWorkOnAndroid(); // will not warns as the call site not support Windows at all, but supports all other. StartedWindowsSupportFromVersion8(); // same, will not warns as the call site not support Windows at all, but supports all other. StartedWindowsSupportFrom8UnsupportedFrom10(); } [UnsupportedOSPlatform("windows")] [UnsupportedOSPlatform("android")] // Caller not support Windows and Android for any version. public void Caller4() { DoesNotWorkOnAndroid(); // will not warn as call site not supports Android. // will not warns as the call site not support Windows at all, but supports all other. StartedWindowsSupportFromVersion8(); // same, will not warns as the call site not support Windows at all, but supports all other. StartedWindowsSupportFrom8UnsupportedFrom10(); }
ãã©ãããã©ãŒã ãã§ãã¯ã䜿çšããŠåŒã³åºããµã€ããã¢ãµãŒããã
ãã©ãããã©ãŒã ã¬ãŒãã®äŸã§äœ¿çšããããã¹ãŠã®æ¡ä»¶ä»ããã§ãã¯ã¯ãDebug.Assert(Boolean)ã®æ¡ä»¶ãšããŠã䜿çšã§ããŸãã
// An API supported only on Linux.
[SupportedOSPlatform("linux")]
public void LinuxOnlyApi() { }
public void Caller()
{
Debug.Assert(OperatingSystem.IsLinux());
LinuxOnlyApi(); // will not warn
}