远程处理 API 已过时

某些远程处理相关的 API 标记为已过时,并在编译时生成 SYSLIB0010 警告。 将来的 .NET 版本中可能会删除这些 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 或基于 HTTP 的 REST 服务与其他应用程序或计算机中的对象通信。 有关详细信息,请参阅 .NET Core 上不可用的 .NET Framework 技术

  • 如果必须继续使用过时的 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