プラットフォヌム互換性アナラむザヌ

.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")属性付き)。
  • 指定されたプラットフォヌムおよびそのサブセットずなるプラットフォヌムでは[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
        }
    }
    
  • 新しいnetstandard API を䜿甚できない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
}

こちらも参照ください