diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d08241..f9c141c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Each release has a `## [version]` section. When a `v*.*.*` tag is pushed, the Pu ## [Unreleased] +### Docs + +- 7.0.0 is documented as the last release that supports .NET Standard 2.0, which covers .NET Framework 4.6.1 through 4.8.1. 8.0.0 follows Dynamitey.Community 5.0.0 and drops that target (#108). + ## [7.0.0] ### Breaking diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a8fb645..964914f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,6 +45,8 @@ docfx docfx/docfx.json --warningsAsErrors PRs build the site; only `master` deploys to GitHub Pages. -## `netstandard2.0` stays through 7.0.0 +## `netstandard2.0` stays on 7.0.0, and ends there -It is the TFM that still reaches .NET Framework and modern .NET from one package. 7.0.0 keeps it. The dependency is Dynamitey.Community 4.0.0. Dropping `netstandard2.0` is 8.0.0 ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)), later in 2026, when the targets become `net10.0` and `net11.0`. Do not drop it in a 7.x change. +7.0.0 is the last release that targets `netstandard2.0`. That is the build a .NET Framework 4.6.1 through 4.8.1 application uses. Do not drop it in a 7.x change. Framework 4.8.1 is serviced with Windows and does not gain BCL APIs, so those applications stay on 7.0.0. + +8.0.0 ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)) targets `net10.0` and `net11.0` only. It waits on [Dynamitey.Community 5.0.0](https://github.com/dynamitey-community/dynamitey/issues/95), which drops the same target after .NET 11 is generally available. The point of that drop is one implementation: `ThrowIfNull`, ordinal hashing, and the BCL .NET 10 and .NET 11 already ship, without a second Framework copy of the call-site code. diff --git a/README.md b/README.md index 25d9621..0bbb44b 100644 --- a/README.md +++ b/README.md @@ -21,11 +21,20 @@ F# has no `dynamic` keyword. Use this when the member is not known at compile ti ## Version story -**7.0.0** is the current package: `netstandard2.0` + `net10.0`, [Dynamitey.Community 4.0.0](https://www.nuget.org/packages/Dynamitey.Community/4.0.0). The namespace is still `Dynamitey`. The assembly is `Dynamitey.Community`. `Dyn.namedArg`, `Dyn.staticContext`, and `Dyn.staticTarget` return types from that assembly. A project that also references the `Dynamitey` 3.0.3 package gets `CS0433`. +**7.0.0** is the current package, and the last one that supports .NET Standard 2.0. That target is what reaches .NET Framework 4.6.1 through 4.8.1. It also builds for `net10.0`, on [Dynamitey.Community 4.0.0](https://www.nuget.org/packages/Dynamitey.Community/4.0.0). The namespace is still `Dynamitey`. The assembly is `Dynamitey.Community`. `Dyn.namedArg`, `Dyn.staticContext`, and `Dyn.staticTarget` return types from that assembly. A project that also references the `Dynamitey` 3.0.3 package gets `CS0433`. -**6.0.0** was `netstandard2.0` + `net10.0` on Dynamitey 3.0.3, with `Dyn.tryGet` / `Dyn.exists`. That was a TFM break from **5.0.1.268** (`net45` / `netstandard1.6` / `netstandard2.0`). `netstandard2.0` still covers current .NET Framework and .NET. +A Framework application stays on 7.0.0. Framework 4.8.1 is still serviced with Windows. It does not get new BCL APIs. .NET Standard 2.0 freezes this library on the Framework 4.6.1 surface. A newer API is either skipped, or written twice. That is the tax. [Dynamitey.Community #95](https://github.com/dynamitey-community/dynamitey/issues/95) is the same decision for the dependency: 4.0.0 is its last `netstandard2.0` release, and 5.0.0 (after .NET 11 is generally available in November 2026) targets `net10.0` and `net11.0` only. -**8.0.0**, later in 2026, drops `netstandard2.0` and targets `net10.0` + `net11.0` ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)). +**8.0.0** ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)) follows that. It targets `net10.0` and `net11.0` and drops .NET Standard 2.0, once Dynamitey.Community 5.0.0 has dropped the same target. The gains are in that library, and this package takes them by referencing it: + +- One copy of Dynamitey's call-site code. The `netstandard2.0` branch, `Guard.NotNull`, and the attribute polyfills go away. `ArgumentNullException.ThrowIfNull` is on every target. +- Ordinal hashing and `string.Contains(string, StringComparison)`. The Framework build cannot call those overloads, so it uses a different hash and three `IndexOf` calls. +- `Microsoft.CSharp` and `System.Reflection.Emit` leave Dynamitey's package graph. They are in the shared framework on .NET 10 and .NET 11. The more-than-14-argument path still uses Emit. It stops being a separate package. +- `[RequiresUnreferencedCode]` and `[RequiresDynamicCode]` are the real framework attributes on every Dynamitey build. The library stays DLR-based. It does not become trim-safe. + +A warm dynamic call does not get faster. It is already a cached delegate. + +**6.0.0** was `netstandard2.0` + `net10.0` on Dynamitey 3.0.3, with `Dyn.tryGet` / `Dyn.exists`. That was a TFM break from **5.0.1.268** (`net45` / `netstandard1.6` / `netstandard2.0`). --- diff --git a/docfx/docs/dynamitey.md b/docfx/docs/dynamitey.md index d9e0af8..0b0810a 100644 --- a/docfx/docs/dynamitey.md +++ b/docfx/docs/dynamitey.md @@ -17,11 +17,13 @@ The F# operators call `Dynamic.InvokeGet`, `InvokeSet`, `InvokeMember`, `InvokeC Jay Tuley wrote Dynamitey. The `Dynamitey` package id stopped at 3.0.3. The continuation publishes `Dynamitey.Community`, so both can be on nuget.org. The namespace is still `Dynamitey`, so `open Dynamitey` stays. The assembly name is `Dynamitey.Community`. -4.0.0 targets `netstandard2.0` and `net10.0`, the same pair as this library. `net40` is dropped. 4.0.0 is the last release of that package that still targets `netstandard2.0`. The release notes are [About 4.0.0](https://dynamitey-community.github.io/dynamitey/docs/v4.html). +4.0.0 targets `netstandard2.0` and `net10.0`, the same pair as this library's 7.0.0. `net40` is dropped. 4.0.0 is the last Dynamitey.Community release that still targets `netstandard2.0`, which is .NET Framework 4.6.1 through 4.8.1. The release notes are [About 4.0.0](https://dynamitey-community.github.io/dynamitey/docs/v4.html). `Dyn.namedArg`, `Dyn.staticContext`, and `Dyn.staticTarget` return `InvokeArg` and `InvokeContext` from that assembly. A project that also references `Dynamitey` 3.0.3 fails to compile with `CS0433`. ImpromptuInterface still references the original package. How to alias that is in the [community readme](https://github.com/dynamitey-community/dynamitey#if-you-end-up-with-both-packages). -Dropping `netstandard2.0` here is **8.0.0** ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)), later in 2026. [#29](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/29) was the older ticket. It is closed. The switch is [#130](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/130). +[#95](https://github.com/dynamitey-community/dynamitey/issues/95) is Dynamitey.Community 5.0.0. It ships after .NET 11 is generally available (scheduled 10 November 2026) and targets `net10.0` and `net11.0`. The `netstandard2.0` leg is why that library still carries `#if NETSTANDARD2_0`, a `Guard.NotNull` helper instead of `ArgumentNullException.ThrowIfNull`, attribute polyfills, a C# 7.3 language default, and package references to `Microsoft.CSharp` 4.* and `System.Reflection.Emit` 4.7.0. Those packages are in the shared framework on .NET 10 and .NET 11. The Framework hash of a member name cannot call `string.GetHashCode(StringComparison.Ordinal)`, so it does not match the ordinal `Equals`. 5.0.0 deletes that split. It does not make a warm `InvokeMember` faster, and it does not make the library trim-safe. + +7.0.0 of this library is the matching line: the last release with `netstandard2.0`. A Framework 4.6.1 through 4.8.1 application stays here. **8.0.0** ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)) takes Dynamitey.Community 5.0.0 and drops .NET Standard 2.0. [#29](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/29) was the older ticket. It is closed. The 4.0.0 switch is [#130](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/130). ## Do not take a compile-time dependency on Dynamitey internals diff --git a/docfx/docs/getting-started.md b/docfx/docs/getting-started.md index 4d00be0..86517ab 100644 --- a/docfx/docs/getting-started.md +++ b/docfx/docs/getting-started.md @@ -3,7 +3,7 @@ ## Installing > [!IMPORTANT] -> Install **7.0.0** (`netstandard2.0` + `net10.0`, Dynamitey.Community 4.0.0). **6.0.0** was the same target frameworks on Dynamitey 3.0.3. **5.0.1.268** is the previous TFM set (`net45` / `netstandard1.6` / `netstandard2.0`). +> Install **7.0.0** (`netstandard2.0` + `net10.0`, Dynamitey.Community 4.0.0). This is the last release that supports .NET Standard 2.0, which is .NET Framework 4.6.1 through 4.8.1. **6.0.0** was the same target frameworks on Dynamitey 3.0.3. **5.0.1.268** is the previous TFM set (`net45` / `netstandard1.6` / `netstandard2.0`). ```bash dotnet add package FSharp.Interop.Dynamic diff --git a/docfx/docs/releasing.md b/docfx/docs/releasing.md index 001ae1a..6de61bc 100644 --- a/docfx/docs/releasing.md +++ b/docfx/docs/releasing.md @@ -4,9 +4,9 @@ NuGet publish is tag-triggered. The workflow is `.github/workflows/publish.yml`. ## Version -`VersionPrefix` is **7.0.0**. That release switches the dependency to Dynamitey.Community 4.0.0. Target frameworks stay `netstandard2.0` and `net10.0`. +`VersionPrefix` is **7.0.0**. That release references Dynamitey.Community 4.0.0 and targets `netstandard2.0` and `net10.0`. It is the last release that supports .NET Standard 2.0, and so the last release a .NET Framework 4.6.1 through 4.8.1 application can take. -**8.0.0**, later in 2026, drops `netstandard2.0` and targets `net10.0` and `net11.0` ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)). Not another 5.x. +**8.0.0** drops `netstandard2.0` and targets `net10.0` and `net11.0` ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)). It follows [Dynamitey.Community 5.0.0](https://github.com/dynamitey-community/dynamitey/issues/95). Not another 5.x. ## Cut a release diff --git a/docfx/index.md b/docfx/index.md index 57ec28d..b0ff08b 100644 --- a/docfx/index.md +++ b/docfx/index.md @@ -10,7 +10,7 @@ F# operators and helpers for the Dynamic Language Runtime. `target?Name`, `targe This is the fsprojects library that sits on [Dynamitey.Community](https://www.nuget.org/packages/Dynamitey.Community/) 4.0.0. It is not Dynamitey itself; it is the F# surface. > [!IMPORTANT] -> **7.0.0** is the current package (`netstandard2.0` and `net10.0`, Dynamitey.Community 4.0.0). **6.0.0** was the same target frameworks on Dynamitey 3.0.3. **5.0.1.268** was the last package that still targeted `net45` / `netstandard1.6`. +> **7.0.0** is the current package, and the last one that supports .NET Standard 2.0 (.NET Framework 4.6.1 through 4.8.1) together with `net10.0`. It references Dynamitey.Community 4.0.0. **6.0.0** was the same target frameworks on Dynamitey 3.0.3. **5.0.1.268** was the last package that still targeted `net45` / `netstandard1.6`. ## Where to start @@ -54,7 +54,7 @@ Reach for ordinary F# when the member is known at compile time. Reach for this l ## Supported frameworks -`netstandard2.0` and `net10.0`. `netstandard2.0` still reaches .NET Framework 4.6.2+ and modern .NET from one package. 6.0.0 dropped `net45` and `netstandard1.6`. 7.0.0 keeps these targets and references Dynamitey.Community 4.0.0. 8.0.0, later in 2026, drops `netstandard2.0` and targets `net10.0` and `net11.0` ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)). +7.0.0 targets `netstandard2.0` and `net10.0`. `netstandard2.0` is how a .NET Framework 4.6.1 through 4.8.1 application uses this package. It is also the last release that includes that target. 8.0.0 targets `net10.0` and `net11.0` only ([#108](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/108)), after [Dynamitey.Community 5.0.0](https://github.com/dynamitey-community/dynamitey/issues/95) drops `netstandard2.0`. Framework 4.8.1 stays serviced with Windows and does not gain BCL APIs, so a Framework application stays on 7.0.0. ## A word on trimming and AOT