.NET Framework 技术在 .NET 上不可用

一些适用于 .NET Framework 库的技术不可用于 .NET 6 及更高版本,例如应用域、远程处理和代码访问安全性 (CAS)。 如果你的库依赖于本页中列出的一项或多项技术,请考虑使用提及的替代方法。

有关 API 兼容性的详细信息,请参阅 .NET 中断性变更

应用程序域

应用程序域 (AppDomain) 可将应用相互隔离。 AppDomain 需要运行时支持,并且耗费的资源成本较高。 不支持创建其他应用域,也尚未计划在将来添加此功能。 对于代码隔离,将流程或容器用作备用。 若要动态加载程序集,请使用 AssemblyLoadContext 类。

.NET 6 及更高版本公开了一些 AppDomain API 曲面,以便可以更轻松地从 .NET Framework 进行代码迁移。 一些 API 可正常工作(例如 AppDomain.UnhandledException),一些成员不会执行任何操作(例如 SetCachePath),也有一些会引发 PlatformNotSupportedException(例如 CreateDomain)。 对照 dotnet/runtime GitHub 存储库中的 System.AppDomain 引用源检查所使用的类型。 确保选择与已实现的版本相匹配的分支。

远程处理

.NET 6 及更高版本不支持 .NET 远程处理。 .NET 远程处理被认为是存在问题的体系结构。 它用于在不再受支持的应用程序域之间进行通信。 同样,远程处理也需要运行时支持,进行维护的成本较高。

对于简单的跨进程通信,可将进程间通信 (IPC) 机制视为远程处理的备用方案,如 System.IO.Pipes 类或 MemoryMappedFile 类。 对于更复杂的场景,开放源代码 StreamJsonRpc 项目提供了一个跨平台的 .NET Standard 远程处理框架,该框架在现有流或管道连接的基础上工作。

对于跨计算机的通信,可将基于网络的解决方案用作备用方案。 最好使用低开销纯文本协议,例如 HTTP。 此处,ASP.NET Core 使用的 Web 服务器 Kestrel Web 服务器是一个选择。 也可考虑将 System.Net.Sockets 用于基于网络的跨计算机的方案。 前面提到的 StreamJsonRpc 可用于通过 Web 套接字进行 JSON 或二进制(通过 MessagePack)通信。

有关更多消息传送选项,请参阅 .NET 开放源代码开发人员项目:消息传送

由于不支持远程处理,因此对委托对象调用 BeginInvoke()EndInvoke() 将引发 PlatformNotSupportedException。 有关详细信息,请参阅迁移 .NET Core 的委托 BeginInvoke 调用

代码访问安全性 (CAS)

沙盒依赖为托管应用程序或库使用或运行提供资源的运行时或框架进行限制,其在 .NET Framework 上不受支持,因此在 .NET 6 及更高版本上也不受支持。 由于 .NET Framework 和运行时中存在太多发生特权提升,因此不再将 CAS 视为安全边界。 此外,CAS 使实现更加复杂,通常会对无意使用它的应用程序造成正确性-性能影响。

可使用操作系统提供的安全边界,例如虚拟化、容器或具有最少特权集的用于运行进程的用户帐户。

安全透明度

与 CAS 相似,借助安全透明度可以通过声明性方式将沙盒代码与安全关键代码隔离,但是不再支持将它作为安全边界。 Silverlight 大规模使用了此功能。

要使用最少权限集运行进程,请使用操作系统提供的安全边界,例如虚拟化、容器或用户帐户。

System.EnterpriseServices

.NET 6 及更高版本不支持 System.EnterpriseServices (COM+)。

Workflow Foundation

Windows Workflow Foundation (WF) 在 .NET 6 及更高版本中不再受支持。 如需替代,请参见 CoreWF

提示

Windows Communication Foundation (WCF) 服务器可以使用 CoreWCF NuGet 包在 .NET 6 及更高版本中使用。 有关详细信息,请参阅 CoreWCF 1.0 已发布

不支持某些反射发出 API

.NET 8 和更低版本的 .NET (Core) 不支持保存 System.Reflection.Emit API 生成的程序集,并且 AssemblyBuilder.Save 方法不可用。 此外,AssemblyBuilderAccess 枚举的以下字段不可用:

在 .NET 9 中,已实现 PersistedAssemblyBuilder,并将 AssemblyBuilder.Save 方法添加回反射发出库。 若要详细了解如何使用此 API,请参阅 System.Reflection.Emit.AssemblyBuilder 类

有关详细信息,请参阅 dotnet/runtime 问题 15704

加载多模块程序集

由多个模块组成的程序集(在 MSBuild 中设置为 OutputType=Module)在 .NET 6 及更高版本中不受支持。

作为替代方法,请考虑将各个模块合并到单个程序集文件中。

XSLT 脚本块

只有 .NET Framework 支持 XSLT 脚本块。 .NET 6 或更高版本不支持。

另请参阅