Поделиться через


API удаленного взаимодействия устарели

Некоторые API, связанные с удаленным взаимодействием, помечены как устаревшие и приводят к созданию предупреждения SYSLIB0010 во время компиляции. В последующей версии .NET эти API могут быть исключены.

Описание изменения

Следующие API удаленного взаимодействия помечены как устаревшие.

API Версия, в которой API помечен как устаревший...
MarshalByRefObject.GetLifetimeService() 5.0 (RC1)
MarshalByRefObject.InitializeLifetimeService() 5.0 (RC1)

В .NET Framework версий с 2.x по 4.x методы GetLifetimeService() и InitializeLifetimeService() управляют временем существования экземпляров, участвующих в удаленном взаимодействии .NET. В .NET Core версий с 2.x по 3.x эти методы всегда приводят к созданию исключения PlatformNotSupportedException во время выполнения.

В .NET 5 и более поздних версий методы GetLifetimeService() и InitializeLifetimeService() помечены как устаревшие с помощью предупреждения, но по-прежнему приводят к созданию исключения PlatformNotSupportedException во время выполнения.

// MemoryStream, like all Stream instances, subclasses MarshalByRefObject.
MemoryStream stream = new MemoryStream();
// Throws PlatformNotSupportedException; also produces warning SYSLIB0010.
obj.InitializeLifetimeService();

Это изменение происходит только во время компиляции. Относительно предыдущих версий .NET Core во время выполнения нет никаких изменений.

Причина изменения

Технология удаленного взаимодействия .NET устарела. Она позволяет создать экземпляр объекта в другом процессе (потенциально даже на другом компьютере) и взаимодействовать с этим объектом, как если бы он был обычным внутрипроцессным экземпляром объекта .NET. Инфраструктура удаленного взаимодействия .NET существует только в .NET Framework версий с 2.x по 4.x. .NET Core и .NET 5 и более поздних версий не поддерживают удаленное взаимодействие .NET, а API удаленного взаимодействия в них либо не существуют, либо всегда создают исключения в этих средах выполнения.

Чтобы помочь разработчикам отказаться от этих API, некоторые связанные с удаленным взаимодействием API были помечены как устаревшие. В последующей версии .NET эти API могут быть окончательно исключены.

Представленные версии

.NET 5.0

  • Для взаимодействия с объектами в других приложениях или на других компьютерах рекомендуется использовать WCF или службы RESTFUL на основе HTTP. Дополнительные сведения см. в разделе Технологии .NET Framework, недоступные в .NET Core.

  • Если вам по-прежнему требуется вызывать устаревшие API, вы можете отключить предупреждение SYSLIB0010 в коде.

    MarshalByRefObject obj = GetMarshalByRefObj();
    #pragma warning disable SYSLIB0010 // Disable the warning.
    obj.InitializeLifetimeService(); // Still throws PNSE.
    obj.GetLifetimeService(); // Still throws PNSE.
    #pragma warning restore SYSLIB0010 // Reenable the warning.
    

    Также вы можете отключить это предупреждение в файле проекта, что приведет к его отключению для всех исходных файлов в проекте.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below will suppress SYSLIB0010 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0010</NoWarn>
      </PropertyGroup>
    </Project>
    

    В случае отключения SYSLIB0010 будет отключено только предупреждение об устаревшем API удаленного взаимодействия. Другие предупреждения не отключаются. Кроме того, при этом не изменяется жестко заданное поведение во время выполнения, которое во всех случаях подразумевает создание исключения PlatformNotSupportedException.

Затронутые API