From 3b3d91b6d8cc159d210fb770e898655cb8ea7d75 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Wed, 19 Nov 2025 15:42:46 +0100 Subject: [PATCH 01/21] # 36974 Update the doc for 2026.0 --- .../Deployment/requirements-20250.md | 4 +- .../Deployment/requirements-20251.md | 188 +++++++++++++++++ .../Deployment/requirements-20260.md | 198 ++++++++++++++++++ .../Deployment/requirements.md | 1 + .../WhatsNew/breaking-changes-20260.md | 139 ++++++++++++ .../Introduction/WhatsNew/whats-new-20251.md | 28 +++ .../Introduction/WhatsNew/whats-new-20260.md | 36 ++++ conceptual/Introduction/WhatsNew/whats-new.md | 1 + conceptual/toc.yml | 7 + 9 files changed, 600 insertions(+), 2 deletions(-) create mode 100644 conceptual/DeploymentConfiguration/Deployment/requirements-20251.md create mode 100644 conceptual/DeploymentConfiguration/Deployment/requirements-20260.md create mode 100644 conceptual/Introduction/WhatsNew/breaking-changes-20260.md create mode 100644 conceptual/Introduction/WhatsNew/whats-new-20251.md create mode 100644 conceptual/Introduction/WhatsNew/whats-new-20260.md diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements-20250.md b/conceptual/DeploymentConfiguration/Deployment/requirements-20250.md index cfb5bed..308edfc 100644 --- a/conceptual/DeploymentConfiguration/Deployment/requirements-20250.md +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20250.md @@ -50,7 +50,7 @@ The following software components need to be installed before PostSharp can be u ## Requirements on build servers * Any of the following operating systems currently in mainstream support by respective vendors: - * Windows Server 2022 x64 or ARM64 + * Windows Server 2022 * Windows 10 x64 * Windows 11 x64 or ARM64 * Ubuntu 20.04 LTS x64, @@ -61,7 +61,7 @@ The following software components need to be installed before PostSharp can be u * Alpine Linux 3.18+ ARM64. At least one of the following: -* .NET Framework 4.7.2 and later + Build Tools for Visual Studio 2022 or Visual Studio 2022 (17.8 and later). +* .NET Framework 4.7.2 and later + Build Tools for Visual Studio 2022 or Visual Studio 2022 (17.10 and later). * .NET SDK 8.0 (build 8.0.100 or later). * .NET SDK 9.0 (build 9.0.100 or later). diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements-20251.md b/conceptual/DeploymentConfiguration/Deployment/requirements-20251.md new file mode 100644 index 0000000..3f9fa60 --- /dev/null +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20251.md @@ -0,0 +1,188 @@ +--- +uid: requirements-20251 +title: "PostSharp 2025.1: Requirements and Compatibility" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "PostSharp 2025.1 supports C# 13.0 or earlier and VB 16.9 or earlier. It requires Microsoft Visual Studio 2022, .NET Framework 4.7.2 or later, and is compatible with various operating systems and .NET SDK versions. It also supports Blazor via .NET Standard." +--- +# PostSharp 2025.1: Requirements and Compatibility + +You can use PostSharp to build applications that target a wide range of target devices. This article lists the requirements for development, build and end-user devices. + +> [!IMPORTANT] +> Please read our [Supported Platforms Policies](https://www.postsharp.net/support/policies#platforms) on our web site as it contains important explanations, restrictions and disclaimers regarding this article. + + +## Supported programming languages + +This version of PostSharp supports the following languages: + +* C# 13.0 or earlier, + +* VB 16.9 or earlier. + +PostSharp only supports the compilers that ship with the supported versions of Visual Studio, .NET Core SDK, or .NET SDK. Other compiler versions, especially pre-Roslyn ones, are no longer supported. + +You may use PostSharp with an unsupported language version at your own risks by setting the `PostSharpSkipLanguageVersionValidation` MSBuild property to `True`. There are two risks in doing that: inconsistent or erroneous behavior of the current version of PostSharp, and breaking changes in the future version of PostSharp that will support this language version. + + +## Requirements on development workstations + +This section lists the supported platforms, and most importantly platform versions, on which PostSharp is intended to be used while developing software. + +The following software components need to be installed before PostSharp can be used: + +* Any of the following versions of Microsoft Visual Studio: + * Visual Studio 2022 (17.10 and later). + + The debugging experience may be inconsistent with other IDEs than Visual Studio or when PostSharp Tools for Visual Studio are not installed. + +* .NET Framework 4.7.2 or later. + +* Any of the following operating systems: + * Windows 10, Windows 11 X64: any version in mainstream Microsoft support, except LTSB and S editions. + * Windows 11 ARM64: any version in mainstream Microsoft support, except LTSB and S editions. + +* Optionally, one of the following versions of .NET SDK: + * .NET SDK 8.0 (build 8.0.100 or later). + * .NET SDK 9.0 (build 9.0.100 or later). + +## Requirements on build servers + +* Any of the following operating systems currently in mainstream support by respective vendors: + * Windows Server 2022 + * Windows Server 2025 x64 or ARM64 + * Windows 10 x64 + * Windows 11 x64 or ARM64 + * Ubuntu 20.04 LTS x64, + * Ubuntu 22.04 LTS x64 or ARM64, + * Ubuntu 24.04 LTS x64 or ARM64, + * MacOS 13+ ARM64, + * Alpine Linux 3.18+ x64, + * Alpine Linux 3.18+ ARM64. + +At least one of the following: +* .NET Framework 4.7.2 and later + Build Tools for Visual Studio 2022 or Visual Studio 2022 (17.8 and later). +* .NET SDK 8.0 (build 8.0.100 or later). +* .NET SDK 9.0 (build 9.0.100 or later). + +## Requirements on end-user devices + +The following table displays the versions of the target frameworks that are supported by the current release of PostSharp and its components. + +| Package | .NET Framework | .NET Core & .NET | .NET Standard*** | Blazor*** | +|---------|----------------|------------------|------------------|-----------| +| *PostSharp* | 3.5 SP1, 4.5 *, 4.6 *, 4.7, 4.8 ** | 8.0, 9.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Common*
*PostSharp.Patterns.Aggregation*
*PostSharp.Patterns.Model* | 4.5 *, 4.6 *, 4.7, 4.8 ** | 8.0, 9.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Diagnostics* % | 4.5 *, 4.6 *, 4.7, 4.8 ** | 8.0, 9.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Threading* | 4.5 *, 4.6 *, 4.7, 4.8 ** | 8.0, 9.0 | 2.0, 2.1 | - | +| *PostSharp.Patterns.Xaml* | 4.5 *, 4.6 *, 4.7, 4.8 ** | 8.0-windows, 9.0-windows | - | - | +| *PostSharp.Patterns.Caching* %% | 4.6.1 *, 4.7, 4.8 ** | 8.0, 9.0 | 2.0, 2.1 | Supported | + +> [!NOTE] +> * .NET Framework versions 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 are no longer supported by Microsoft. Although we still provide libraries targeting them, we no longer run our tests on these specific versions of the .NET Framework. + +> [!NOTE] +> ** .NET Framework ARM64 is experimentally supported for PostSharp Pattern Libraries. We recommend using PostSharp Pattern Libraries on ARM64 Windows with emulated .NET Framework x64. + +> [!NOTE] +> *** PostSharp does not implicitly support all platforms that support .NET Standard. Only platforms mentioned in this table are supported. + +> [!NOTE] +> % Each PostSharp.Patterns.Diagnostics logging backend has different set of supported target frameworks. Please refer to individual packages on [nuget.org](http://www.nuget.org). + +> [!NOTE] +> %% Each PostSharp.Patterns.Caching caching backend has different set of supported target frameworks. Please refer to individual packages on [nuget.org](http://www.nuget.org). + + +## Compatibility with Xamarin + +Xamarin support by Microsoft ended on May 1, 2024 and is therefore unsupported by PostSharp. + +Xamarin was supported as a runtime platform only via .NET Standard. PostSharp still contains mechanisms that allow for use with Xamarin, but these will not be maintained further. + +It is possible to include PostSharp packaged in your .NET Standard libraries and then reference these libraries in your Xamarin application project. Adding PostSharp directly to a Xamarin application project is not possible. + +Xamarin applications use a linker that is executed during build to discard the unused code and reduce the size of the application. To prevent the linker from removing the code required by PostSharp you need to add a custom linker configuration to your project. See for more details. + + +## Compatibility with Blazor + +Blazor is supported as a runtime platform only via .NET Standard. You can add supported PostSharp packages to your .NET Standard libraries and then reference these libraries in your Blazor application project. Adding PostSharp directly to a Blazor application project is not supported. + +Blazor applications use a linker that is executed during build to discard the unused code and reduce the size of the application. To prevent the linker from removing the code required by PostSharp you need to add a custom linker configuration to your project. See for more details. + +To debug Blazor applications, `PostSharpDebuggerExtensionsMode` MSBuild property should be set to `Disabled` for all referenced projects using PostSharp, otherwise the debugger may fail to load debugging symbols properly. See for more details. + + +## Compatibility with ASP.NET 1.0 - 4.8 + +There are two ways to develop web applications using Microsoft .NET: + +* **ASP.NET Application projects ** are very similar to other projects; they need to be built before they can be executed. Since they are built using MSBuild, you can use PostSharp as with any other kind of project. + +* **ASP.NET Site projects ** are very specific: there is no MSBuild project file (a site is actually a directory), and these projects must not be built. ASP.NET Site projects are not supported. + +* ASP.NET Core is supported when used with a supported .NET SDK. + +## Compatibility with Microsoft Code Analysis + +By default, PostSharp reconfigures the build process so that Code Analysis is executed on the assemblies as they were *before* being enhanced by PostSharp. If you are using Code Analysis as an integrated part of Visual, no change of configuration is required. + +You can request the Code Analysis to execute on the output of PostSharp by setting the `ExecuteCodeAnalysisOnPostSharpOutput` MSBuild property to `True`. For more information, see . + + +## Compatibility with Microsoft Code Contracts + +PostSharp configures the build process so that Microsoft Code Contracts is executed before PostSharp. Additionally, Microsoft Code Contracts' static analyzer will be executed synchronously (instead of asynchronously without PostSharp), which will significantly impact the build performance. + + +## Compatibility with Obfuscators + +PostSharp generates assemblies that are theoretically compatible with all obfuscators. + +> [!NOTE] +> PostSharp Logging is not designed to work with obfuscated assemblies. + +> [!CAUTION] +> PostSharp emits constructs that are not emitted by Microsoft compilers (for instance `methodof`). These unusual constructs may reveal bugs in third-party tools, because they are generally tested against the output of Microsoft compilers. + + +## Compatibility with ARM platforms + +**Developing** on ARM platforms (e.g. Mac M1, Raspberry Pi) is not supported. + +**Targeting** ARM platforms is not supported. Target Any-CPU instead. + + +## Known Incompatibilities + +PostSharp is not compatible with the following products or features: + +| Product or Feature | Reason | Workaround | +|--------------------|--------|------------| +| Visual Studio 2019 | No longer under Microsoft mainstream support | Use PostSharp 2024.0. | +| Visual Studio 2017 | No longer under Microsoft mainstream support | Use PostSharp 6.10. | +| Visual Studio 2015 | No longer under Microsoft mainstream support | Use PostSharp 6.5. | +| Visual Studio 2013 | No longer under Microsoft mainstream support | Use PostSharp 6.0. | +| Visual Studio 2012 | No longer under Microsoft mainstream support | Use PostSharp 5.0. | +| Visual Studio 2010 | No longer under Microsoft mainstream support | Use PostSharp 3.1. | +| ILMerge | Bug in ILMerge | Use another merging product (such as ILPack, SmartAssembly). | +| Edit-and-Continue | Not Supported | Rebuild the project after edits | +| Silverlight 3 or earlier | No longer under Microsoft mainstream support | Use PostSharp 2.1. | +| Silverlight 4 | No longer under Microsoft mainstream support | Use PostSharp 3.1. | +| Silverlight 5 | Low customer demand. | Use PostSharp 4.3. | +| .NET Compact Framework | No support for PCL | Use PostSharp 2.1. | +| .NET Framework 4.0 | No longer under Microsoft mainstream support | Target .NET Framework 4.5 or use PostSharp 6.5. | +| .NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 | No longer under Microsoft mainstream support | Target .NET Framework 4.6.2 or use PostSharp 6.10. | +| .NET Framework 2.0 | No longer under Microsoft mainstream support | Target .NET Framework 3.5 or use PostSharp 3.1. | +| .NET Core SDK 1.0, 1.1, 2.2, 3.0, 3.1 | No longer supported by Microsoft (end of life) | Use .NET 8.0 SDK (LTS). | +| .NET SDK 5.0 (any version) | No longer supported by Microsoft (end of life) | Use .NET 8.0 SDK (LTS). | +| Windows Phone 7 | No longer under Microsoft mainstream support | Use PostSharp 3.1 | +| Windows Phone 8, WinRT | Low customer demand. | Use PostSharp 4.3 | +| Visual Studio Express | Microsoft's licensing policy | Use Visual Studio Community Edition | +| ASP.NET Web Sites | Not built using MSBuild | Convert the ASP.NET Web Site to an ASP.NET Web Application. | +| Universal Windows Platform (UWP) | Not supported (low customer demand) | Contact PostSharp support team. | +| Mono, Unity3D | Unsupported | None. | +| Xamarin | Unsupported | Use Microsoft MAUI. | + diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md new file mode 100644 index 0000000..365aee7 --- /dev/null +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md @@ -0,0 +1,198 @@ +--- +uid: requirements-20260 +title: "PostSharp 2026.0: Requirements and Compatibility" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "PostSharp 2026.0 supports C# 14.0 or earlier and VB 16.9 or earlier. It requires Microsoft Visual Studio 2022 or 2026, .NET Framework 4.7.2 or later, and is compatible with various operating systems and .NET SDK versions. It also supports Blazor via .NET Standard." +--- +# PostSharp 2025.1: Requirements and Compatibility + +You can use PostSharp to build applications that target a wide range of target devices. This article lists the requirements for development, build and end-user devices. + +> [!IMPORTANT] +> Please read our [Supported Platforms Policies](https://www.postsharp.net/support/policies#platforms) on our web site as it contains important explanations, restrictions and disclaimers regarding this article. + + +## Supported programming languages + +This version of PostSharp supports the following languages: + +* C# 14.0 or earlier, + +* VB 16.9 or earlier. + +PostSharp only supports the compilers that ship with the supported versions of Visual Studio, .NET Core SDK, or .NET SDK. Other compiler versions, especially pre-Roslyn ones, are no longer supported. + +You may use PostSharp with an unsupported language version at your own risks by setting the `PostSharpSkipLanguageVersionValidation` MSBuild property to `True`. There are two risks in doing that: inconsistent or erroneous behavior of the current version of PostSharp, and breaking changes in the future version of PostSharp that will support this language version. + + +## Requirements on development workstations + +This section lists the supported platforms, and most importantly platform versions, on which PostSharp is intended to be used while developing software. + +The following software components need to be installed before PostSharp can be used: + +* Any of the following versions of Microsoft Visual Studio: + * Visual Studio 2022 (17.14 and later). + * Visual Studio 2026 (18.0 and later). + + The debugging experience may be inconsistent with other IDEs than Visual Studio or when PostSharp Tools for Visual Studio are not installed. + +* .NET Framework 4.7.2 or later. + +* Any of the following operating systems: + * Windows 10, Windows 11 X64: any version in mainstream Microsoft support, except LTSB and S editions. + * Windows 11 ARM64: any version in mainstream Microsoft support, except LTSB and S editions. + +* Optionally, one of the following versions of .NET SDK: + * .NET SDK 8.0 (build 8.0.100 or later). + * .NET SDK 9.0 (build 9.0.100 or later). + * .NET SDK 10.0 (build 10.0.100 or later). + +## Requirements on build servers + +* Any of the following operating systems currently in mainstream support by respective vendors: + * Windows Server 2022 + * Windows Server 2025 x64 or ARM64 + * Windows 10 x64 + * Windows 11 x64 or ARM64 + * Ubuntu 20.04 LTS x64, + * Ubuntu 22.04 LTS x64 or ARM64, + * Ubuntu 24.04 LTS x64 or ARM64, + * MacOS 13+ ARM64, + * Alpine Linux 3.18+ x64, + * Alpine Linux 3.18+ ARM64. + +At least one of the following: +* .NET Framework 4.7.2 and later + Build Tools for Visual Studio 2022 or Visual Studio 2022 (17.8 and later). +* .NET SDK 8.0 (build 8.0.100 or later). +* .NET SDK 9.0 (build 9.0.100 or later). + +## Requirements on end-user devices + +The following table displays the versions of the target frameworks that are supported by the current release of PostSharp and its components. + +| Package | .NET Framework | .NET Core & .NET | .NET Standard*** | Blazor*** | +|---------|----------------|------------------|------------------|-----------| +| *PostSharp* | 4.5.2 \*, 4.6.x \*, 4.7.x, 4.8.x | 6.0 #, 8.0, 9.0, 10.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Common*
*PostSharp.Patterns.Aggregation*
*PostSharp.Patterns.Model* | 4.7.1, 4.7.2, 4.8.x** | 6.0 #, 8.0, 9.0, 10.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Diagnostics* % | 4.7.1, 4.7.2, 4.8.x** | 6.0 #, 8.0, 9.0, 10.0 | 2.0, 2.1 | Supported | +| *PostSharp.Patterns.Threading* | 4.7.1, 4.7.2, 4.8.x** | 6.0 #, 8.0, 9.0, 10.0 | 2.0, 2.1 | - | +| *PostSharp.Patterns.Xaml* | 4.7.1, 4.7.2, 4.8.x** | 6.0‑windows #, 8.0‑windows, 9.0‑windows, 10.0‑windows | - | - | +| *PostSharp.Patterns.Caching* %% | 4.7.1, 4.7.2, 4.8.x** | 6.0 #, 8.0, 9.0, 10.0 | 2.0, 2.1 | Supported | + +> [!NOTE] +> * .NET Framework versions 4.5.x and 4.6.x are no longer supported by Microsoft. Although we still provide libraries targeting them, we no longer run our tests on these specific versions of the .NET Framework. + +> [!NOTE] +> ** .NET Framework ARM64 is experimentally supported for PostSharp Pattern Libraries. We recommend using PostSharp Pattern Libraries on ARM64 Windows with emulated .NET Framework x64. + +> [!NOTE] +> *** PostSharp does not implicitly support all platforms that support .NET Standard. Only platforms mentioned in this table are supported. + +> [!NOTE] +> % Each PostSharp.Patterns.Diagnostics logging backend has different set of supported target frameworks. Please refer to individual packages on [nuget.org](http://www.nuget.org). + +> [!NOTE] +> %% Each PostSharp.Patterns.Caching caching backend has different set of supported target frameworks. Please refer to individual packages on [nuget.org](http://www.nuget.org). + +> [!NOTE] +> # .NET 6.0 is no longer suported by Microsoft. Although we still provide libraries targeting it, we no longer run our tests on this specific version of the .NET. We recommend using a supported version of .NET runtime in your final application. + +## Compatibility with deprecated versions of .NET Core and .NET + +When targeting .NET Core 2.x, 3.x, and .NET 5.0 and .NET 7.0, your project will consume PostSharp assemblies for an older target framework, i.e. .NET Standard 2.0, or .NET 6.0. + +As these platforms are unsupported, we do not test our libraries against them. We recommend using a supported runtime target framework in your final application. + +## Compatibility with Xamarin + +Xamarin support by Microsoft ended on May 1, 2024 and is therefore unsupported by PostSharp. + +Xamarin was supported as a runtime platform only via .NET Standard. PostSharp still contains mechanisms that allow for use with Xamarin, but these will not be maintained further. + +It is possible to include PostSharp packaged in your .NET Standard libraries and then reference these libraries in your Xamarin application project. Adding PostSharp directly to a Xamarin application project is not possible. + +Xamarin applications use a linker that is executed during build to discard the unused code and reduce the size of the application. To prevent the linker from removing the code required by PostSharp you need to add a custom linker configuration to your project. See for more details. + + +## Compatibility with Blazor + +Blazor is supported as a runtime platform only via .NET Standard. You can add supported PostSharp packages to your .NET Standard libraries and then reference these libraries in your Blazor application project. Adding PostSharp directly to a Blazor application project is not supported. + +Blazor applications use a linker that is executed during build to discard the unused code and reduce the size of the application. To prevent the linker from removing the code required by PostSharp you need to add a custom linker configuration to your project. See for more details. + +To debug Blazor applications, `PostSharpDebuggerExtensionsMode` MSBuild property should be set to `Disabled` for all referenced projects using PostSharp, otherwise the debugger may fail to load debugging symbols properly. See for more details. + + +## Compatibility with ASP.NET 1.0 - 4.8 + +There are two ways to develop web applications using Microsoft .NET: + +* **ASP.NET Application projects ** are very similar to other projects; they need to be built before they can be executed. Since they are built using MSBuild, you can use PostSharp as with any other kind of project. + +* **ASP.NET Site projects ** are very specific: there is no MSBuild project file (a site is actually a directory), and these projects must not be built. ASP.NET Site projects are not supported. + +* ASP.NET Core is supported when used with a supported .NET SDK. + +## Compatibility with Microsoft Code Analysis + +By default, PostSharp reconfigures the build process so that Code Analysis is executed on the assemblies as they were *before* being enhanced by PostSharp. If you are using Code Analysis as an integrated part of Visual, no change of configuration is required. + +You can request the Code Analysis to execute on the output of PostSharp by setting the `ExecuteCodeAnalysisOnPostSharpOutput` MSBuild property to `True`. For more information, see . + + +## Compatibility with Microsoft Code Contracts + +PostSharp configures the build process so that Microsoft Code Contracts is executed before PostSharp. Additionally, Microsoft Code Contracts' static analyzer will be executed synchronously (instead of asynchronously without PostSharp), which will significantly impact the build performance. + + +## Compatibility with Obfuscators + +PostSharp generates assemblies that are theoretically compatible with all obfuscators. + +> [!NOTE] +> PostSharp Logging is not designed to work with obfuscated assemblies. + +> [!CAUTION] +> PostSharp emits constructs that are not emitted by Microsoft compilers (for instance `methodof`). These unusual constructs may reveal bugs in third-party tools, because they are generally tested against the output of Microsoft compilers. + + +## Compatibility with ARM platforms + +**Developing** on ARM platforms (e.g. Mac M1, Raspberry Pi) is not supported. + +**Targeting** ARM platforms is not supported. Target Any-CPU instead. + + +## Known Incompatibilities + +PostSharp is not compatible with the following products or features: + +| Product or Feature | Reason | Workaround | +|--------------------|--------|------------| +| Visual Studio 2019 | No longer under Microsoft mainstream support | Use PostSharp 2024.0. | +| Visual Studio 2017 | No longer under Microsoft mainstream support | Use PostSharp 6.10. | +| Visual Studio 2015 | No longer under Microsoft mainstream support | Use PostSharp 6.5. | +| Visual Studio 2013 | No longer under Microsoft mainstream support | Use PostSharp 6.0. | +| Visual Studio 2012 | No longer under Microsoft mainstream support | Use PostSharp 5.0. | +| Visual Studio 2010 | No longer under Microsoft mainstream support | Use PostSharp 3.1. | +| ILMerge | Bug in ILMerge | Use another merging product (such as ILPack, SmartAssembly). | +| Edit-and-Continue | Not Supported | Rebuild the project after edits | +| Silverlight 3 or earlier | No longer under Microsoft mainstream support | Use PostSharp 2.1. | +| Silverlight 4 | No longer under Microsoft mainstream support | Use PostSharp 3.1. | +| Silverlight 5 | Low customer demand. | Use PostSharp 4.3. | +| .NET Compact Framework | No support for PCL | Use PostSharp 2.1. | +| .NET Framework 4.0 | No longer under Microsoft mainstream support | Target .NET Framework 4.5 or use PostSharp 6.5. | +| .NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1 | No longer under Microsoft mainstream support | Target .NET Framework 4.6.2 or use PostSharp 6.10. | +| .NET Framework 2.0 | No longer under Microsoft mainstream support | Target .NET Framework 3.5 or use PostSharp 3.1. | +| .NET Core SDK 1.0, 1.1, 2.2, 3.0, 3.1 | No longer supported by Microsoft (end of life) | Use .NET 8.0 SDK (LTS). | +| .NET SDK 5.0 (any version) | No longer supported by Microsoft (end of life) | Use .NET 8.0 SDK (LTS). | +| Windows Phone 7 | No longer under Microsoft mainstream support | Use PostSharp 3.1 | +| Windows Phone 8, WinRT | Low customer demand. | Use PostSharp 4.3 | +| Visual Studio Express | Microsoft's licensing policy | Use Visual Studio Community Edition | +| ASP.NET Web Sites | Not built using MSBuild | Convert the ASP.NET Web Site to an ASP.NET Web Application. | +| Universal Windows Platform (UWP) | Not supported (low customer demand) | Contact PostSharp support team. | +| Mono, Unity3D | Unsupported | None. | +| Xamarin | Unsupported | Use Microsoft MAUI. | + diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements.md b/conceptual/DeploymentConfiguration/Deployment/requirements.md index 85916de..73a62a1 100644 --- a/conceptual/DeploymentConfiguration/Deployment/requirements.md +++ b/conceptual/DeploymentConfiguration/Deployment/requirements.md @@ -14,6 +14,7 @@ You can use PostSharp to build applications that target a wide range of target d This chapter contains the following sections: +* * * * diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md new file mode 100644 index 0000000..888dc7a --- /dev/null +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -0,0 +1,139 @@ +--- +uid: breaking-changes-20260 +title: "Breaking Changes in PostSharp 2026.0" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "PostSharp 2026.0 introduces major breaking changes including discontinued support for older than .NET Framework 4.7.1, .NET Standard 1.3, and end-of-life .NET versions." +--- +# Breaking Changes in PostSharp 2026.0 + +PostSharp 2026.0 contains major breaking changes related to platform discontinuation. + +## PostSharp.Redist +* Assemblies targeting .NET Framework 3.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.5.2. +* Projects targeting .NET Framework 3.5, 4.0, 4.5, 4.5.1, .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used in the final application instead. + +## PostSharp.Patterns.Common.Redist +* Assemblies targeting .NET Framework 4.5, 4.6, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Aggregation.Redist +* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used in the final application instead. + +## PostSharp.Patterns.Caching +* Assemblies targeting .NET Framework 4.6.1, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.6.1 to 4.7 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Caching.Azure +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Caching.IMemoryCache +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Caching.Redis +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.7 is unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Redist +* Assemblies targeting .NET Framework 4.5 and 4.6, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.ApplicationInsights +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5.2 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5.2 to 4.7 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.AspNetCore +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.AspNetFramework +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. + +## PostSharp.Patterns.Diagnostics.CommonLogging +* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Configuration +* Assembly targeting .NET Framework 4.5 was discontinued. +* Assembly targeting .NET Framework 4.6.1 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.DiagnosticSource +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.HttpClient +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Log4Net +* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Microsoft +* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.NLog +* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Serilog +* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Diagnostics.Tracing +* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.6 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. + +## PostSharp.Patterns.Model.Redist +* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. + +## PostSharp.Patterns.Threading.Redist +* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. + +## PostSharp.Patterns.Xaml +* Assemblies targeting .NET Core 3.0, .NET 5.0, and .NET 7.0 were discontinued. +* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. +* Projects targeting .NET Framework 4.5 to 4.7, .NET Core 3.0 to 3.1 are unsupported. +* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. + diff --git a/conceptual/Introduction/WhatsNew/whats-new-20251.md b/conceptual/Introduction/WhatsNew/whats-new-20251.md new file mode 100644 index 0000000..b9b68d6 --- /dev/null +++ b/conceptual/Introduction/WhatsNew/whats-new-20251.md @@ -0,0 +1,28 @@ +--- +uid: whats-new-20251 +title: "What's New in PostSharp 2025.1" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "PostSharp 2025.1 updates licensing terms with product consolidation and introduces source-available access with private build support for qualifying Enterprise users." +--- +# What's New in PostSharp 2025.1 + +PostSharp 2025.1 brings an update of licensing terms and support for building PostSharp from source code on Docker for qualifying Enterprise users. + +# Product consolidation +To simplify the product lineup, the following products are no longer available separately: + +* PostSharp Logging is now included in PostSharp Framework. +* PostSharp MVVM, Caching, and Threading are now exclusively part of PostSharp Ultimate. + +For users with existing license or subscription for these products nothing changes. Existing subscriptions can be renewed and new users can be added as needed. + +# Source-available and private build + +Qualifying enterprise users can request access to https://github.com/postsharp/postsharp by contacting support. + +PostSharp releases are located in branches with a `release` prefix. For example, the version 2025.1 has its source code under `release/2025.1` branch. + +See README.md in the cloned repo for details about requirements and build instructions. These instructions are likely to change in future versions. + +Currently only public NuGet package build using Docker is supported and all other operations are without support. \ No newline at end of file diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md new file mode 100644 index 0000000..0814597 --- /dev/null +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -0,0 +1,36 @@ +--- +uid: whats-new-20260 +title: "What's New in PostSharp 2026.0" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "PostSharp 2026.0 adds support for .NET 10.0 and C# 14, removes support for older .NET Framework versions (3.5-4.5.1), and unifies Pattern Libraries to target .NET Framework 4.7.1." +--- +# What's New in PostSharp 2026.0 + +PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. + +> [!NOTE] +> Please note that this release includes several breaking changes. Refer to for more detailed information. + +## PostSharp Compiler + +* PostSharp now supports the .NET 10.0 SDK and C# 14. + +* Based on usage data, we've removed PostSharp.Redist support for .NET Framework 3.5-4.5.1, .NET Standard 1.3. This means it is no longer possible to use PostSharp with these target frameworks. The package instead targets .NET Framework 4.5.2 and .NET Standard 2.0. + +* We've removed direct support for .NET 5.0 and .NET 7.0 target frameworks. You can still use PostSharp with these target frameworks, but the support is provided through .NET Standard 2.0 and .NET 6.0 library respectively. + +* In both above cases, if your projects cannot be compatible with supported target frameworks, please continue using PostSharp 2024.0 LTS, which will be supported for at least a year after 2026.0 is made LTS. Qualifying Enterprise users can request longer support duration than this, which is handled on case-by-case basis. + +## PostSharp Pattern Libraries + +* Dependencies of pattern libraries were upgraded to versions without known security vulnerabilities. + +* All Pattern libraries now support .NET 10.0. + +* Based on usage data, we've unified support for .NET Framework on version 4.7.1 for all Pattern Libraries and removed libraries targeting all previous versions of .NET Framework. Additionally, we've removed support for .NET Standard 1.3. + +* We've removed direct support for .NET 5.0 and .NET 7.0 target frameworks. You can still use Pattern Libraries with these target frameworks, but support will be provided through .NET Standard 2.0 and .NET 6.0 assemblies respectively. + +* As mentioned before, if this affects you, we recommend staying on PostSharp 2024.0 LTS before you are able to upgrade to supported target frameworks. + diff --git a/conceptual/Introduction/WhatsNew/whats-new.md b/conceptual/Introduction/WhatsNew/whats-new.md index 02e8d10..e5f574b 100644 --- a/conceptual/Introduction/WhatsNew/whats-new.md +++ b/conceptual/Introduction/WhatsNew/whats-new.md @@ -11,6 +11,7 @@ PostSharp has been around since the early days of .NET 2.0 in 2004. Since the fi This chapter contains the following sections: +* * * * diff --git a/conceptual/toc.yml b/conceptual/toc.yml index deb16ba..fce8477 100644 --- a/conceptual/toc.yml +++ b/conceptual/toc.yml @@ -30,6 +30,11 @@ items: - name: What's New topicUid: whats-new items: + - name: What's New in PostSharp 2026.0 + topicUid: whats-new-20260 + items: + - name: Breaking Changes in PostSharp 2026.0 + topicUid: breaking-changes-20260 - name: What's New in PostSharp 2025.0 topicUid: whats-new-20250 items: @@ -122,6 +127,8 @@ items: - name: Requirements and Compatibility topicUid: requirements items: + - name: Requirements of PostSharp 2026.0 + topicUid: requirements-20260 - name: Requirements of PostSharp 2025.0 topicUid: requirements-20250 - name: Requirements of PostSharp 2024.1 From 133e5d43eb16634a514e3d4ea33a0896b37666da Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Sun, 30 Nov 2025 21:58:30 +0100 Subject: [PATCH 02/21] Remove deadlock detection doc, deprecate undo-redo. --- .../Overview/postsharp-components.md | 6 +- .../Introduction/WhatsNew/whats-new-20260.md | 6 + conceptual/Misc/deprecated-features.md | 3 +- .../Model/UndoRedo/undoredo-callbacks.md | 3 + .../Model/UndoRedo/undoredo-conceptual.md | 3 + .../Model/UndoRedo/undoredo-limitations.md | 3 + .../Model/UndoRedo/undoredo-operation-name.md | 3 + .../Model/UndoRedo/undoredo-recorder.md | 3 + conceptual/Model/UndoRedo/undoredo-start.md | 3 + conceptual/Model/UndoRedo/undoredo-ui.md | 3 + conceptual/Model/UndoRedo/undoredo.md | 3 + conceptual/Threading/deadlock-detection.md | 137 +----------------- conceptual/toc.yml | 32 ++-- 13 files changed, 54 insertions(+), 154 deletions(-) diff --git a/conceptual/Introduction/Overview/postsharp-components.md b/conceptual/Introduction/Overview/postsharp-components.md index 6815ef1..8470e5c 100644 --- a/conceptual/Introduction/Overview/postsharp-components.md +++ b/conceptual/Introduction/Overview/postsharp-components.md @@ -31,9 +31,9 @@ The following table lists all PostSharp packages: | *PostSharp.Redist* | *PostSharp* | PostSharp Framework. The build-time package includes the PostSharp compiler. | | *PostSharp.Patterns.Common.Redist* | *PostSharp.Patterns.Common* | Common logic shared between pattern libraries. Code contracts. | | *PostSharp.Patterns.Aggregation.Redist* | *PostSharp.Patterns.Aggregation* | Aggretable and Disposable aspects. | -| *PostSharp.Patterns.Model.Redist* | *PostSharp.Patterns.Model* | NotifyPropertyChanged aspect and Undo/Redo. | -| *PostSharp.Patterns.XAML.Redist* | *PostSharp.Patterns.XAML* | Command, Dependency Property and Attached Property aspects. WPF controls for undo/redo. | -| *PostSharp.Patterns.Threading.Redist* | *PostSharp.Patterns.Threading* | Threading models, thread dispatching aspects, deadlock detection. | +| *PostSharp.Patterns.Model.Redist* | *PostSharp.Patterns.Model* | NotifyPropertyChanged aspect. | +| *PostSharp.Patterns.XAML.Redist* | *PostSharp.Patterns.XAML* | Command, Dependency Property and Attached Property aspects. | +| *PostSharp.Patterns.Threading.Redist* | *PostSharp.Patterns.Threading* | Threading models, thread dispatching aspects. | | *PostSharp.Patterns.Caching.Redist* | *PostSharp.Patterns.Caching* | Caching aspect. | | *PostSharp.Patterns.Caching.Redis* | N/A | Redis connector for *PostSharp.Patterns.Caching*. | | *PostSharp.Patterns.Caching.Azure* | N/A | Azure connector for *PostSharp.Patterns.Caching*. | diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index 0814597..a9f950b 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -22,6 +22,8 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * In both above cases, if your projects cannot be compatible with supported target frameworks, please continue using PostSharp 2024.0 LTS, which will be supported for at least a year after 2026.0 is made LTS. Qualifying Enterprise users can request longer support duration than this, which is handled on case-by-case basis. +* In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types that are intended for C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, we've decided to introduce support into the multicast engine. For more information refer to . + ## PostSharp Pattern Libraries * Dependencies of pattern libraries were upgraded to versions without known security vulnerabilities. @@ -34,3 +36,7 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * As mentioned before, if this affects you, we recommend staying on PostSharp 2024.0 LTS before you are able to upgrade to supported target frameworks. +* Deadlock detection support was removed from our packages. This component was deprecated in 2024.0 LTS and was not maintained since. + +* Undo-redo support is not considered obsolete and will not be maintained. The APIs will be removed in a future version. + diff --git a/conceptual/Misc/deprecated-features.md b/conceptual/Misc/deprecated-features.md index 08d43ad..27e2520 100644 --- a/conceptual/Misc/deprecated-features.md +++ b/conceptual/Misc/deprecated-features.md @@ -12,5 +12,4 @@ The following articles cover deprecated features. | Section | Description | |---------|-------------| | | This topic shows how to install PostSharp without NuGet. | -| | This topic shows how to detect deadlocks at runtime. | - +| | This topic shows how to detect deadlocks at runtime. | diff --git a/conceptual/Model/UndoRedo/undoredo-callbacks.md b/conceptual/Model/UndoRedo/undoredo-callbacks.md index e9c0dd9..908c017 100644 --- a/conceptual/Model/UndoRedo/undoredo-callbacks.md +++ b/conceptual/Model/UndoRedo/undoredo-callbacks.md @@ -7,6 +7,9 @@ summary: "The document explains how to use the IRecordableCallback interface in --- # Adding Callbacks on Undo and Redo +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + You may run into situations where you will want to execute some code before or after an object is being modified by an Undo or Redo operation. This capability is provided through the interface. In the following example, we output a message each time an undo or redo operation executes. diff --git a/conceptual/Model/UndoRedo/undoredo-conceptual.md b/conceptual/Model/UndoRedo/undoredo-conceptual.md index af24a0d..de5d574 100644 --- a/conceptual/Model/UndoRedo/undoredo-conceptual.md +++ b/conceptual/Model/UndoRedo/undoredo-conceptual.md @@ -7,6 +7,9 @@ summary: "The document explains the Recordable Aspect in PostSharp, which record --- # Understanding the Recordable Aspect +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + This section describes how the aspect is implemented. It helps developers and architects to understand the behavior and limitations of the aspect. diff --git a/conceptual/Model/UndoRedo/undoredo-limitations.md b/conceptual/Model/UndoRedo/undoredo-limitations.md index f2ddf19..68bb301 100644 --- a/conceptual/Model/UndoRedo/undoredo-limitations.md +++ b/conceptual/Model/UndoRedo/undoredo-limitations.md @@ -8,6 +8,9 @@ summary: "The document discusses the limitations of the PostSharp product, inclu ## Essentially Single-Threaded +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + But the class is intrinsically single-threaded. You can use recordable objects in a multithreaded context, but you should make sure that objects that share the same recorder are not accessed concurrently from several threads. Note that this is a limitation of the undo/redo concept, not a limitation of our implementation. diff --git a/conceptual/Model/UndoRedo/undoredo-operation-name.md b/conceptual/Model/UndoRedo/undoredo-operation-name.md index 3279870..5a13681 100644 --- a/conceptual/Model/UndoRedo/undoredo-operation-name.md +++ b/conceptual/Model/UndoRedo/undoredo-operation-name.md @@ -7,6 +7,9 @@ summary: "The document provides detailed steps on how to customize Undo/Redo ope --- # Customizing Undo/Redo Operation Names +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + The example of previous sections displays the list of operations appearing in the two UI buttons. That list of operations references the setters on the different individual properties in a very technical manner, for instance the operation of setting the first name is named `set_FirstName`, according to the name of the property in source code. End users will want to see the operations described in meaningful business terms, not technical ones. This article will show you how to explicitly name the recording operations that will take place in your code. diff --git a/conceptual/Model/UndoRedo/undoredo-recorder.md b/conceptual/Model/UndoRedo/undoredo-recorder.md index 31a29fe..a555bb8 100644 --- a/conceptual/Model/UndoRedo/undoredo-recorder.md +++ b/conceptual/Model/UndoRedo/undoredo-recorder.md @@ -7,6 +7,9 @@ summary: "The document provides instructions on how to manually assign recorders --- # Assigning Recorders Manually +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + By default, all recordable objects are attached to the global exposed on the property. There is nothing you have to do to make this happen. There may be circumstances where you want to create and assign your own recorder to the undo/redo process. There are two different ways that you can accomplish this. diff --git a/conceptual/Model/UndoRedo/undoredo-start.md b/conceptual/Model/UndoRedo/undoredo-start.md index 916a39a..0bc2802 100644 --- a/conceptual/Model/UndoRedo/undoredo-start.md +++ b/conceptual/Model/UndoRedo/undoredo-start.md @@ -7,6 +7,9 @@ summary: "The document provides a guide on making an object recordable for undo/ --- # Making Your Model Recordable +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + To make an object usable for undo/redo operations, you will need to add the aspect to the class. This aspect instruments changes to fields and records them into a . The aspect also instruments public methods to group field changes into logical operations. diff --git a/conceptual/Model/UndoRedo/undoredo-ui.md b/conceptual/Model/UndoRedo/undoredo-ui.md index 92e3c30..fedceb4 100644 --- a/conceptual/Model/UndoRedo/undoredo-ui.md +++ b/conceptual/Model/UndoRedo/undoredo-ui.md @@ -7,6 +7,9 @@ summary: "The document provides instructions on how to add Undo/Redo functionali --- # Adding Undo/Redo to the User Interface +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + The Undo/Redo functionality that you added to your codebase needs to be made available to the users. Users will want to have the ability to move forward and backward through the stack of recorded operations. diff --git a/conceptual/Model/UndoRedo/undoredo.md b/conceptual/Model/UndoRedo/undoredo.md index c673aac..61f5f2c 100644 --- a/conceptual/Model/UndoRedo/undoredo.md +++ b/conceptual/Model/UndoRedo/undoredo.md @@ -7,6 +7,9 @@ summary: "The document details how to use PostSharp's RecordableAttribute aspect --- # Undo/Redo +> [!CAUTION] +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. + Most business application users are familiar with applications that have the ability to undo and redo changes that they have made. It’s not common to see this functionality in custom built applications because it is quite difficult to do. Despite this difficulty, undo/redo is consistently mentioned on the top of users' wish list. The aspect makes it much easier to add undo/redo to your application by automatically appending changes done on your object model to a that you can then bind to your user interface. Unlike other approaches to undo/redo, the aspect only requires minimal changes to your source code. diff --git a/conceptual/Threading/deadlock-detection.md b/conceptual/Threading/deadlock-detection.md index 3a263d2..650d11a 100644 --- a/conceptual/Threading/deadlock-detection.md +++ b/conceptual/Threading/deadlock-detection.md @@ -1,140 +1,13 @@ --- uid: deadlock-detection -title: "Detecting Deadlocks at Runtime (Deprecated)" +title: "[Discontinued] Detecting Deadlocks at Runtime" product: "postsharp" categories: "PostSharp;AOP;Metaprogramming" -summary: "The document provides a guide on using Visual Studio Tools for Metalama and PostSharp to detect deadlocks in multithreaded code at runtime, either manually or using a wizard." +summary: "Notice that deadlock detection feature was removed." --- -# Detecting Deadlocks at Runtime +# Detecting Deadlocks at Runtime > [!CAUTION] -> is deprecated and should not be used. The aspect does not support async methods. +> Deadlock detection was deprecated in PostSharp 2024.0 and removed in PostSharp 2026.0. -A common problem that is found in multithreaded code is that multiple threads enter a situation where they are waiting for each other to finish. This is a deadlock situation and neither thread will complete executing in this situation. Because the threads are waiting on each other, neither is capable of providing diagnostic information to aid in debugging the situation. The helps provide this information. - - -## Adding deadlock detection using Visual Studio Tools for Metalama and PostSharp - - -### To apply the deadlock detection to your application with Visual Studio Tools for Metalama and PostSharp: - -1. Right click on your solution in Solution Explorer, select Add followed by PostSharp Policy... - - ![](deadlockdetection2.png) - - -2. In the Add PostSharp policy wizard, expand Threading and select Deadlock detection. - - ![](deadlockdetection3.png) - - -3. Select the projects that you would like to add deadlock detection to. - - > [!NOTE] - > You will need to add this to every project in your application. Excluding projects could cause your application to fail. - - ![](deadlockdetection4.png) - - -4. Review the configuration that you have selected and click Next. - - ![](deadlockdetection5.png) - - -5. Close the wizard when the process had completed by clicking Finish. - - ![](deadlockdetection6.png) - - -The result of running this wizard is that a *pssln* file has been added to your project. - -![](deadlockdetection7.png) - -The *pssln* file contains an entry that enables deadlock detection across all projects in your solution. - -```xml - - - - - -``` - - -## Manually adding deadlock detection to a project - - -### To manually add deadlock detection to a project: - -1. Add the *PostSharp.Patterns.Threading* NuGet package to the project. - - -2. Add the custom attribute to in any C# file. We recommend you add it to a new file named *GlobalAspects.cs*. - - ```csharp - [assembly: DeadlockDetectionPolicy] - ``` - - > [!NOTE] - > You will need to add this to every project in your application. Excluding projects could cause your application to fail. - - - -## Manually adding deadlock detection to the whole solution - -Adding deadlock detection at the solution level can also be done manually. This can be done by adding an entry to the *pssln* file in the solution. - - -### To manually add deadlock detection to a solution: - -1. Open the solution's *pssln* file. This can be found under the Solution Items folder in Visual Studio's Solution Explorer. - - ![](deadlockdetection7.png) - - If the *pssln* file doesn't exist manually add the file at the solution level. Name the file with the same name as your solution and the *pssln* file extension. - - -2. If you had to create the *pssln* file and add it to your solution add the following XML to it. If the *pssln* file already existed in your project proceed to the next step. - - ```xml - - - - ``` - - -3. Add a multicast attribute to the Project element that will add to all the projects in the solution. - - ```xml - - - - - - - ``` - - -4. Add the *PostSharp.Patterns.Threading* NuGet package to all projects in the solution. - - -Once you save the *pssln* file you will have added deadlock detection to all projects in your solution. - - -## Deadlock detection - -When a deadlock is detected a is thrown. The exception will include a detailed report of all the threads and locks involved in the deadlock. Here is an example of that. - -![](deadlockdetection1.PNG) - -## See Also - -**Reference** - - -
-
**Other Resources** - - -
-
+Deadlock detection was discontinued and is not distributed as part of PostSharp from version 2026.0 onward. \ No newline at end of file diff --git a/conceptual/toc.yml b/conceptual/toc.yml index fce8477..ae67403 100644 --- a/conceptual/toc.yml +++ b/conceptual/toc.yml @@ -392,21 +392,6 @@ items: topicUid: disposable - name: Working With Child Collections topicUid: advisable-collections - - name: Undo/Redo - topicUid: undoredo - items: - - name: Making Your Model Recordable - topicUid: undoredo-start - - name: Adding Undo/Redo to the User Interface - topicUid: undoredo-ui - - name: Customizing Undo/Redo Operation Names - topicUid: undoredo-operation-name - - name: Assigning Recorders Manually - topicUid: undoredo-recorder - - name: Adding Callbacks on Undo and Redo - topicUid: undoredo-callbacks - - name: Understanding the Recordable Aspect - topicUid: undoredo-conceptual - name: Caching topicUid: caching items: @@ -570,7 +555,20 @@ items: items: - name: Installing PostSharp without NuGet topicUid: install-without-nuget - - name: Detecting Deadlocks at Runtime - topicUid: deadlock-detection + - name: Undo/Redo + topicUid: undoredo + items: + - name: Making Your Model Recordable + topicUid: undoredo-start + - name: Adding Undo/Redo to the User Interface + topicUid: undoredo-ui + - name: Customizing Undo/Redo Operation Names + topicUid: undoredo-operation-name + - name: Assigning Recorders Manually + topicUid: undoredo-recorder + - name: Adding Callbacks on Undo and Redo + topicUid: undoredo-callbacks + - name: Understanding the Recordable Aspect + topicUid: undoredo-conceptual - name: API Reference topicUid: api From 0373d664250f0f8084d9e2e5dc61b31d5197b217 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Mon, 1 Dec 2025 08:17:43 +0100 Subject: [PATCH 03/21] Cleaning up. --- .../getting-started-architecture.md | 2 +- .../getting-started-development.md | 1 - .../Introduction/Overview/what-is-postsharp.md | 2 -- conceptual/Misc/deprecated-features.md | 2 +- conceptual/Threading/deadlockdetection1.PNG | Bin 111016 -> 0 bytes conceptual/Threading/deadlockdetection3.png | Bin 33247 -> 0 bytes conceptual/Threading/deadlockdetection4.png | Bin 31697 -> 0 bytes conceptual/Threading/deadlockdetection5.png | Bin 29173 -> 0 bytes conceptual/Threading/deadlockdetection6.png | Bin 21605 -> 0 bytes ...tection2.png => thread-safety-policy-1.png} | Bin ...tection7.png => thread-safety-policy-2.png} | Bin conceptual/Threading/thread-safety-policy.md | 8 ++++---- conceptual/index.md | 1 - 13 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 conceptual/Threading/deadlockdetection1.PNG delete mode 100644 conceptual/Threading/deadlockdetection3.png delete mode 100644 conceptual/Threading/deadlockdetection4.png delete mode 100644 conceptual/Threading/deadlockdetection5.png delete mode 100644 conceptual/Threading/deadlockdetection6.png rename conceptual/Threading/{deadlockdetection2.png => thread-safety-policy-1.png} (100%) rename conceptual/Threading/{deadlockdetection7.png => thread-safety-policy-2.png} (100%) diff --git a/conceptual/Introduction/GettingStarted/getting-started-architecture.md b/conceptual/Introduction/GettingStarted/getting-started-architecture.md index 009cc03..e07aaf7 100644 --- a/conceptual/Introduction/GettingStarted/getting-started-architecture.md +++ b/conceptual/Introduction/GettingStarted/getting-started-architecture.md @@ -37,7 +37,7 @@ PostSharp offers a number of different pre-built patterns. The following documen | Topic | Articles | |-------|----------| | General patterns |
| -| User interface patterns |
| +| User interface patterns |

| | Multithreading | [White Paper: Threading Models for Object-Oriented Programming](https://www.postsharp.net/downloads/documentation/Threading%20Models%20for%20OOP.pdf)

| | Diagnostics | | diff --git a/conceptual/Introduction/GettingStarted/getting-started-development.md b/conceptual/Introduction/GettingStarted/getting-started-development.md index a15fe55..dcda640 100644 --- a/conceptual/Introduction/GettingStarted/getting-started-development.md +++ b/conceptual/Introduction/GettingStarted/getting-started-development.md @@ -36,7 +36,6 @@ PostSharp offers a number of different pre-built patterns. You will need to lear | INotifyPropertyChanged | | | Aggregatable | | | Disposable | | -| Undo and Redo | | | Threading Models |
, , , , , ,

| | Dispatching Threads |
| | Architecture Validation |
| diff --git a/conceptual/Introduction/Overview/what-is-postsharp.md b/conceptual/Introduction/Overview/what-is-postsharp.md index 0e3a3ff..a434725 100644 --- a/conceptual/Introduction/Overview/what-is-postsharp.md +++ b/conceptual/Introduction/Overview/what-is-postsharp.md @@ -16,8 +16,6 @@ PostSharp provides implementations of some of the patterns that are the most com * Parent/child relationships: see . -* Undo/redo: see . - * Code contracts: see . * Logging: see . diff --git a/conceptual/Misc/deprecated-features.md b/conceptual/Misc/deprecated-features.md index 27e2520..17bcd60 100644 --- a/conceptual/Misc/deprecated-features.md +++ b/conceptual/Misc/deprecated-features.md @@ -12,4 +12,4 @@ The following articles cover deprecated features. | Section | Description | |---------|-------------| | | This topic shows how to install PostSharp without NuGet. | -| | This topic shows how to detect deadlocks at runtime. | +| | This chapter explains how to implement an undo/redo feature by making your model objects record their changes. | diff --git a/conceptual/Threading/deadlockdetection1.PNG b/conceptual/Threading/deadlockdetection1.PNG deleted file mode 100644 index da9a5ec966fbb7f2666f8ebbf52130ecf69aa35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111016 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
  • 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 diff --git a/conceptual/Threading/deadlockdetection4.png b/conceptual/Threading/deadlockdetection4.png deleted file mode 100644 index f4f7b210c257c8ac9e56d68f5dcab7ef5ce69624..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31697 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%0Ab~mjZ_^+pbI3Pz$$lVK5$Ca2C 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 ShXAQShY#57&)s+a`hNjqmTh|g diff --git a/conceptual/Threading/deadlockdetection6.png b/conceptual/Threading/deadlockdetection6.png deleted file mode 100644 index a50af67649bda7f2480c391ff2f1ed9f8bc3b9b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21605 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 diff --git a/conceptual/Threading/deadlockdetection2.png b/conceptual/Threading/thread-safety-policy-1.png similarity index 100% rename from conceptual/Threading/deadlockdetection2.png rename to conceptual/Threading/thread-safety-policy-1.png diff --git a/conceptual/Threading/deadlockdetection7.png b/conceptual/Threading/thread-safety-policy-2.png similarity index 100% rename from conceptual/Threading/deadlockdetection7.png rename to conceptual/Threading/thread-safety-policy-2.png diff --git a/conceptual/Threading/thread-safety-policy.md b/conceptual/Threading/thread-safety-policy.md index fbc4c9b..b6be83b 100644 --- a/conceptual/Threading/thread-safety-policy.md +++ b/conceptual/Threading/thread-safety-policy.md @@ -24,9 +24,9 @@ The thread-safety policy emits warnings in two situations: ### To apply the thread-safety policy to your application with Visual Studio Tools for Metalama and PostSharp: -1. Right click on your solution or your project in **Solution Explorer**, select **Add** followed by **PostSharp Policy...** +1. Right click on your solution or your project in **Solution Explorer**, select **Add** followed by **PostSharp Policy...** - ![](deadlockdetection2.png) + ![](thread-safety-policy-1.png) 2. In the **Add PostSharp policy** wizard, expand **Threading** and select **Thread Safety**. @@ -74,9 +74,9 @@ If you added the policy to the whole solution, the result of running this wizard ### To manually add the thread-safety policy to a whole solution: -1. Open the solution's *pssln* file. This can be found under the Solution Items folder in Visual Studio's Solution Explorer. +1. Open the solution's *pssln* file. This can be found under the Solution Items folder in Visual Studio's Solution Explorer. - ![](deadlockdetection7.png) + ![](thread-safety-policy-2.png) If the *pssln* file doesn't exist manually add the file at the solution level. Name the file with the same name as your solution and the *pssln* file extension. diff --git a/conceptual/index.md b/conceptual/index.md index fa2c439..0a3484d 100644 --- a/conceptual/index.md +++ b/conceptual/index.md @@ -25,7 +25,6 @@ Developers usually think in terms of design patterns, but with conventional prog | | This chapter explains how to transform a plain C# event into a weak event and avoid memory leaks. | | | This chapter covers: , and . | | | This chapter explains how to implement the Aggregatable pattern by annotating an object model with parent/child information, and how to implement a visitor. The Aggregatable pattern is the base of undo/redo patterns and threading models. | -| | This chapter explains how to implement an undo/redo feature by making your model objects record their changes. | | | This chapter explains how to add caching to your code. | | | This chapter covers multi-threading aspects: ; ; . | | | This chapter explains how to create your own aspects with PostSharp Aspect Framework. | From f39b61c0e148f19362cd2134029deef1502a4fd0 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Mon, 1 Dec 2025 11:06:26 +0100 Subject: [PATCH 04/21] Cleanup references to undo-redo in the rest of the doc. --- conceptual/Introduction/Benefits/solved-problems.md | 2 +- conceptual/Introduction/Overview/what-is-postsharp.md | 4 +--- conceptual/Misc/deprecated-features.md | 2 +- conceptual/XAML/xaml.md | 1 - conceptual/api.md | 6 +++--- conceptual/index.md | 2 +- 6 files changed, 7 insertions(+), 10 deletions(-) diff --git a/conceptual/Introduction/Benefits/solved-problems.md b/conceptual/Introduction/Benefits/solved-problems.md index 4c7e2e4..6083a8e 100644 --- a/conceptual/Introduction/Benefits/solved-problems.md +++ b/conceptual/Introduction/Benefits/solved-problems.md @@ -37,6 +37,6 @@ Conventional programming languages miss a concept of pattern, therefore patterns * **Too much knowledge required**. When new team members come to work on a specific feature, they often must first learn about caching, threading and other highly technical issues before being able to contribute to the business value: an example of bad division of labor. -* **Long feedback loops**. Even with small development teams, common patterns like diagnostics, logging, threading, INotifyPropertyChanged and undo/redo can be handled differently by each developer. Architects need to make sure new team members understand and follow the internal design standards and have to spend more time on manual code reviews--delaying progress while new team members wait to get feedback from code review. +* **Long feedback loops**. Even with small development teams, common patterns like diagnostics, logging, threading, and INotifyPropertyChanged can be handled differently by each developer. Architects need to make sure new team members understand and follow the internal design standards and have to spend more time on manual code reviews--delaying progress while new team members wait to get feedback from code review. diff --git a/conceptual/Introduction/Overview/what-is-postsharp.md b/conceptual/Introduction/Overview/what-is-postsharp.md index a434725..48e3f16 100644 --- a/conceptual/Introduction/Overview/what-is-postsharp.md +++ b/conceptual/Introduction/Overview/what-is-postsharp.md @@ -23,7 +23,7 @@ PostSharp provides implementations of some of the patterns that are the most com ### Example -The following code snippet illustrates an object model where , undo/redo, code contracts, aggregation and code contracts are all implemented using PostSharp ready-made attributes. +The following code snippet illustrates an object model where , code contracts, and aggregation are all implemented using PostSharp ready-made attributes. ```csharp [NotifyPropertyChanged] @@ -36,7 +36,6 @@ public class CustomerViewModel } [NotifyPropertyChanged] -[Recordable] public class Customer { public string FirstName { get; set; } @@ -56,7 +55,6 @@ public class Customer } [NotifyPropertyChanged] -[Recordable] public class Address { [Parent] diff --git a/conceptual/Misc/deprecated-features.md b/conceptual/Misc/deprecated-features.md index 17bcd60..074db43 100644 --- a/conceptual/Misc/deprecated-features.md +++ b/conceptual/Misc/deprecated-features.md @@ -5,7 +5,7 @@ product: "postsharp" categories: "PostSharp;AOP;Metaprogramming" summary: "The document lists articles for past features of PostSharp which were deprecated." --- -# Hacking +# Deprecated Features The following articles cover deprecated features. diff --git a/conceptual/XAML/xaml.md b/conceptual/XAML/xaml.md index 545b5b1..810cab7 100644 --- a/conceptual/XAML/xaml.md +++ b/conceptual/XAML/xaml.md @@ -25,6 +25,5 @@ Additionally, if you are writing a XAML application, you may be interested in th | | This chapter shows how to automatically implement the interface without boilerplate code. | | | This chapter describes how to validate the value of your fields, properties and parameters with custom attributes. | | | This article shows how to turn normal events into weak events and prevent memory leaks. | -| | This chapter explains how to add undo/redo to your application with a minimum of handwritten code. | diff --git a/conceptual/api.md b/conceptual/api.md index fc2452f..3ac25da 100644 --- a/conceptual/api.md +++ b/conceptual/api.md @@ -28,8 +28,8 @@ PostSharp is a design pattern automation tool for Microsoft .NET. | | This namespace contains an implementation of the Observer, Aggregatable and Disposable patterns. | | | This namespace contains an implementation of several threading models, and other thread dispatching aspects. | | | This namespace defines collection classes that work with the Aggregatable pattern. | -| | This namespace implements the undo/redo feature. | -| | This namespace defines recordable operations. | +| | This namespace implements the undo/redo feature (deprecated). | +| | This namespace defines recordable operations (deprecated). | | | This namespace allows to emit build-time log records. | | | This is the root namespace for all ready-made implementation of patterns. | | | This namespace contains an API to cache method return values as a result of their arguments. | @@ -65,7 +65,7 @@ PostSharp is a design pattern automation tool for Microsoft .NET. | | This namespaces contains aspects that instrument the System.Threading namespace. | | | This namespace defines the abstractions for dynamically advisable classes, i.e. classes of objects into which behaviors can be injected at run time. | | | This namespace contains the implementation of formatters for values of different types. | -| | This namespaces contains XAML controls for the undo/redo feature. | +| | This namespaces contains XAML controls for the undo/redo feature (deprecated). | | | This namespace defines abstractions that allow to use the Aggregatable pattern with third-party types. | | | This namespace contains the implementation of different threading models. | | | This namespace contains unsorted types. | diff --git a/conceptual/index.md b/conceptual/index.md index 0a3484d..635bde4 100644 --- a/conceptual/index.md +++ b/conceptual/index.md @@ -24,7 +24,7 @@ Developers usually think in terms of design patterns, but with conventional prog | | This chapter explains how to automatically implement the interface. | | | This chapter explains how to transform a plain C# event into a weak event and avoid memory leaks. | | | This chapter covers: , and . | -| | This chapter explains how to implement the Aggregatable pattern by annotating an object model with parent/child information, and how to implement a visitor. The Aggregatable pattern is the base of undo/redo patterns and threading models. | +| | This chapter explains how to implement the Aggregatable pattern by annotating an object model with parent/child information, and how to implement a visitor. The Aggregatable pattern is the base of threading models. | | | This chapter explains how to add caching to your code. | | | This chapter covers multi-threading aspects: ; ; . | | | This chapter explains how to create your own aspects with PostSharp Aspect Framework. | From 48edcaaea9fe04b3e86eb51084be755a5b7d8326 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Mon, 1 Dec 2025 16:33:41 +0100 Subject: [PATCH 05/21] Document extension block multicast support. --- .../Applying/extension-blocks-multicast.md | 180 ++++++++++++++++++ conceptual/toc.yml | 2 + 2 files changed, 182 insertions(+) create mode 100644 conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md new file mode 100644 index 0000000..d4977d7 --- /dev/null +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -0,0 +1,180 @@ +--- +uid: extension-blocks-multicast +title: "C# 14 Extension Blocks and Multicasting" +product: "postsharp" +categories: "PostSharp;AOP;Metaprogramming" +summary: "Explains how C# 14 extension blocks are handled by PostSharp's multicast engine in PostSharp 2026.0, including the AllowExtensionBlockMembers property." +--- +# C# 14 Extension Blocks and Multicasting + + +## Overview + +Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the `AllowExtensionBlockMembers` property. + + +## What Are Extension Blocks? + +C# 14 introduces a new syntax for declaring extension members using `extension` blocks within static classes. Extension blocks allow you to define extension methods and properties, including static extension members that appear to extend the type itself rather than instances. + +Example: + +```csharp +public static class TestClassExtensions +{ + extension(TInstance instance) + { + // Instance extension property + public TInstance ExtensionProperty + { + get => instance; + set { } + } + + // Static extension property + public static int StaticExtensionProperty + { + get => 42; + set { } + } + + // Instance extension method + public TInstance ExtensionMethod() => instance; + + // Static extension method + public static void StaticExtensionMethod() { } + } +} +``` + + +## How Extension Blocks Are Implemented in IL + +In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, PostSharp 2026.0 introduces explicit opt-in support into the multicast engine. + + +## Applying Aspects to Extension Block Members + +By default, PostSharp does not apply aspects or multicast attributes to members declared within extension blocks. This is a safety measure to avoid unintended behavior, as extension block members have unique characteristics that differ from regular methods and properties. + +Extension block metadata are always skipped by multicasting, but may still be targeted by and by mistake. Doing this will result in an error. + +### Enabling Extension Block Support + +To apply aspects to extension block members, set the `AllowExtensionBlockMembers` property to `true`. This property is available on: + +- - Set this property when applying the aspect to control whether it targets extension block members. +- - Set this property on the aspect class definition to change the default behavior. + + +### Example: Applying Aspects to Extension Methods + +```csharp +[PSerializable] +class LoggingAspect : OnMethodBoundaryAspect +{ + public override void OnEntry(MethodExecutionArgs args) + { + Console.WriteLine($"Entering: {args.Method.Name}"); + } +} + +public static class TestClassExtensions +{ + extension(TInstance instance) + { + [LoggingAspect(AllowExtensionBlockMembers = true)] + public TInstance ExtensionMethod() => instance; + + [LoggingAspect(AllowExtensionBlockMembers = true)] + public static void StaticExtensionMethod() { } + } +} +``` + + +### Example: Applying Aspects to Extension Property Accessors + +Extension properties can also have aspects applied to their accessors: + +```csharp +public static class TestClassExtensions +{ + extension(TInstance instance) + { + public TInstance ExtensionProperty + { + [LoggingAspect(AllowExtensionBlockMembers = true)] + get => instance; + + [LoggingAspect(AllowExtensionBlockMembers = true)] + set { } + } + } +} +``` + + +### Example: Changing Default Behavior for Custom Aspects + +When developing a custom aspect, you can allow extension block members by default by setting the property on the aspect class: + +```csharp +[MulticastAttributeUsage(MulticastTargets.Method, AllowExtensionBlockMembers = true)] +[PSerializable] +public class ExtensionFriendlyAspect : OnMethodBoundaryAspect +{ + // Aspect implementation +} +``` + + +## Multicast Filtering Behavior + +When applying aspects using multicast to a type containing extension blocks: + +- **Default behavior**: Extension block members are excluded from multicasting +- **With `AllowExtensionBlockMembers = true`**: Extension block members are included in multicasting + +Example of multicasting with extension blocks: + +```csharp +[MulticastAttributeUsage(MulticastTargets.All, PersistMetaData = true, AllowExtensionBlockMembers = true)] +class AttributeWithExtensionMembers : MulticastAttribute +{ +} + +[AttributeWithExtensionMembers] +public static class TestClassExtensions +{ + extension(TInstance instance) + { + // This method will receive the attribute because AllowExtensionBlockMembers = true + public TInstance ExtensionMethod() => instance; + } + + // Classic extension methods are always included + public static void ClassicExtensionMethod(this TInstance instance) + { + } +} +``` + + +## Backward Compatibility + +Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` property. They are always eligible for aspect application according to existing multicast rules. + + +## See Also + + +
    +
    +
    +
    + +**External Resources:** +- [C# 14 Extension Members - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extension) +- [Exploring extension members - .NET Blog](https://devblogs.microsoft.com/dotnet/csharp-exploring-extension-members/) +- [What's new in C# 14 - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14) diff --git a/conceptual/toc.yml b/conceptual/toc.yml index ae67403..749a89b 100644 --- a/conceptual/toc.yml +++ b/conceptual/toc.yml @@ -253,6 +253,8 @@ items: items: - name: Understanding Attribute Multicasting topicUid: multicast-conceptual + - name: C# 14 Extension Blocks and Multicasting + topicUid: extension-blocks-multicast - name: Adding Aspects to Derived Classes and Methods Using Attributes topicUid: aspect-inheritance items: From f8693cba5a763afe3ea4ca695b76feb78ee4c121 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Mon, 1 Dec 2025 16:49:02 +0100 Subject: [PATCH 06/21] Finished review changes. --- .../Deployment/requirements-20260.md | 6 +++--- conceptual/Introduction/WhatsNew/breaking-changes-20260.md | 6 ++++++ conceptual/Introduction/WhatsNew/whats-new-20260.md | 4 ++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md index 365aee7..99fdfc5 100644 --- a/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md @@ -5,7 +5,7 @@ product: "postsharp" categories: "PostSharp;AOP;Metaprogramming" summary: "PostSharp 2026.0 supports C# 14.0 or earlier and VB 16.9 or earlier. It requires Microsoft Visual Studio 2022 or 2026, .NET Framework 4.7.2 or later, and is compatible with various operating systems and .NET SDK versions. It also supports Blazor via .NET Standard." --- -# PostSharp 2025.1: Requirements and Compatibility +# PostSharp 2026.0: Requirements and Compatibility You can use PostSharp to build applications that target a wide range of target devices. This article lists the requirements for development, build and end-user devices. @@ -33,7 +33,7 @@ This section lists the supported platforms, and most importantly platform versio The following software components need to be installed before PostSharp can be used: * Any of the following versions of Microsoft Visual Studio: - * Visual Studio 2022 (17.14 and later). + * Visual Studio 2022 (17.12 and later). * Visual Studio 2026 (18.0 and later). The debugging experience may be inconsistent with other IDEs than Visual Studio or when PostSharp Tools for Visual Studio are not installed. @@ -97,7 +97,7 @@ The following table displays the versions of the target frameworks that are supp > %% Each PostSharp.Patterns.Caching caching backend has different set of supported target frameworks. Please refer to individual packages on [nuget.org](http://www.nuget.org). > [!NOTE] -> # .NET 6.0 is no longer suported by Microsoft. Although we still provide libraries targeting it, we no longer run our tests on this specific version of the .NET. We recommend using a supported version of .NET runtime in your final application. +> # .NET 6.0 is no longer supported by Microsoft. Although we still provide libraries targeting it, we no longer run our tests on this specific version of the .NET. We recommend using a supported version of .NET runtime in your final application. ## Compatibility with deprecated versions of .NET Core and .NET diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md index 888dc7a..2675d7a 100644 --- a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -7,6 +7,10 @@ summary: "PostSharp 2026.0 introduces major breaking changes including discontin --- # Breaking Changes in PostSharp 2026.0 +PostSharp 2026.0 removes API for `[DeadlockDetectionPolicy]` after being deprecated since 2024.0. + +PostSharp 2026.0 deprecates the support for `[Recordable]` aspect and related APIs. + PostSharp 2026.0 contains major breaking changes related to platform discontinuation. ## PostSharp.Redist @@ -120,12 +124,14 @@ PostSharp 2026.0 contains major breaking changes related to platform discontinua * Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. ## PostSharp.Patterns.Model.Redist +* `[Recordable]` aspect and related APIs are not marked as obsolete and should not be used. These APIs will not be maintained and will be removed in a future release. * Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. * Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. * Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. * Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. ## PostSharp.Patterns.Threading.Redist +* `DeadlockDetectionPolicy` and related APIs were removed. * Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. * Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. * Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index a9f950b..338618f 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -36,7 +36,7 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * As mentioned before, if this affects you, we recommend staying on PostSharp 2024.0 LTS before you are able to upgrade to supported target frameworks. -* Deadlock detection support was removed from our packages. This component was deprecated in 2024.0 LTS and was not maintained since. +* Deadlock detection support and APIs were removed from our packages. This component was deprecated in 2024.0 LTS and was not maintained since. -* Undo-redo support is not considered obsolete and will not be maintained. The APIs will be removed in a future version. +* Undo-redo patterns and `[Recordable]` aspect are now considered obsolete and will not be maintained. The APIs will be removed in a future version. From aec5052bc5ef1b5e958c836f8c23df76ca849d0f Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Mon, 1 Dec 2025 17:02:00 +0100 Subject: [PATCH 07/21] Fixed formatting. --- .../Aspects/Applying/extension-blocks-multicast.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index d4977d7..4edc5c1 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -174,7 +174,6 @@ Classic extension methods using the `this` modifier continue to work as before a

    -**External Resources:** -- [C# 14 Extension Members - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extension) -- [Exploring extension members - .NET Blog](https://devblogs.microsoft.com/dotnet/csharp-exploring-extension-members/) -- [What's new in C# 14 - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14) +**Other Resources** +
    [C# 14 Extension Members - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extension) +
    [Exploring extension members - .NET Blog](https://devblogs.microsoft.com/dotnet/csharp-exploring-extension-members/) From bb971c97bf0d2f9497df107ef93af6a33e8b1b1a Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Tue, 2 Dec 2025 14:45:35 +0100 Subject: [PATCH 08/21] Edit the new file to restore state overwritten by Claude Code. --- .../Applying/extension-blocks-multicast.md | 129 ++++++------------ 1 file changed, 44 insertions(+), 85 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index 4edc5c1..bbbcaa0 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -10,64 +10,26 @@ summary: "Explains how C# 14 extension blocks are handled by PostSharp's multica ## Overview -Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the `AllowExtensionBlockMembers` property. - - -## What Are Extension Blocks? - -C# 14 introduces a new syntax for declaring extension members using `extension` blocks within static classes. Extension blocks allow you to define extension methods and properties, including static extension members that appear to extend the type itself rather than instances. - -Example: - -```csharp -public static class TestClassExtensions -{ - extension(TInstance instance) - { - // Instance extension property - public TInstance ExtensionProperty - { - get => instance; - set { } - } - - // Static extension property - public static int StaticExtensionProperty - { - get => 42; - set { } - } - - // Instance extension method - public TInstance ExtensionMethod() => instance; - - // Static extension method - public static void StaticExtensionMethod() { } - } -} -``` +Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the and properties. +Extension block metadata may still be targeted by and by mistake. Doing this will result in an error. ## How Extension Blocks Are Implemented in IL -In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, PostSharp 2026.0 introduces explicit opt-in support into the multicast engine. - - -## Applying Aspects to Extension Block Members - -By default, PostSharp does not apply aspects or multicast attributes to members declared within extension blocks. This is a safety measure to avoid unintended behavior, as extension block members have unique characteristics that differ from regular methods and properties. - -Extension block metadata are always skipped by multicasting, but may still be targeted by and by mistake. Doing this will result in an error. +C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds an explicit opt-in support for extension block implementation methods. ### Enabling Extension Block Support -To apply aspects to extension block members, set the `AllowExtensionBlockMembers` property to `true`. This property is available on: +To apply aspects to extension block members one of following actions needs to be taken: -- - Set this property when applying the aspect to control whether it targets extension block members. -- - Set this property on the aspect class definition to change the default behavior. +- add the aspect directly to the extension block member. +- set the property to true when applying the aspect. +- add to the aspect type and set to true. -### Example: Applying Aspects to Extension Methods +### Example: Applying Aspects directly to extension members + +When applied explicitly to extension members, aspects are added without need to change any of the properties. ```csharp [PSerializable] @@ -83,79 +45,76 @@ public static class TestClassExtensions { extension(TInstance instance) { - [LoggingAspect(AllowExtensionBlockMembers = true)] + [LoggingAspect] public TInstance ExtensionMethod() => instance; - [LoggingAspect(AllowExtensionBlockMembers = true)] - public static void StaticExtensionMethod() { } + [LoggingAspect] + public TInstance ExtensionProperty + { + get => instance; + set { } + } } } ``` +### Example: Multicasting with AllowExtensionBlockMembers set to true -### Example: Applying Aspects to Extension Property Accessors - -Extension properties can also have aspects applied to their accessors: +After setting to true and multicasting on the whole class, members within extension blocks will be eligible for the aspect. ```csharp +[PSerializable] +class LoggingAspect : OnMethodBoundaryAspect +{ + public override void OnEntry(MethodExecutionArgs args) + { + Console.WriteLine($"Entering: {args.Method.Name}"); + } +} + +[LoggingAspect(AllowExtensionBlockMembers = true)] public static class TestClassExtensions { extension(TInstance instance) { + public TInstance ExtensionMethod() => instance; + public TInstance ExtensionProperty { - [LoggingAspect(AllowExtensionBlockMembers = true)] get => instance; - - [LoggingAspect(AllowExtensionBlockMembers = true)] set { } } } } ``` - ### Example: Changing Default Behavior for Custom Aspects -When developing a custom aspect, you can allow extension block members by default by setting the property on the aspect class: +Setting the property to true on the aspect class removed will make extension members to automatically eligible for the aspect: ```csharp [MulticastAttributeUsage(MulticastTargets.Method, AllowExtensionBlockMembers = true)] [PSerializable] -public class ExtensionFriendlyAspect : OnMethodBoundaryAspect -{ - // Aspect implementation -} -``` - - -## Multicast Filtering Behavior - -When applying aspects using multicast to a type containing extension blocks: - -- **Default behavior**: Extension block members are excluded from multicasting -- **With `AllowExtensionBlockMembers = true`**: Extension block members are included in multicasting - -Example of multicasting with extension blocks: - -```csharp -[MulticastAttributeUsage(MulticastTargets.All, PersistMetaData = true, AllowExtensionBlockMembers = true)] -class AttributeWithExtensionMembers : MulticastAttribute +public class LoggingAspect : OnMethodBoundaryAspect { + public override void OnEntry(MethodExecutionArgs args) + { + Console.WriteLine($"Entering: {args.Method.Name}"); + } } -[AttributeWithExtensionMembers] +[LoggingAspect] public static class TestClassExtensions { extension(TInstance instance) { - // This method will receive the attribute because AllowExtensionBlockMembers = true public TInstance ExtensionMethod() => instance; - } - // Classic extension methods are always included - public static void ClassicExtensionMethod(this TInstance instance) - { + public TInstance ExtensionProperty + { + get => instance; + set { } + } } } ``` @@ -163,7 +122,7 @@ public static class TestClassExtensions ## Backward Compatibility -Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` property. They are always eligible for aspect application according to existing multicast rules. +Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` properties. They are always eligible for aspect application according to existing multicast rules. ## See Also From 0d927ab21fd0a107f6057379463a2c12c3d2654c Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Tue, 2 Dec 2025 15:10:06 +0100 Subject: [PATCH 09/21] Fixed grammar. --- .../Applying/extension-blocks-multicast.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index bbbcaa0..d848f30 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -10,26 +10,26 @@ summary: "Explains how C# 14 extension blocks are handled by PostSharp's multica ## Overview -Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the and properties. +Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the property. Extension block metadata may still be targeted by and by mistake. Doing this will result in an error. ## How Extension Blocks Are Implemented in IL -C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds an explicit opt-in support for extension block implementation methods. +The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds explicit opt-in support for extension block implementation methods. ### Enabling Extension Block Support -To apply aspects to extension block members one of following actions needs to be taken: +To apply aspects to extension block members, one of the following actions needs to be taken: -- add the aspect directly to the extension block member. -- set the property to true when applying the aspect. -- add to the aspect type and set to true. +- Add the aspect directly to the extension block member. +- Set the property to `true` when applying the aspect. +- Add to the aspect type and set to `true`. -### Example: Applying Aspects directly to extension members +### Example: Applying aspects directly to extension members -When applied explicitly to extension members, aspects are added without need to change any of the properties. +When applied explicitly to extension members, aspects are added without the need to change any of the properties. ```csharp [PSerializable] @@ -60,7 +60,7 @@ public static class TestClassExtensions ### Example: Multicasting with AllowExtensionBlockMembers set to true -After setting to true and multicasting on the whole class, members within extension blocks will be eligible for the aspect. +After setting to `true` and multicasting on the whole class, members within extension blocks will be eligible for the aspect. ```csharp [PSerializable] @@ -88,9 +88,9 @@ public static class TestClassExtensions } ``` -### Example: Changing Default Behavior for Custom Aspects +### Example: Changing default behavior for custom aspects -Setting the property to true on the aspect class removed will make extension members to automatically eligible for the aspect: +Setting the property to `true` on the aspect class will make extension members automatically eligible for the aspect: ```csharp [MulticastAttributeUsage(MulticastTargets.Method, AllowExtensionBlockMembers = true)] @@ -122,7 +122,7 @@ public static class TestClassExtensions ## Backward Compatibility -Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` properties. They are always eligible for aspect application according to existing multicast rules. +Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` property. They are always eligible for aspect application according to existing multicast rules. ## See Also From e47b01f5bf7497509e823497461e0f4136d53cac Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Tue, 2 Dec 2025 17:21:26 +0100 Subject: [PATCH 10/21] Update the note about aspect/advice provider. --- .../Aspects/Applying/extension-blocks-multicast.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index d848f30..a5ee9b4 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -12,13 +12,13 @@ summary: "Explains how C# 14 extension blocks are handled by PostSharp's multica Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the property. -Extension block metadata may still be targeted by and by mistake. Doing this will result in an error. +Using and on extension members is not limited and will apply aspects and advices. Targeting extension block metadata will result in an error. ## How Extension Blocks Are Implemented in IL The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds explicit opt-in support for extension block implementation methods. -### Enabling Extension Block Support +## Enabling Extension Block Support To apply aspects to extension block members, one of the following actions needs to be taken: @@ -26,7 +26,6 @@ To apply aspects to extension block members, one of the following actions needs - Set the property to `true` when applying the aspect. - Add to the aspect type and set to `true`. - ### Example: Applying aspects directly to extension members When applied explicitly to extension members, aspects are added without the need to change any of the properties. From 7f4c8934079a62ead02e8a53d00790257040b824 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 11:10:39 +0100 Subject: [PATCH 11/21] Fixes. --- conceptual/Introduction/WhatsNew/breaking-changes-20260.md | 2 +- conceptual/Introduction/WhatsNew/whats-new.md | 1 + conceptual/Model/UndoRedo/undoredo-callbacks.md | 2 +- conceptual/Model/UndoRedo/undoredo-conceptual.md | 2 +- conceptual/Model/UndoRedo/undoredo-limitations.md | 2 +- conceptual/Model/UndoRedo/undoredo-operation-name.md | 2 +- conceptual/Model/UndoRedo/undoredo-recorder.md | 2 +- conceptual/Model/UndoRedo/undoredo-start.md | 2 +- conceptual/Model/UndoRedo/undoredo-ui.md | 2 +- conceptual/Model/UndoRedo/undoredo.md | 2 +- conceptual/Threading/thread-safety-policy.md | 2 +- 11 files changed, 11 insertions(+), 10 deletions(-) diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md index 2675d7a..59672d0 100644 --- a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -124,7 +124,7 @@ PostSharp 2026.0 contains major breaking changes related to platform discontinua * Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. ## PostSharp.Patterns.Model.Redist -* `[Recordable]` aspect and related APIs are not marked as obsolete and should not be used. These APIs will not be maintained and will be removed in a future release. +* `[Recordable]` aspect and related APIs are now marked as obsolete and should not be used. These APIs will not be maintained and will be removed in a future release. * Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. * Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. * Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. diff --git a/conceptual/Introduction/WhatsNew/whats-new.md b/conceptual/Introduction/WhatsNew/whats-new.md index e5f574b..7565613 100644 --- a/conceptual/Introduction/WhatsNew/whats-new.md +++ b/conceptual/Introduction/WhatsNew/whats-new.md @@ -12,6 +12,7 @@ PostSharp has been around since the early days of .NET 2.0 in 2004. Since the fi This chapter contains the following sections: * +* * * * diff --git a/conceptual/Model/UndoRedo/undoredo-callbacks.md b/conceptual/Model/UndoRedo/undoredo-callbacks.md index 908c017..88ab777 100644 --- a/conceptual/Model/UndoRedo/undoredo-callbacks.md +++ b/conceptual/Model/UndoRedo/undoredo-callbacks.md @@ -8,7 +8,7 @@ summary: "The document explains how to use the IRecordableCallback interface in # Adding Callbacks on Undo and Redo > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. You may run into situations where you will want to execute some code before or after an object is being modified by an Undo or Redo operation. This capability is provided through the interface. diff --git a/conceptual/Model/UndoRedo/undoredo-conceptual.md b/conceptual/Model/UndoRedo/undoredo-conceptual.md index de5d574..19b51f6 100644 --- a/conceptual/Model/UndoRedo/undoredo-conceptual.md +++ b/conceptual/Model/UndoRedo/undoredo-conceptual.md @@ -8,7 +8,7 @@ summary: "The document explains the Recordable Aspect in PostSharp, which record # Understanding the Recordable Aspect > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. This section describes how the aspect is implemented. It helps developers and architects to understand the behavior and limitations of the aspect. diff --git a/conceptual/Model/UndoRedo/undoredo-limitations.md b/conceptual/Model/UndoRedo/undoredo-limitations.md index 68bb301..5fabc40 100644 --- a/conceptual/Model/UndoRedo/undoredo-limitations.md +++ b/conceptual/Model/UndoRedo/undoredo-limitations.md @@ -9,7 +9,7 @@ summary: "The document discusses the limitations of the PostSharp product, inclu ## Essentially Single-Threaded > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. But the class is intrinsically single-threaded. You can use recordable objects in a multithreaded context, but you should make sure that objects that share the same recorder are not accessed concurrently from several threads. Note that this is a limitation of the undo/redo concept, not a limitation of our implementation. diff --git a/conceptual/Model/UndoRedo/undoredo-operation-name.md b/conceptual/Model/UndoRedo/undoredo-operation-name.md index 5a13681..4d87890 100644 --- a/conceptual/Model/UndoRedo/undoredo-operation-name.md +++ b/conceptual/Model/UndoRedo/undoredo-operation-name.md @@ -8,7 +8,7 @@ summary: "The document provides detailed steps on how to customize Undo/Redo ope # Customizing Undo/Redo Operation Names > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. The example of previous sections displays the list of operations appearing in the two UI buttons. That list of operations references the setters on the different individual properties in a very technical manner, for instance the operation of setting the first name is named `set_FirstName`, according to the name of the property in source code. diff --git a/conceptual/Model/UndoRedo/undoredo-recorder.md b/conceptual/Model/UndoRedo/undoredo-recorder.md index a555bb8..a2b4895 100644 --- a/conceptual/Model/UndoRedo/undoredo-recorder.md +++ b/conceptual/Model/UndoRedo/undoredo-recorder.md @@ -8,7 +8,7 @@ summary: "The document provides instructions on how to manually assign recorders # Assigning Recorders Manually > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. By default, all recordable objects are attached to the global exposed on the property. There is nothing you have to do to make this happen. There may be circumstances where you want to create and assign your own recorder to the undo/redo process. There are two different ways that you can accomplish this. diff --git a/conceptual/Model/UndoRedo/undoredo-start.md b/conceptual/Model/UndoRedo/undoredo-start.md index 0bc2802..7fa4737 100644 --- a/conceptual/Model/UndoRedo/undoredo-start.md +++ b/conceptual/Model/UndoRedo/undoredo-start.md @@ -8,7 +8,7 @@ summary: "The document provides a guide on making an object recordable for undo/ # Making Your Model Recordable > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. To make an object usable for undo/redo operations, you will need to add the aspect to the class. This aspect instruments changes to fields and records them into a . The aspect also instruments public methods to group field changes into logical operations. diff --git a/conceptual/Model/UndoRedo/undoredo-ui.md b/conceptual/Model/UndoRedo/undoredo-ui.md index fedceb4..19913ec 100644 --- a/conceptual/Model/UndoRedo/undoredo-ui.md +++ b/conceptual/Model/UndoRedo/undoredo-ui.md @@ -8,7 +8,7 @@ summary: "The document provides instructions on how to add Undo/Redo functionali # Adding Undo/Redo to the User Interface > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. The Undo/Redo functionality that you added to your codebase needs to be made available to the users. Users will want to have the ability to move forward and backward through the stack of recorded operations. diff --git a/conceptual/Model/UndoRedo/undoredo.md b/conceptual/Model/UndoRedo/undoredo.md index 61f5f2c..b49bfe4 100644 --- a/conceptual/Model/UndoRedo/undoredo.md +++ b/conceptual/Model/UndoRedo/undoredo.md @@ -8,7 +8,7 @@ summary: "The document details how to use PostSharp's RecordableAttribute aspect # Undo/Redo > [!CAUTION] -> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be remoed in the future. +> Undo/Redo was deprecated in PostSharp 2026.0 and will not be maintained. The API will be removed in the future. Most business application users are familiar with applications that have the ability to undo and redo changes that they have made. It’s not common to see this functionality in custom built applications because it is quite difficult to do. Despite this difficulty, undo/redo is consistently mentioned on the top of users' wish list. diff --git a/conceptual/Threading/thread-safety-policy.md b/conceptual/Threading/thread-safety-policy.md index b6be83b..aa5d503 100644 --- a/conceptual/Threading/thread-safety-policy.md +++ b/conceptual/Threading/thread-safety-policy.md @@ -60,7 +60,7 @@ If you added the policy to the whole solution, the result of running this wizard 1. Add the *PostSharp.Patterns.Threading* NuGet package to the project. -2. Add the any C# file. We recommend you add it to a new file named *GlobalAspects.cs*. +2. Add the to any C# file. We recommend you add it to a new file named *GlobalAspects.cs*. ```csharp using PostSharp.Patterns.Threading; From 7b61c139b909b51f7cb38c6ff18e1fd42100ae31 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 12:00:41 +0100 Subject: [PATCH 12/21] Minor formatting fix. --- .../DeploymentConfiguration/Deployment/requirements-20260.md | 1 - conceptual/Introduction/WhatsNew/breaking-changes-20260.md | 1 - conceptual/Introduction/WhatsNew/whats-new-20251.md | 2 +- conceptual/Introduction/WhatsNew/whats-new-20260.md | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md index 99fdfc5..545bd2c 100644 --- a/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md @@ -195,4 +195,3 @@ PostSharp is not compatible with the following products or features: | Universal Windows Platform (UWP) | Not supported (low customer demand) | Contact PostSharp support team. | | Mono, Unity3D | Unsupported | None. | | Xamarin | Unsupported | Use Microsoft MAUI. | - diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md index 59672d0..da36ab3 100644 --- a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -142,4 +142,3 @@ PostSharp 2026.0 contains major breaking changes related to platform discontinua * Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. * Projects targeting .NET Framework 4.5 to 4.7, .NET Core 3.0 to 3.1 are unsupported. * Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. - diff --git a/conceptual/Introduction/WhatsNew/whats-new-20251.md b/conceptual/Introduction/WhatsNew/whats-new-20251.md index b9b68d6..3de66ee 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20251.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20251.md @@ -25,4 +25,4 @@ PostSharp releases are located in branches with a `release` prefix. For example, See README.md in the cloned repo for details about requirements and build instructions. These instructions are likely to change in future versions. -Currently only public NuGet package build using Docker is supported and all other operations are without support. \ No newline at end of file +Currently only public NuGet package build using Docker is supported and all other operations are without support. diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index 338618f..86ca7ef 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -39,4 +39,3 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * Deadlock detection support and APIs were removed from our packages. This component was deprecated in 2024.0 LTS and was not maintained since. * Undo-redo patterns and `[Recordable]` aspect are now considered obsolete and will not be maintained. The APIs will be removed in a future version. - From fa192727959a0db41a9ab0fd1cb5e2c6e362ab41 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 14:15:39 +0100 Subject: [PATCH 13/21] Moved IAspectProvider note about extension member to the appropriate file. --- .../Aspects/Applying/extension-blocks-multicast.md | 6 +++--- .../Aspects/Applying/iaspectprovider.md | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index a5ee9b4..c21bff8 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -12,11 +12,11 @@ summary: "Explains how C# 14 extension blocks are handled by PostSharp's multica Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the property. -Using and on extension members is not limited and will apply aspects and advices. Targeting extension block metadata will result in an error. - ## How Extension Blocks Are Implemented in IL -The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds explicit opt-in support for extension block implementation methods. +The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. + +Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds explicit opt-in support for extension block implementation methods. ## Enabling Extension Block Support diff --git a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md index 9a2ca87..77abe13 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md +++ b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md @@ -11,9 +11,6 @@ You may have situations where you are looking to implement an aspect as part of The theoretical concept can cause some mental gymnastics, so let's take a look at the implementation. - -### - 1. Create an aspect that implements that interface. ```csharp @@ -69,6 +66,12 @@ It is common that aspects provided by ( An interesting feature of PostSharp is that object graphs instantiated at compile-time are serialized, and can be used at run-time. In other words, if you store a reference to another aspect in a child aspect, you will be able to use this reference at run time. +## C# 14 Extension Block Members + +C# 14 introduced extension members. Both and can be used on extension member implementation methods (members of the class containing extension blocks). + +Targeting extension block metadata (nested types emitted by the C# compiler) will result in an error `LA0167`. You can use to identify extension block metadata members if filtering is needed. + ## See Also **Reference** @@ -77,8 +80,11 @@ An interesting feature of PostSharp is that object graphs instantiated at compil


    -
    **Other Resources** +

    **Other Resources**
    +
    [C# 14 Extension Members - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extension) +
    [Exploring extension members - .NET Blog](https://devblogs.microsoft.com/dotnet/csharp-exploring-extension-members/) +
    From 8dccf39bd8fffdfc580c78198ca18e35f3b9fbf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Bala=C5=A1?= Date: Fri, 5 Dec 2025 14:17:11 +0100 Subject: [PATCH 14/21] Apply suggestions from code review Co-authored-by: Gael Fraiteur --- .../Aspects/Applying/extension-blocks-multicast.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index c21bff8..295db05 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -22,8 +22,8 @@ Since both the implementation methods and the metadata types may not be expected To apply aspects to extension block members, one of the following actions needs to be taken: -- Add the aspect directly to the extension block member. -- Set the property to `true` when applying the aspect. +- Add the aspect directly to the extension block member, or +- Set the property to `true` when multicasting the aspect from an outer scope, such as the declaring type. - Add to the aspect type and set to `true`. ### Example: Applying aspects directly to extension members From 6729e9933badda11afe8ea86eb08869a878f5cfe Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 14:18:52 +0100 Subject: [PATCH 15/21] Clarification. --- conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md index 77abe13..3262b9e 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md +++ b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md @@ -70,7 +70,7 @@ An interesting feature of PostSharp is that object graphs instantiated at compil C# 14 introduced extension members. Both and can be used on extension member implementation methods (members of the class containing extension blocks). -Targeting extension block metadata (nested types emitted by the C# compiler) will result in an error `LA0167`. You can use to identify extension block metadata members if filtering is needed. +Targeting extension block metadata types (nested types emitted by the C# compiler) and all their members will result in an error `LA0167`. You can use to identify extension block metadata members if filtering is needed. ## See Also From 93456d12e9838e7d935c3dfaa14314ee261a04db Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 16:26:50 +0100 Subject: [PATCH 16/21] Added reference to changes in IAspectProvider to What's new. --- conceptual/Introduction/WhatsNew/whats-new-20260.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index 86ca7ef..88e1668 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -24,6 +24,8 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types that are intended for C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, we've decided to introduce support into the multicast engine. For more information refer to . +* and will now report error LA0167 when targeting an extension member metadata declaration. You can use to identify such declarations. + ## PostSharp Pattern Libraries * Dependencies of pattern libraries were upgraded to versions without known security vulnerabilities. From 7a1d532d6148943cb9635ee7a53ae97e8975d107 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 16:31:24 +0100 Subject: [PATCH 17/21] Simplified, added xref. --- conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md | 2 +- conceptual/Introduction/WhatsNew/whats-new-20260.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md index 3262b9e..f4ce7ba 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md +++ b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md @@ -66,7 +66,7 @@ It is common that aspects provided by ( An interesting feature of PostSharp is that object graphs instantiated at compile-time are serialized, and can be used at run-time. In other words, if you store a reference to another aspect in a child aspect, you will be able to use this reference at run time. -## C# 14 Extension Block Members +## Extension Block Members C# 14 introduced extension members. Both and can be used on extension member implementation methods (members of the class containing extension blocks). diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index 88e1668..0146157 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -24,7 +24,7 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types that are intended for C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, we've decided to introduce support into the multicast engine. For more information refer to . -* and will now report error LA0167 when targeting an extension member metadata declaration. You can use to identify such declarations. +* and will now report an when targeting an extension member metadata declaration. For more information see . ## PostSharp Pattern Libraries From 07361cf5a1765d01c97769ee810b468a6110a0a8 Mon Sep 17 00:00:00 2001 From: Daniel Balas Date: Fri, 5 Dec 2025 16:35:20 +0100 Subject: [PATCH 18/21] Clarified. --- conceptual/Introduction/WhatsNew/whats-new-20260.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index 0146157..dd93797 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -24,7 +24,7 @@ PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. * In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types that are intended for C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, we've decided to introduce support into the multicast engine. For more information refer to . -* and will now report an when targeting an extension member metadata declaration. For more information see . +* and will now report an when targeting an extension member metadata declaration. Using extension members without updating your IAspectProvider implementations may cause your aspects to fail. For more information see . ## PostSharp Pattern Libraries From 96102c571d36a93f9c05bfa08bcd199bf511e4fb Mon Sep 17 00:00:00 2001 From: Gael Fraiteur Date: Tue, 16 Dec 2025 12:47:23 +0100 Subject: [PATCH 19/21] Review. --- .../Applying/extension-blocks-multicast.md | 119 ++++++++- .../WhatsNew/breaking-changes-20260.md | 242 ++++++++---------- .../Introduction/WhatsNew/whats-new-20260.md | 32 ++- 3 files changed, 233 insertions(+), 160 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index 295db05..4efcacb 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -1,24 +1,65 @@ --- uid: extension-blocks-multicast -title: "C# 14 Extension Blocks and Multicasting" +title: "C# 14 extension blocks and multicasting" product: "postsharp" categories: "PostSharp;AOP;Metaprogramming" -summary: "Explains how C# 14 extension blocks are handled by PostSharp's multicast engine in PostSharp 2026.0, including the AllowExtensionBlockMembers property." +summary: "Explains how C# 14 extension blocks are handled by PostSharp's multicast engine in PostSharp 2026.0, including the AllowExtensionBlockMembers property and ReflectionHelper.IsExtensionBlockMetadata method." --- -# C# 14 Extension Blocks and Multicasting +# C# 14 extension blocks and multicasting ## Overview Starting with PostSharp 2026.0, the multicast engine provides support for C# 14 extension blocks. By default, aspects and multicast attributes are not applied to extension block members to prevent unexpected behavior. You can explicitly enable this using the property. -## How Extension Blocks Are Implemented in IL +## How extension blocks are implemented in IL -The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. +The C# compiler implements extension block members as static methods (including properties) and a set of special metadata types. These metadata types are intended for the C# compiler to match extension methods and properties with the receiver type. -Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later skips all of these members and adds explicit opt-in support for extension block implementation methods. +At the IL level and when viewed through `System.Reflection`, the compiler generates: -## Enabling Extension Block Support +- Static implementation methods (e.g., `ExtensionMethod` and `get_ExtensionProperty`) +- Nested compiler-generated metadata types that describe the extension block structure + +For example, consider this C# 14 extension block: + +```csharp +public static class TestClassExtensions +{ + extension(TInstance instance) + { + public TInstance ExtensionMethod() => instance; + + public TInstance ExtensionProperty => instance; + } +} +``` + +The compiler generates nested types similar to: + +```csharp +public static class TestClassExtensions +{ + // Compiler-generated nested metadata types + [CompilerGenerated] + private static class 0 + { + // Metadata type representing the extension block + } + + // Static implementation methods + public static TInstance ExtensionMethod(TInstance instance) => instance; + + public static TInstance get_ExtensionProperty(TInstance instance) => instance; +} +``` + +Since both the implementation methods and the metadata types may not be expected by existing aspects, the multicasting algorithm in PostSharp 2026.0 and later behaves as follows: + +- **Extension block metadata types are always skipped** - These compiler-generated nested types and their members are never eligible for aspect application +- **Extension block implementation methods require opt-in** - Static methods that implement extension members are skipped by default but can be targeted by setting `AllowExtensionBlockMembers = true` + +## Enabling extension block support To apply aspects to extension block members, one of the following actions needs to be taken: @@ -118,8 +159,68 @@ public static class TestClassExtensions } ``` +## IAspectProvider and IAdviceProvider + +C# 14 extension blocks present a challenge when using or because the `System.Reflection` API exposes the compiler-generated IL artifacts rather than the source-level C# syntax. + +When implementing `IAspectProvider` or `IAdviceProvider`, you receive reflection objects (`Type`, `MethodInfo`, etc.) that represent the IL structure. For extension blocks, this means you'll encounter: + +- Static implementation methods for extension members +- Compiler-generated nested metadata types (e.g., `0`) + +Attempting to target extension block metadata types or their members will result in error **LA0167**. + +To make your `IAspectProvider` or `IAdviceProvider` safe to use with extension blocks, remember that: + +- **Extension member implementation methods are safe to target** - These are the static methods that implement the actual extension logic and can have aspects applied to them. +- **Extension block metadata types must be avoided** - Targeting these compiler-generated types or their members will result in error LA0167. + +PostSharp 2026.0 introduces the method to help identify and filter extension block metadata artifacts. This method allows you to distinguish between regular types/members and compiler-generated extension block metadata. + +### Example: Filtering extension block metadata + +When implementing `IAspectProvider`, use `IsExtensionBlockMetadata` to skip compiler-generated metadata types: + +```csharp +using PostSharp.Aspects; +using PostSharp.Reflection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +[PSerializable] +public class MyAspectProvider : IAspectProvider +{ + public IEnumerable ProvideAspects(object targetElement) + { + Type type = (Type)targetElement; + + // Get all nested types, but filter out extension block metadata + var nestedTypes = type.GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic) + .Where(t => !ReflectionHelper.IsExtensionBlockMetadata(t)); + + foreach (var nestedType in nestedTypes) + { + // Safely process non-metadata nested types + yield return new AspectInstance(nestedType, new MyAspect()); + } + + // Extension member implementation methods are safe to target + var methods = type.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(m => !ReflectionHelper.IsExtensionBlockMetadata(m.DeclaringType)); + + foreach (var method in methods) + { + yield return new AspectInstance(method, new MyMethodAspect()); + } + } +} +``` + + -## Backward Compatibility +## Backward compatibility Classic extension methods using the `this` modifier continue to work as before and are not affected by the `AllowExtensionBlockMembers` property. They are always eligible for aspect application according to existing multicast rules. @@ -131,6 +232,8 @@ Classic extension methods using the `this` modifier continue to work as before a


    +
    +
    **Other Resources**
    [C# 14 Extension Members - Microsoft Learn](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extension) diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md index da36ab3..7f83ce6 100644 --- a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -3,142 +3,114 @@ uid: breaking-changes-20260 title: "Breaking Changes in PostSharp 2026.0" product: "postsharp" categories: "PostSharp;AOP;Metaprogramming" -summary: "PostSharp 2026.0 introduces major breaking changes including discontinued support for older than .NET Framework 4.7.1, .NET Standard 1.3, and end-of-life .NET versions." +summary: "PostSharp 2026.0 introduces major breaking changes including discontinued support for .NET Framework versions older than 4.7.1, .NET Standard 1.3, and end-of-life .NET versions." --- # Breaking Changes in PostSharp 2026.0 -PostSharp 2026.0 removes API for `[DeadlockDetectionPolicy]` after being deprecated since 2024.0. +PostSharp 2026.0 consolidates our supported target platforms to simplify our build environment and streamline ongoing maintenance. This release focuses on actively maintained .NET versions while discontinuing support for legacy platforms that have reached end-of-life. Additionally, it officially removes the long-obsolete `[DeadlockDetectionPolicy]` feature and marks undo/redo for obsolescence. + +We understand that breaking changes require effort to address, and we've carefully selected which platforms to discontinue with the goal of minimizing customer impact. Most applications targeting modern .NET versions (.NET 8.0 and later, .NET Framework 4.7.1 and later) will experience minimal or no impact from these changes. + +## Deprecation of the deadlock detection feature + +PostSharp 2026.0 removes the API for `[DeadlockDetectionPolicy]`. This feature has been marked `[Obsolete]` since 2024.0. + +## Undo/redo marked obsolete + +The `[Recordable]` aspect and related APIs are now marked as obsolete and should not be used. This feature has long been de-facto obsolete due to lack of support for `async` methods and its low user base. + +These APIs will not be maintained and will be removed in a future release. + +## Deprecation of target frameworks + +PostSharp 2026.0 removes support for all pre-2017 frameworks plus the .NET Core versions that are no longer in mainstream Microsoft support. + +> [!WARNING] +> If you are affected by these deprecations and cannot update your target frameworks, please remain on PostSharp 2024.0 LTS. Contact us to indicate your dependency on this version and potentially negotiate an extension of its support window. + +The following table summarizes all target framework changes across PostSharp packages: + +| Package | Discontinued TFM | Replacement TFM | +|---------|------------------|-----------------| +| PostSharp.Redist | .NET Framework 3.5 | .NET Framework 4.5.2 | +| PostSharp.Redist | .NET Framework 4.5 | .NET Framework 4.5.2 | +| PostSharp.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Common.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Common.Redist | .NET Framework 4.6 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Common.Redist | .NET Framework 4.7 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Common.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Common.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Common.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Aggregation.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Aggregation.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Aggregation.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Aggregation.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Caching | .NET Framework 4.6.1 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Caching | .NET Framework 4.7 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Caching | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Azure | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Azure | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.IMemoryCache | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.IMemoryCache | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Redis | .NET Framework 4.7 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Caching.Redis | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Redis | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.6 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.7 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET Framework 4.5.2 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.AspNetCore | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.AspNetCore | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.AspNetFramework | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.CommonLogging | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.CommonLogging | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.CommonLogging | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.CommonLogging | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Configuration | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Configuration | .NET Framework 4.6.1 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.HttpClient | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.HttpClient | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.HttpClient | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Microsoft | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Microsoft | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.NLog | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.NLog | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.NLog | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.NLog | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Serilog | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Serilog | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.Serilog | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Serilog | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET Framework 4.6 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Model.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Model.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Model.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Model.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Threading.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Threading.Redist | .NET Standard 1.3 | .NET Standard 2.0 | +| PostSharp.Patterns.Threading.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Threading.Redist | .NET 7.0 | .NET 8.0 | +| PostSharp.Patterns.Xaml | .NET Framework 4.5 | .NET Framework 4.7.1 | +| PostSharp.Patterns.Xaml | .NET Core 3.0 | .NET 8.0 | +| PostSharp.Patterns.Xaml | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Xaml | .NET 7.0 | .NET 8.0 | -PostSharp 2026.0 deprecates the support for `[Recordable]` aspect and related APIs. - -PostSharp 2026.0 contains major breaking changes related to platform discontinuation. - -## PostSharp.Redist -* Assemblies targeting .NET Framework 3.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.5.2. -* Projects targeting .NET Framework 3.5, 4.0, 4.5, 4.5.1, .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used in the final application instead. - -## PostSharp.Patterns.Common.Redist -* Assemblies targeting .NET Framework 4.5, 4.6, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Aggregation.Redist -* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used in the final application instead. - -## PostSharp.Patterns.Caching -* Assemblies targeting .NET Framework 4.6.1, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.6.1 to 4.7 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Caching.Azure -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Caching.IMemoryCache -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Caching.Redis -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.7 is unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Redist -* Assemblies targeting .NET Framework 4.5 and 4.6, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.7 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.ApplicationInsights -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5.2 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5.2 to 4.7 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.AspNetCore -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.AspNetFramework -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. - -## PostSharp.Patterns.Diagnostics.CommonLogging -* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Configuration -* Assembly targeting .NET Framework 4.5 was discontinued. -* Assembly targeting .NET Framework 4.6.1 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.DiagnosticSource -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.HttpClient -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Log4Net -* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Microsoft -* Assemblies targeting .NET 5.0, and .NET 7.0 were discontinued. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.NLog -* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Serilog -* Assemblies targeting .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Diagnostics.Tracing -* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.6 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7 and .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8 or later should be used in the final application instead. - -## PostSharp.Patterns.Model.Redist -* `[Recordable]` aspect and related APIs are now marked as obsolete and should not be used. These APIs will not be maintained and will be removed in a future release. -* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. - -## PostSharp.Patterns.Threading.Redist -* `DeadlockDetectionPolicy` and related APIs were removed. -* Assemblies targeting .NET Framework 4.5, .NET Standard 1.3, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7, .NET Standard 1.3 to 1.6 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. - -## PostSharp.Patterns.Xaml -* Assemblies targeting .NET Core 3.0, .NET 5.0, and .NET 7.0 were discontinued. -* Assembly targeting .NET Framework 4.5 was retargeted to .NET Framework 4.7.1. -* Projects targeting .NET Framework 4.5 to 4.7, .NET Core 3.0 to 3.1 are unsupported. -* Projects targeting .NET 5.0 to 7.0 are unsupported at runtime. .NET 8.0 or later should be used for the executed application instead. diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md index dd93797..75dcd2c 100644 --- a/conceptual/Introduction/WhatsNew/whats-new-20260.md +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -7,37 +7,35 @@ summary: "PostSharp 2026.0 adds support for .NET 10.0 and C# 14, removes support --- # What's New in PostSharp 2026.0 -PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. +PostSharp 2026.0 introduces support for .NET 10.0 and C# 14.0. It also removes support for obsolete target frameworks and features. > [!NOTE] > Please note that this release includes several breaking changes. Refer to for more detailed information. -## PostSharp Compiler +## Support for .NET 10 and C# 14 -* PostSharp now supports the .NET 10.0 SDK and C# 14. +We've added support for .NET 10 SDK to all packages. -* Based on usage data, we've removed PostSharp.Redist support for .NET Framework 3.5-4.5.1, .NET Standard 1.3. This means it is no longer possible to use PostSharp with these target frameworks. The package instead targets .NET Framework 4.5.2 and .NET Standard 2.0. +In C# 14, the only change impacting PostSharp was _extension blocks_. -* We've removed direct support for .NET 5.0 and .NET 7.0 target frameworks. You can still use PostSharp with these target frameworks, but the support is provided through .NET Standard 2.0 and .NET 6.0 library respectively. +## Extension blocks -* In both above cases, if your projects cannot be compatible with supported target frameworks, please continue using PostSharp 2024.0 LTS, which will be supported for at least a year after 2026.0 is made LTS. Qualifying Enterprise users can request longer support duration than this, which is handled on case-by-case basis. +C# 14 introduces extension blocks, a new syntax for defining extension methods and properties using an `extension` declaration instead of the classic `this` modifier. The C# compiler implements these as static methods and compiler-generated metadata types, which presents challenges for PostSharp: -* In C# 14, extension blocks are implemented by the compiler as static methods and a set of special metadata types that are intended for C# compiler to match extension methods and properties with the receiver type. Since both the implementation methods and the metadata types may not be expected by existing aspects, we've decided to introduce support into the multicast engine. For more information refer to . +1. **Multicasting**: Previous versions of PostSharp would multicast aspects to all compiler-generated implementation methods, including those from extension blocks. In PostSharp 2026.0, multicast attributes skip extension block members by default to prevent unexpected behavior. +2. **IAspectProvider/IAdviceProvider**: These interfaces receive IL-level reflection objects (static methods and metadata types) rather than the C# source syntax. Since PostSharp relies on `System.Reflection` to provide access to the code model, developers using these interfaces must manually identify and filter extension block metadata. -* and will now report an when targeting an extension member metadata declaration. Using extension members without updating your IAspectProvider implementations may cause your aspects to fail. For more information see . +To address these challenges, PostSharp 2026.0 introduces: -## PostSharp Pattern Libraries +- and - Set to `true` to enable multicasting to extension block members (default: `false`) +- - Helper method to identify and filter compiler-generated extension block metadata when using `IAspectProvider` or `IAdviceProvider` -* Dependencies of pattern libraries were upgraded to versions without known security vulnerabilities. +For detailed information, examples, and best practices, see . -* All Pattern libraries now support .NET 10.0. -* Based on usage data, we've unified support for .NET Framework on version 4.7.1 for all Pattern Libraries and removed libraries targeting all previous versions of .NET Framework. Additionally, we've removed support for .NET Standard 1.3. +## Deprecation of unsupported target frameworks -* We've removed direct support for .NET 5.0 and .NET 7.0 target frameworks. You can still use Pattern Libraries with these target frameworks, but support will be provided through .NET Standard 2.0 and .NET 6.0 assemblies respectively. +We removed support for all pre-2017 target frameworks, as well as the versions of .NET Core that fell out of mainstream support. The new baseline frameworks are now .NET Standard 2.0, .NET Framework 4.7.0, and .NET 6.0. -* As mentioned before, if this affects you, we recommend staying on PostSharp 2024.0 LTS before you are able to upgrade to supported target frameworks. +Refer to for more detailed information. -* Deadlock detection support and APIs were removed from our packages. This component was deprecated in 2024.0 LTS and was not maintained since. - -* Undo-redo patterns and `[Recordable]` aspect are now considered obsolete and will not be maintained. The APIs will be removed in a future version. From be5cdc0da8dd2de0e3e266c610a9ae1a89d027d8 Mon Sep 17 00:00:00 2001 From: Gael Fraiteur Date: Tue, 16 Dec 2025 13:25:41 +0100 Subject: [PATCH 20/21] Fixed the extension block generated code. --- .../Applying/extension-blocks-multicast.md | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md index 4efcacb..8548f46 100644 --- a/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -40,14 +40,27 @@ The compiler generates nested types similar to: ```csharp public static class TestClassExtensions { - // Compiler-generated nested metadata types - [CompilerGenerated] - private static class 0 + // Compiler-generated nested metadata types representing the extension block. + [SpecialName] + private static class $BA41CFE2B5EDAEB8C1B9062F59ED4D69 { - // Metadata type representing the extension block + // Pure metadata classes. + [SpecialName] + public static class $DE9F57644BDC66EDA3F1FD365749DA9F; + + [SpecialName] + public static class $7A2C8F3E91B4D5A6C0E9F1B2D4A7C8E3; + + + // Original extension members without implementations. + [ExtensionMarker("$DE9F57644BDC66EDA3F1FD365749DA9F")] + public TInstance ExtensionMethod() => throw null; + + [ExtensionMarker("$DE9F57644BDC66EDA3F1FD365749DA9F")] + public TInstance ExtensionProperty => throw null; } - // Static implementation methods + // Static implementation methods with received parameter. public static TInstance ExtensionMethod(TInstance instance) => instance; public static TInstance get_ExtensionProperty(TInstance instance) => instance; From 439536711131258a07dab914ec34ec05fe7b9402 Mon Sep 17 00:00:00 2001 From: Gael Fraiteur Date: Tue, 16 Dec 2025 13:35:58 +0100 Subject: [PATCH 21/21] Clarified deprecation of target frameworks in breaking changes documentation. --- .../WhatsNew/breaking-changes-20260.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md index 7f83ce6..62f8579 100644 --- a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -23,7 +23,7 @@ These APIs will not be maintained and will be removed in a future release. ## Deprecation of target frameworks -PostSharp 2026.0 removes support for all pre-2017 frameworks plus the .NET Core versions that are no longer in mainstream Microsoft support. +PostSharp 2026.0 removes support for all pre-2017 frameworks and .NET Core versions that are no longer supported by Microsoft. However, we have kept support for .NET 6.0 due to its widespread adoption as indicated by our telemetry data. > [!WARNING] > If you are affected by these deprecations and cannot update your target frameworks, please remain on PostSharp 2024.0 LTS. Contact us to indicate your dependency on this version and potentially negotiate an extension of its support window. @@ -35,82 +35,82 @@ The following table summarizes all target framework changes across PostSharp pac | PostSharp.Redist | .NET Framework 3.5 | .NET Framework 4.5.2 | | PostSharp.Redist | .NET Framework 4.5 | .NET Framework 4.5.2 | | PostSharp.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Common.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Common.Redist | .NET Framework 4.6 | .NET Framework 4.7.1 | | PostSharp.Patterns.Common.Redist | .NET Framework 4.7 | .NET Framework 4.7.1 | | PostSharp.Patterns.Common.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Common.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Common.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Common.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Aggregation.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Aggregation.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Aggregation.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Aggregation.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Aggregation.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Caching | .NET Framework 4.6.1 | .NET Framework 4.7.1 | | PostSharp.Patterns.Caching | .NET Framework 4.7 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Caching | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Caching | .NET 7.0 | .NET 8.0 | -| PostSharp.Patterns.Caching.Azure | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Azure | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Caching.Azure | .NET 7.0 | .NET 8.0 | -| PostSharp.Patterns.Caching.IMemoryCache | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.IMemoryCache | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Caching.IMemoryCache | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Caching.Redis | .NET Framework 4.7 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Caching.Redis | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Caching.Redis | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Caching.Redis | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.6 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Redist | .NET Framework 4.7 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET Framework 4.5.2 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 7.0 | .NET 8.0 | -| PostSharp.Patterns.Diagnostics.AspNetCore | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.AspNetCore | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.AspNetCore | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.AspNetFramework | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.CommonLogging | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.CommonLogging | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.CommonLogging | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.CommonLogging | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.CommonLogging | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.Configuration | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Configuration | .NET Framework 4.6.1 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET Framework 4.5 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.DiagnosticSource | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.HttpClient | .NET Framework 4.5 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Diagnostics.HttpClient | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.HttpClient | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.HttpClient | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.Log4Net | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Log4Net | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.Log4Net | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.Log4Net | .NET 7.0 | .NET 8.0 | -| PostSharp.Patterns.Diagnostics.Microsoft | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Microsoft | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.Microsoft | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.NLog | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.NLog | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.NLog | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.NLog | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.NLog | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.Serilog | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Serilog | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.Serilog | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Serilog | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.Serilog | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Diagnostics.Tracing | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Tracing | .NET Framework 4.6 | .NET Framework 4.7.1 | | PostSharp.Patterns.Diagnostics.Tracing | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Diagnostics.Tracing | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Diagnostics.Tracing | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Diagnostics.Tracing | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Model.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Model.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Model.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Model.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Model.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Threading.Redist | .NET Framework 4.5 | .NET Framework 4.7.1 | | PostSharp.Patterns.Threading.Redist | .NET Standard 1.3 | .NET Standard 2.0 | -| PostSharp.Patterns.Threading.Redist | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Threading.Redist | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Threading.Redist | .NET 7.0 | .NET 8.0 | | PostSharp.Patterns.Xaml | .NET Framework 4.5 | .NET Framework 4.7.1 | -| PostSharp.Patterns.Xaml | .NET Core 3.0 | .NET 8.0 | -| PostSharp.Patterns.Xaml | .NET 5.0 | .NET 8.0 | +| PostSharp.Patterns.Xaml | .NET Core 3.0 | .NET 6.0 | +| PostSharp.Patterns.Xaml | .NET 5.0 | .NET 6.0 | | PostSharp.Patterns.Xaml | .NET 7.0 | .NET 8.0 |