Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
1146c96
Move UI and platform types out of System.Reactive
idg10 Feb 12, 2024
af836b7
Ensure Dispatcher available in test that presume it
idg10 Feb 13, 2024
e27c11d
Update verified API
idg10 Feb 13, 2024
8708edf
Add new integration package references to WindowsDesktopTests
idg10 Feb 13, 2024
56c6da7
Add missing s in WindowsForms
idg10 Feb 13, 2024
e28289b
Set version to 7.0 and update WindowsDesktopTests
idg10 Feb 14, 2024
23751e0
Change .Integration package names to .For
idg10 Mar 4, 2024
f9ce5f0
Merge main into feature/separate-ui-packages
idg10 Jun 12, 2025
35c735d
Fixes required now MSBuild.Extras.SDK has gone
idg10 Jun 12, 2025
a1159cd
Turn System.Reactive into facade
idg10 Jun 18, 2025
8df98cb
Hide UI types in facade reference assemblies
idg10 Jul 16, 2025
b7d1ca9
Use ref hiding trick to preserve System.Reactive as main package
idg10 Jul 17, 2025
a39e722
Update preview tag in version.json
idg10 Jul 17, 2025
84ff11f
Remove reference to facades\System.Reactive in test projects
idg10 Jul 17, 2025
d0765bb
Get correct ref assembly used in P2P refs to System.Reactive
idg10 Jul 17, 2025
b47c5c3
Add NuGet readme that got lost
idg10 Jul 17, 2025
c59ebd3
Remove frameworkReference from nuspec
idg10 Jul 18, 2025
d6ba782
Merge main into feature/packaging-no-facade-ref-no-ui
idg10 Sep 3, 2025
7098bd1
Fix integration test version numbers
idg10 Sep 3, 2025
ae84d52
Update ADR to reflect our current view
idg10 Sep 4, 2025
0f5f5b1
Further ADR clarification
idg10 Sep 8, 2025
8037181
Yet more ADR clarifications
idg10 Sep 8, 2025
502280d
Move ref assembly out of Facades folder into FrameworkIntegrations
idg10 Sep 8, 2025
18ff2b3
Remove duplicate PackageReferences
idg10 Sep 8, 2025
f634189
Fix some new analyzer diagnostics
idg10 Sep 8, 2025
b32eee2
Initial analyzer for recommending UI packages
idg10 Sep 9, 2025
ebd30e4
WPF package detection in analyzer
idg10 Sep 9, 2025
1e4b6a1
Basic WPF and Windows Forms missing package analyzer working
idg10 Sep 11, 2025
ed608d6
Add analyzer to System.Reactive package
idg10 Sep 12, 2025
5f6d990
Try to fix apparently spurious license header warnings
idg10 Sep 12, 2025
792156d
Add analyzer checks for UI dispatcher static properties
idg10 Sep 16, 2025
db7e9a5
Add Windows Runtime package verifier checks
idg10 Sep 24, 2025
ed0f980
Merge main into feature/packaging-facade-ref-no-ui
idg10 Oct 6, 2025
276f20b
Merge main into feature/packaging-facade-ref-noui
idg10 Oct 6, 2025
6a10106
Fix typo in UAP build ADR.
idg10 Oct 6, 2025
0773984
Renumber APIs after merge from main added existing 0004
idg10 Oct 6, 2025
934c3a2
Update Windows.winmd ref to 10.0.26100 for Uwp project
idg10 Oct 6, 2025
a16398f
More updates for Windows.winmd moving to 10.0.26100
idg10 Oct 6, 2025
5be94f6
Add v7 release history doc
idg10 Oct 7, 2025
f74c667
Remove duplicate PackageReference in ApiApprovals
idg10 Oct 7, 2025
86b9eb2
Move UI types back to original packages
idg10 Oct 7, 2025
5c87498
Merge main into packaging branch
idg10 Oct 31, 2025
099136f
Fix package build errors
idg10 Nov 3, 2025
994f408
Add readme files missed due to gitignore
idg10 Nov 3, 2025
4665157
Update Windows integration tests package refs
idg10 Nov 3, 2025
9f8c149
Fix package name error in preceding commit
idg10 Nov 3, 2025
555f242
Merge main into packaging branch
idg10 Nov 4, 2025
fe3fd6f
Merge branch 'main' into feature/packaging-endgame
idg10 Nov 4, 2025
5dd0d7a
Set version preview tag
idg10 Nov 4, 2025
29854dc
Remove legacy facade projects
idg10 Nov 4, 2025
f5f52af
Don't publish a nupkg for MakeRefAssemblies
idg10 Nov 4, 2025
e6fef03
Modify step added in previous commit to use pwsh
idg10 Nov 4, 2025
133d84b
Remove spurious old System.Reactive.For folders
idg10 Nov 4, 2025
ddafe64
Fix links to files that had been pointing to For.Uwp folder
idg10 Nov 4, 2025
a03f1d1
Don't make NuGet package for analyzer assembly
idg10 Nov 5, 2025
1a3a1c0
Update various docs from back when we were going to demote System.Rea…
idg10 Nov 5, 2025
43c0eff
Update release notes to reflect the packaging decisions
idg10 Nov 5, 2025
ca34d5b
Update package readmes
idg10 Nov 5, 2025
85c5957
Fix typo in release notes
idg10 Nov 5, 2025
610d6ef
Update package split ADR after read through
idg10 Nov 5, 2025
2216b99
Remove some text that still referred to System.Reactive.For.*
idg10 Nov 5, 2025
364e792
Remove duplicate readme in System.Reactive.Observable.Aliases
idg10 Nov 5, 2025
cdfc5ef
Remove spurious comma from filename
idg10 Nov 5, 2025
0315f5f
Remove spurious additional API compatbility suppression file
idg10 Nov 5, 2025
be86661
Revert unnecessary public AsyncLock Wait back to internal
idg10 Nov 5, 2025
5c88386
Fix comment that stated that we'd removed the UAP target
idg10 Nov 5, 2025
1ba55cf
Fix types in ADRs and release notes
idg10 Nov 6, 2025
a43c4c7
Add comment acknowledging slight size increase, and how trimming miti…
idg10 Nov 6, 2025
e22d361
Fix typos spotted by Copilot
idg10 Nov 6, 2025
874445f
Update VS 2022 ref to VS 2026
idg10 Nov 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1072,7 +1072,7 @@ As you can see the `ISubject` interfaces don't define any members of their own.

But what is this for? You can think of `IObserver<T>` and the `IObservable<T>` as the 'consumer' and 'publisher' interfaces respectively. A subject, then is both a consumer and a publisher. Data flows both into and out of a subject.

Rx offers a few subject implementations that can occasionally be useful in code that wants to make an `IObservable<T>` available. Although `Observable.Create` is usually the preferred way to do this, there's one important case where a subject might make more sense: if you have some code that discovers events of interest (e.g., by using the client API for some messaging technology) and wants to make them available through an `IObservable<T>`, subjects can sometimes provide a more convenient way to to this than with `Observable.Create` or a custom implementation.
Rx offers a few subject implementations that can occasionally be useful in code that wants to make an `IObservable<T>` available. Although `Observable.Create` is usually the preferred way to do this, there's one important case where a subject might make more sense: if you have some code that discovers events of interest (e.g., by using the client API for some messaging technology) and wants to make them available through an `IObservable<T>`, subjects can sometimes provide a more convenient way to do this than with `Observable.Create` or a custom implementation.

Rx offers a few subject types. We'll start with the most straightforward one to understand.

Expand Down
49 changes: 49 additions & 0 deletions Rx.NET/Documentation/ReleaseHistory/Rx.v7.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Rx Release History v7.0

## 7.0.0

Supported on .NET 8, .NET 9, and .NET 10.0.

New features:

* Applications with a Windows-specific TFM (e.g., `net8.0-windows.10.0.19041`) can now reference the `System.Reactive` package without automatically acquiring a reference to the `Microsoft.Desktop.App` framework (which includes WPF and WinForms). If the application uses either self-contained deployment or AoT, this fixes the problem in which a reference to Rx would massively increase the size of the deployable application.


### Breaking changes

* UI-framework-specific functionality now requires referencing the relevant platform-specific package:
* `System.Reactive.Windows.Forms` for Windows Forms
* `System.Reactive.Wpf` for WPF
* `System.Reactive.WindowsRuntime` for WinRT (e.g., `CoreDispatcher`) support
* If an application with a Windows-specific TFM had been relying on `System.Reactive` to acquire the `Microsoft.Desktop.App` framework dependency, it will need to add `<UseWPF>true</UseWPF>` or `<UseWindowsForms>true</UseWindowsForms>`
* Out-of-support target frameworks (.NET 6.0, .NET 7.0) no longer supported

Note that the packaging changes for UI-specific functionality constitute a source-level breaking change, but not a binary-level breaking change. Although the UI-framework-specific types have been removed from the public API of `System.Reactive`, they remain present at runtime. (The NuGet package has both `ref` and `lib` folders. The .NET build tools use the `ref` folder at compile time, and these types have been removed only from the `ref` assemblies. At runtime the `lib` folder is used, and the full API of `System.Reactive` v6 remains available in the assemblies in `lib`. Thus existing binaries built against Rx 6.0 that find themselves using Rx 7.0 at runtime will continue to work.)

`System.Reactive` has an analyzer that detects when a project has a build error because it was using UI-specific functionality that used to be in `System.Reactive` but now lives in a new package that the project does not yet reference. The analyzer produces diagnostics telling the developer what new reference they will require.


### Deprecation of facades

Back in Rx 4.0 (the last time there was a major upheaval to the packaging), various NuGet packages that had previously been core components of Rx.NET were demoted to compatibility facades. These contained just type forwarders indicating that the various types they used to define have moved into `System.Reactive`.

These packages existed to enable code built against older versions of Rx.NET to continue to work when upgraded to Rx 4.0 or later. We have continued to build new versions of these with each subsequent version of .NET, but all that has typically changed is the exact versions in the TFMs. Nobody should be using these facades any more so there is no reason to continue to produce new ones. (And anyone who is still using the old ones can continue to do so.)

So we no longer produce new versions of these packages.

* `System.Reactive.Compatibility`
* `System.Reactive.Core`
* `System.Reactive.Experimental`
* `System.Reactive.Interfaces`
* `System.Reactive.Linq`
* `System.Reactive.PlatformServices`
* `System.Reactive.Providers`
* `System.Reactive.Runtime.Remoting`
* `System.Reactive.Windows.Threading`

Note that these packages were for many years facades:

* `System.Reactive.Windows.Forms`
* `System.Reactive.WindowsRuntime`

With Rx 7, these have returned to their original roles: they are now the home of Windows Forms and WinRT support in Rx. (We have not resurrected the `System.Reactive.Windows.Threading` package, because its name is a somewhat unhelpful accident of history. WPF functionality now lives in the new `System.Reactive.Wpf` component.)
12 changes: 12 additions & 0 deletions Rx.NET/Documentation/adr/0003-uap-targets.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,18 @@ Without these explicit settings, those first two values would have become `UAP,V

However, only _some_ properties should use the old name. We need to set _all_ of these properties, because otherwise, other parts of the build system get confused (e.g., NuGet handling). So we need the ".NETCore" name in some places, and the "UAP" name in others.

Also note that the package validation tooling (which we use to ensure that `System.Reactive` continues to present the same API as it always did) turns out not to understand the `.NETCore,Version=v5.0` TFM. So for that to work, we need to put the TFM back how it was later in the build process, which is why we have this target:

```xml
<Target Name="_SetUwpTfmForPackageValidation" BeforeTargets="RunPackageValidation">
<ItemGroup>
<PackageValidationReferencePath Condition="%(PackageValidationReferencePath.TargetFrameworkMoniker) == '.NETCore,Version=v5.0'" TargetFrameworkMoniker="UAP,Version=10.0.18362.0" TargetPlatformMoniker="Windows,Version=10.0.18362.0" />
</ItemGroup>
</Target>
```

This also sets the target platform moniker to indicate that this is a Windows-specific TFM, something that the package validation tooling doesn't seem to understand otherwise. (But we do need the target platform identifier to be `UAP` earlier on in the build for various other things to work, which is why we only switch this just before package validation runs.)


#### Compiler Constants

Expand Down
Loading