.NET Framework 技术在 .NET 上不可用
可用于 .NET Framework 库的几种技术不适用于 .NET 6+,例如应用域、远程处理和代码访问安全性(CAS)。 如果库依赖于此页上列出的一个或多个技术,请考虑提到的替代方法。
有关 API 兼容性的详细信息,请参阅 .NET 中断性变更。
应用程序域
应用程序域(AppDomains)将应用彼此隔离。 AppDomain 需要运行时支持,并且资源昂贵。 不支持创建更多应用域,并且将来没有添加此功能的计划。 对于代码隔离,请使用单独的进程或容器作为替代方法。 若要动态加载程序集,请使用 AssemblyLoadContext 类。
为了更轻松地从 .NET Framework 迁移代码,.NET 6+ 公开了一些 AppDomain API 图面。 某些 API 正常工作(例如,AppDomain.UnhandledException),某些成员没有任何动作(例如,SetCachePath),某些 API 会抛出 PlatformNotSupportedException(例如,CreateDomain)。 在 dotnet/runtime GitHub 存储库中,将您使用的类型与 System.AppDomain
参考源 进行对比检查。 请确保选择与实现的版本匹配的分支。
远程处理
.NET 6+ 不支持 .NET 远程处理。 .NET 远程处理被标识为有问题的体系结构。 它用于跨不再受支持的应用程序域进行通信。 此外,远程处理需要运行时支持,维护成本高昂。
对于简单的跨进程通信,可将进程间通信 (IPC) 机制视为远程处理的备用方案,如 System.IO.Pipes 类或 MemoryMappedFile 类。 对于更复杂的方案,开源 StreamJsonRpc 项目提供了一个跨平台 .NET Standard 远程处理框架,该框架在现有流或管道连接的基础上工作。
跨计算机,使用基于网络的解决方案作为替代方法。 最好使用低开销纯文本协议,例如 HTTP。 Kestrel Web 服务器(ASP.NET Core 使用的 Web 服务器)在此处是一个选项。 此外,请考虑对基于网络的跨计算机方案使用 System.Net.Sockets。 前面提到的 StreamJsonRpc 可用于通过 Web 套接字进行 JSON 或二进制(通过 MessagePack)通信。
有关更多消息传送选项,请参阅 .NET 开源开发人员项目:消息传送。
由于不支持远程处理,因此对委托对象调用 BeginInvoke()
和 EndInvoke()
将引发 PlatformNotSupportedException
。 有关详细信息,请参阅迁移 .NET Core 的委托 BeginInvoke 调用。
代码访问安全性 (CAS)
沙盒依赖于运行时或框架来约束托管应用程序或库使用或运行的资源,在 .NET Framework 上不受支持,因此 .NET 6+ 也不受支持。 CAS 不再被视为安全边界,因为 .NET Framework 和运行时中发生特权提升的情况过多。 此外,CAS 使实现更加复杂,并且通常对不打算使用它的应用程序具有正确性和性能的影响。
使用操作系统提供的安全边界(例如虚拟化、容器或用户帐户)运行具有最低权限集的进程。
安全透明度
与 CAS 相似,借助安全透明度可以通过声明性方式将沙盒代码与安全关键代码隔离,但是不再支持将它作为安全边界。 Silverlight 大量使用此功能。
若要运行具有最少特权集的进程,请使用操作系统提供的安全边界,例如虚拟化、容器或用户帐户。
System.EnterpriseServices
.NET 6+ 不支持 System.EnterpriseServices(COM+)。
Workflow Foundation
.NET 6+ 不支持 Windows Workflow Foundation (WF)。 有关替代方法,请参阅 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.PersistedAssemblyBuilder 类。
有关 .NET 中不同 AssemblyBuilder 实现的详细信息,请参阅 System.Reflection.Emit.AssemblyBuilder 类。
加载多模块程序集
.NET 6+ 不支持由多个模块(MSBuild 中的OutputType=Module
)组成的程序集。
作为替代方法,请考虑将单个模块合并到单个程序集文件中。
XSLT 脚本块
XSLT 脚本块 仅在 .NET Framework 中受支持。 .NET 6 或更高版本不支持它们。