Rx.NET 7.0 has been released with a narrowly focused change aimed at reducing deployment size for Windows applications. The new version separates WPF, Windows Forms, UWP, and Windows Runtime integration from the main System.Reactive package, avoiding cases where self-contained applications could acquire tens of megabytes of unused framework dependencies.

Reactive Extensions for .NET provides the IObservable<T>-based programming model and operators used to compose asynchronous and event-driven streams. Since the endjin company from the United Kingdom took over maintenance of Rx.NET in January 2023, recent releases have concentrated largely on modernisation and accumulated technical debt rather than adding large sets of operators. Version 7.0 continues that approach and contains essentially one major functional change.

The problem affected applications using both self-contained or Native AOT deployment and a Windows-specific TFM (target framework moniker) such as net8.0-windows10.0.19041. Referencing System.Reactive could cause the complete WPF and Windows Forms frameworks to be included in deployment output, even when the application did not use either UI framework. According to endjin, this could add roughly 90 MB without trimming, around 47 MB with trimming, and about 11 MB for Native AOT builds.

Rx.NET 7.0 addresses the issue by moving UI-specific functionality into separate NuGet packages: System.Reactive.Windows.Forms, System.Reactive.Wpf, System.Reactive.WindowsRuntime, and System.Reactive.Uwp. Applications that use those integrations must add the corresponding package explicitly after upgrading. For projects that do not use them, no source changes should be necessary, while affected self-contained deployments can become substantially smaller.

The maintainers have tried to preserve binary compatibility despite the package split. The older UI APIs remain in the runtime assemblies shipped in the NuGet package, but are removed from its reference assemblies. This means precompiled components built against Rx.NET 6.1 should continue to run, while newly compiled applications are prevented from accidentally taking dependencies on Windows UI functionality without the appropriate package. An analyzer included with System.Reactive 7.0 detects affected source code and recommends the package that needs to be added.

There are additional breaking changes. Rx.NET 7.0 drops support for .NET 6 and .NET 7, while continuing to support .NET 8, .NET 9, .NET 10, .NET Framework 4.7.2, .NET Standard 2.0, and UWP. The release also corrects the nullability annotations for OfType. The runtime behaviour remains unchanged, but the signature change technically required a major-version release under semantic versioning.

One edge case remains for projects using the older packages.config mechanism. Because that format does not distinguish between NuGet ref and lib assets, such projects can still see the UI APIs without explicitly referencing the new packages. The Rx.NET maintainers do not support this configuration and indicate that the retained compatibility code may eventually be removed.

Earlier discussion among Rx.NET users had highlighted both the Windows-specific packaging problem and broader concerns about the project keeping pace with modern .NET deployment models. Developers reported having to work around missing Windows scheduler APIs in some target-framework combinations, while others called for better trimming, AOT support, and clearer package documentation. Public discussion specifically following the 7.0 release remains limited, so it is too early to draw conclusions about broader community reception.

With version 7.0, endjin says it has completed the main goals of the maintenance roadmap published when it assumed stewardship of Rx.NET. Future work may shift toward lower-allocation implementations, code generation, possible support for ref-like elements, and additional operators. System.Reactive 7.0 is available on NuGet, while design details for the package split and ongoing development are documented in the Rx.NET GitHub repository.