Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`).

---

Expand Down
6 changes: 4 additions & 2 deletions docfx/docs/dynamitey.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docfx/docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions docfx/docs/releasing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions docfx/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
Loading