Windows 互換機能パックを使用してコードを .NET に移植する

既存のコードを .NET Framework から .NET に移植するときに発生する最も一般的な問題の一部として、.NET Framework のみに存在する API およびテクノロジへの依存があります。 "Windows 互換機能パック" には、このようなテクノロジの多くが用意されているので、.NET アプリケーションと .NET Standard ライブラリをはるかに簡単に構築できます。

互換性パックは論理的な .NET Standard 2.0 の拡張機能であり、API セットが大幅に増加します。 既存のコードは、ほとんど変更されずにコンパイルされます。 "あらゆる .NET 実装で提供される API のセット" でその約束を守るために、レジストリ、Windows Management Instrumentation (WMI)、リフレクション出力 API など、すべてのプラットフォームで動作しないテクノロジは .NET Standard には含まれていません。 Windows 互換機能パックは .NET Standard を基盤とし、これらの Windows 専用のテクノロジにアクセスできるようにします。 .NET に移行したいが、少なくとも最初の手順で Windows に留まることを計画している顧客にとって特に便利です。 このシナリオでは、Windows 専用のテクノロジを使用して、移行の障害を取り除くことができます。

パッケージの内容

Windows 互換機能パックは、Microsoft.Windows.Compatibility NuGet パッケージ経由で提供され、.NET または .NET Standard をターゲットとするプロジェクトから参照できます。

Windows 専用 API やプラットフォーム非依存 API など、約 20,000 の API を提供します。テクノロジ領域には次のものがあります。

  • コード ページ
  • CodeDom
  • 構成
  • ディレクトリ サービス
  • 描画
  • ODBC
  • アクセス許可
  • ポート
  • Windows アクセス制御リスト (ACL)
  • Windows Communication Foundation (WCF)
  • Windows 暗号化
  • Windows EventLog
  • Windows Management Instrumentation (WMI)
  • Windows パフォーマンス カウンター
  • Windows レジストリ
  • Windows ランタイム キャッシュ
  • Windows サービス

詳細については、互換機能パックの仕様に関するページを参照してください。

はじめに

  1. 移植の前に、移植プロセスを確認してください。

  2. .NET または .NET Standard に既存のコードを移植するときに、Microsoft.Windows.Compatibility NuGet パッケージをインストールします。

    Windows に留まる場合、すでに用意はできています。

  3. .NET アプリケーションまたは .NET Standard ライブラリを Linux または macOS で実行する場合は、プラットフォーム互換性アナライザーを使用して、クロスプラットフォームで機能しない API の使用方法を見つけます。

  4. そのような API の使用を取り除くか、プラットフォーム非依存の代替で置換するか、プラットフォーム チェックで保護します (以下参照)。

    private static string GetLoggingPath()
    {
        // Verify the code is running on Windows.
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Fabrikam\AssetManagement"))
            {
                if (key?.GetValue("LoggingDirectoryPath") is string configuredPath)
                    return configuredPath;
            }
        }
    
        // This is either not running on Windows or no logging path was configured,
        // so just use the path for non-roaming user-specific data files.
        var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        return Path.Combine(appDataPath, "Fabrikam", "AssetManagement", "Logging");
    }
    

デモについては、Windows 互換機能パックの Channel 9 動画をご覧ください。