Windows 互換機能パックを使用してコードを .NET Core に移植するUse the Windows Compatibility Pack to port code to .NET Core

既存のコードを .NET Core に移植する際に発生する最も一般的な問題の一部として、.NET Framework のみに存在する API およびテクノロジへの依存があります。Some of the most common issues found when porting existing code to .NET Core are dependencies on APIs and technologies that are only found in the .NET Framework. Windows 互換機能パックには、このようなテクノロジの多くが用意されているので、.NET Core アプリケーションと .NET Standard ライブラリをはるかに簡単に構築できます。The Windows Compatibility Pack provides many of these technologies, so it's much easier to build .NET Core applications and .NET Standard libraries.

このパッケージは論理 .NET Standard 2.0 の拡張であり、API セットを大幅に増やします。ほとんど変更なしで既存コードがコンパイルされます。This package is a logical extension of .NET Standard 2.0 that significantly increases API set and existing code compiles with almost no modifications. ただし、.NET Standard の約束 ("これはあらゆる .NET 実装の API を集めたものである") を守る目的で、レジストリ、Windows Management Instrumentation (WMI)、リフレクション出力 API など、すべてのプラットフォームで動作しないテクノロジは含まれていません。But in order to keep the promise of .NET Standard ("it is the set of APIs that all .NET implementations provide"), this didn't include technologies that can't work across all platforms, such as registry, Windows Management Instrumentation (WMI), or reflection emit APIs.

Windows 互換機能パックは .NET Standard を基盤とし、Windows 専用のテクノロジを利用できます。The Windows Compatibility Pack sits on top of .NET Standard and provides access to technologies that are Windows only. .NET Core に移行したいが、最初の手順が Windows に留まることである顧客にとって特に便利です。It's especially useful for customers that want to move to .NET Core but plan to stay on Windows as a first step. そのようなシナリオでは、Windows 専用テクノロジを利用できないことが移行における唯一のハードルとなります。アーキテクチャ上の利点がありません。In that scenario, not being able to use Windows-only technologies is only a migration hurdle with zero architectural benefits.

パッケージの内容Package contents

Windows 互換機能パックは NuGet パッケージ Microsoft.Windows.Compatibility 経由で提供され、.NET Core または .NET Standard を対象とするプロジェクトから参照できます。The Windows Compatibility Pack is provided via the NuGet Package Microsoft.Windows.Compatibility and can be referenced from projects targeting .NET Core or .NET Standard.

Windows 専用 API やプラットフォーム非依存 API など、約 20,000 の API を提供します。テクノロジ領域には次のものがあります。It provides about 20,000 APIs, including Windows-only as well as cross-platform APIs from the following technology areas:

  • コード ページCode Pages
  • CodeDomCodeDom
  • 構成Configuration
  • ディレクトリ サービスDirectory Services
  • 描画Drawing
  • ODBCODBC
  • アクセス許可Permissions
  • ポートPorts
  • Windows アクセス制御リスト (ACL)Windows Access Control Lists (ACL)
  • Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)
  • Windows 暗号化Windows Cryptography
  • Windows EventLogWindows EventLog
  • WMI (Windows Management Instrumentation)Windows Management Instrumentation (WMI)
  • Windows パフォーマンス カウンターWindows Performance Counters
  • Windows レジストリWindows Registry
  • Windows ランタイム キャッシュWindows Runtime Caching
  • Windows サービスWindows Services

詳細については、互換機能パックの仕様をご覧ください。For more information, see the spec of the compatibility pack.

作業開始Get started

  1. 移植の前に、移植プロセスを確認してください。Before porting, make sure to take a look at the Porting Process.

  2. .NET Core または .NET Standard に既存のポートを移植するとき、NuGet パッケージ Microsoft.Windows.Compatibility をインストールします。When porting existing code to .NET Core or .NET Standard, install the NuGet package Microsoft.Windows.Compatibility.

  3. Windows に留まる場合、すでに用意はできています。If you want to stay on Windows, you're all set.

  4. .NET Core アプリケーションまたは .NET Standard ライブラリを Linux または macOS で実行する場合、API Analyzer を使用し、プラットフォーム非依存で機能しない API の使用を見つけます。If you want to run the .NET Core application or .NET Standard library on Linux or macOS, use the API Analyzer to find usage of APIs that won't work cross-platform.

  5. そのような API の使用を取り除くか、プラットフォーム非依存の代替で置換するか、プラットフォーム チェックで保護します (以下参照)。Either remove the usages of those APIs, replace them with cross-platform alternatives, or guard them using a platform check, like:

    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 動画をご覧ください。For a demo, check out the Channel 9 video of the Windows Compatibility Pack.