Использование пакета совместимости Windows для переноса кода в .NET

Некоторые из наиболее распространенных проблем при переносе существующего кода из .NET Framework в .NET связаны с зависимостями от API и технологий, которые доступны только в .NET Framework. Пакет обеспечения совместимости Windows предоставляет многие из этих технологий. Это значительно упрощает создание приложений .NET и библиотек .NET Standard.

Пакет обеспечения совместимости является логическим расширением платформы .NET Standard 2.0, который значительно расширяет набор API. Существующий код компилируется практически без изменений. Чтобы сдержать обещание "это набор API, который предоставляет все реализации .NET", платформа .NET Standard не включает технологии, которые не могут работать на всех платформах, такие как реестр, инструментарий управления Windows (WMI) или API порождения отражения. Пакет обеспечения совместимости Windows основан на .NET Standard и обеспечивает доступ к таким технологиям, которые доступны только в Windows. Это особенно удобно для клиентов, которые хотят перейти на .NET, но по меньшей мере на первом этапе планируют оставаться в Windows. В этом сценарии возможность использования технологий, предназначенных только для Windows, устраняет препятствия для миграции.

Содержимое пакета

Пакет обеспечения совместимости Windows предоставляется с помощью пакета NuGet Microsoft.Windows.Compatibility. Ссылаться на него можно из проектов, предназначенных для .NET или .NET Standard.

Он предоставляет около 20 000 API, включая API только для Windows и кросс-платформенные API из следующих технологических областей:

  • Кодовые страницы
  • CodeDom
  • Настройка
  • Службы каталогов
  • Рисунок
  • ODBC
  • Разрешения
  • Порты
  • Списки управления доступом Windows (ACL)
  • Windows Communication Foundation (WCF)
  • Шифрование Windows
  • Windows EventLog
  • Инструментарий управления Windows (WMI)
  • Счетчики производительности Windows
  • реестр Windows;
  • Кэширование среды выполнения Windows
  • Службы Windows

Дополнительные сведения см. в характеристиках пакета обеспечения совместимости.

Начать

  1. Перед переносом обязательно проверьте процесс переноса.

  2. При переносе существующего кода в .NET или .NET Standard установите пакет NuGet Microsoft.Windows.Compatibility.

    Если вы хотите остаться на Windows, больше ничего не требуется.

  3. Если же вам нужно работать с приложением .NET или библиотекой .NET Standard на macOS или Linux, воспользуйтесь Анализатором совместимости платформ и узнайте, как использовать 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");
    }
    

Демонстрацию см. в видео Channel 9 по пакету обеспечения совместимости Windows.