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..8548f46 --- /dev/null +++ b/conceptual/CustomPatterns/Aspects/Applying/extension-blocks-multicast.md @@ -0,0 +1,253 @@ +--- +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 and ReflectionHelper.IsExtensionBlockMetadata method." +--- +# 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 + +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. + +At the IL level and when viewed through `System.Reflection`, the compiler generates: + +- 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 representing the extension block. + [SpecialName] + private static class $BA41CFE2B5EDAEB8C1B9062F59ED4D69 + { + // 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 with received parameter. + 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: + +- 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 + +When applied explicitly to extension members, aspects are added without the need to change any of the properties. + +```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] + public TInstance ExtensionMethod() => instance; + + [LoggingAspect] + public TInstance ExtensionProperty + { + get => instance; + set { } + } + } +} +``` + +### 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. + +```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 + { + get => instance; + set { } + } + } +} +``` + +### Example: Changing default behavior for custom aspects + +Setting the property to `true` on the aspect class will make extension members automatically eligible for the aspect: + +```csharp +[MulticastAttributeUsage(MulticastTargets.Method, AllowExtensionBlockMembers = true)] +[PSerializable] +public class LoggingAspect : OnMethodBoundaryAspect +{ + public override void OnEntry(MethodExecutionArgs args) + { + Console.WriteLine($"Entering: {args.Method.Name}"); + } +} + +[LoggingAspect] +public static class TestClassExtensions +{ + extension(TInstance instance) + { + public TInstance ExtensionMethod() => instance; + + public TInstance ExtensionProperty + { + get => instance; + set { } + } + } +} +``` + +## 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 + +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 + + +
+
+
+
+
+
+ +**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/) diff --git a/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md b/conceptual/CustomPatterns/Aspects/Applying/iaspectprovider.md index 9a2ca87..f4ce7ba 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. +## 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 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 **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/) +
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..545bd2c --- /dev/null +++ b/conceptual/DeploymentConfiguration/Deployment/requirements-20260.md @@ -0,0 +1,197 @@ +--- +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 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. + +> [!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.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. + +* .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 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 + +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/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/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/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/Overview/what-is-postsharp.md b/conceptual/Introduction/Overview/what-is-postsharp.md index 0e3a3ff..48e3f16 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 . @@ -25,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] @@ -38,7 +36,6 @@ public class CustomerViewModel } [NotifyPropertyChanged] -[Recordable] public class Customer { public string FirstName { get; set; } @@ -58,7 +55,6 @@ public class Customer } [NotifyPropertyChanged] -[Recordable] public class Address { [Parent] diff --git a/conceptual/Introduction/WhatsNew/breaking-changes-20260.md b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md new file mode 100644 index 0000000..62f8579 --- /dev/null +++ b/conceptual/Introduction/WhatsNew/breaking-changes-20260.md @@ -0,0 +1,116 @@ +--- +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 .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 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 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. + +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 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 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 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 6.0 | +| PostSharp.Patterns.Caching | .NET 7.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 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 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 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 6.0 | +| PostSharp.Patterns.Diagnostics.ApplicationInsights | .NET 7.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 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 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 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 6.0 | +| PostSharp.Patterns.Diagnostics.Log4Net | .NET 7.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 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 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 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 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 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 6.0 | +| PostSharp.Patterns.Xaml | .NET 5.0 | .NET 6.0 | +| PostSharp.Patterns.Xaml | .NET 7.0 | .NET 8.0 | + diff --git a/conceptual/Introduction/WhatsNew/whats-new-20251.md b/conceptual/Introduction/WhatsNew/whats-new-20251.md new file mode 100644 index 0000000..3de66ee --- /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. diff --git a/conceptual/Introduction/WhatsNew/whats-new-20260.md b/conceptual/Introduction/WhatsNew/whats-new-20260.md new file mode 100644 index 0000000..75dcd2c --- /dev/null +++ b/conceptual/Introduction/WhatsNew/whats-new-20260.md @@ -0,0 +1,41 @@ +--- +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. 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. + +## Support for .NET 10 and C# 14 + +We've added support for .NET 10 SDK to all packages. + +In C# 14, the only change impacting PostSharp was _extension blocks_. + +## Extension blocks + +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: + +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. + +To address these challenges, PostSharp 2026.0 introduces: + +- 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` + +For detailed information, examples, and best practices, see . + + +## Deprecation of unsupported target frameworks + +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. + +Refer to for more detailed information. + diff --git a/conceptual/Introduction/WhatsNew/whats-new.md b/conceptual/Introduction/WhatsNew/whats-new.md index 02e8d10..7565613 100644 --- a/conceptual/Introduction/WhatsNew/whats-new.md +++ b/conceptual/Introduction/WhatsNew/whats-new.md @@ -11,6 +11,8 @@ 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/Misc/deprecated-features.md b/conceptual/Misc/deprecated-features.md index 08d43ad..074db43 100644 --- a/conceptual/Misc/deprecated-features.md +++ b/conceptual/Misc/deprecated-features.md @@ -5,12 +5,11 @@ 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. | 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/Model/UndoRedo/undoredo-callbacks.md b/conceptual/Model/UndoRedo/undoredo-callbacks.md index e9c0dd9..88ab777 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 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. 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..19b51f6 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 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 f2ddf19..5fabc40 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 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 3279870..4d87890 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 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. 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..a2b4895 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 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 916a39a..7fa4737 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 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 92e3c30..19913ec 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 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 c673aac..b49bfe4 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 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. 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/Threading/deadlockdetection1.PNG b/conceptual/Threading/deadlockdetection1.PNG deleted file mode 100644 index da9a5ec..0000000 Binary files a/conceptual/Threading/deadlockdetection1.PNG and /dev/null differ diff --git a/conceptual/Threading/deadlockdetection3.png b/conceptual/Threading/deadlockdetection3.png deleted file mode 100644 index 3a924b0..0000000 Binary files a/conceptual/Threading/deadlockdetection3.png and /dev/null differ diff --git a/conceptual/Threading/deadlockdetection4.png b/conceptual/Threading/deadlockdetection4.png deleted file mode 100644 index f4f7b21..0000000 Binary files a/conceptual/Threading/deadlockdetection4.png and /dev/null differ diff --git a/conceptual/Threading/deadlockdetection5.png b/conceptual/Threading/deadlockdetection5.png deleted file mode 100644 index bdbc9ff..0000000 Binary files a/conceptual/Threading/deadlockdetection5.png and /dev/null differ diff --git a/conceptual/Threading/deadlockdetection6.png b/conceptual/Threading/deadlockdetection6.png deleted file mode 100644 index a50af67..0000000 Binary files a/conceptual/Threading/deadlockdetection6.png and /dev/null differ 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..aa5d503 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**. @@ -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; @@ -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/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 fa2c439..635bde4 100644 --- a/conceptual/index.md +++ b/conceptual/index.md @@ -24,8 +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 an undo/redo feature by making your model objects record their changes. | +| | 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. | diff --git a/conceptual/toc.yml b/conceptual/toc.yml index deb16ba..749a89b 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 @@ -246,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: @@ -385,21 +394,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: @@ -563,7 +557,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