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
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,20 @@ Each release has a `## [version]` section. When a `v*.*.*` tag is pushed, the Pu

## [Unreleased]

## [7.0.0]

### Breaking

- The Dynamitey dependency is [Dynamitey.Community 4.0.0](https://www.nuget.org/packages/Dynamitey.Community/4.0.0). The `Dynamitey` package id stays at 3.0.3. The namespace is still `Dynamitey`. The assembly name is `Dynamitey.Community`. `Dyn.namedArg`, `Dyn.staticContext`, and `Dyn.staticTarget` return types from that assembly. A project that also references `Dynamitey` 3.0.3 gets `CS0433`. Target frameworks stay `netstandard2.0` and `net10.0` (#130).

### Fixed

- `Dyn.tryGet` and `Dyn.exists` on a null target return `None` and `false`. `Dyn.explicitConvert` and `explicitConvertTo` of null follow `implicitConvert` (null for a reference result type; a value type still fails). `Dyn.set` on a null target still throws `NullReferenceException` (#111).
- Calls with 15 or more arguments no longer throw `TypeLoadException` from Dynamitey 3.0.3. That call site is fixed in Dynamitey.Community 4.0.0.

### Docs

- Caveats document 15-argument `TypeLoadException`, C# optional parameters, and `tryGet` / `exists` on a null target (#110).
- Caveats document 15-argument `TypeLoadException` on 6.0.0, C# optional parameters, and `tryGet` / `exists` on a null target (#110, #111, #130).
- Copilot leftovers from the 6.0.0 docs pass: why.md examples, operators void `Add`, release checklist, XML docs for `Direct` / `!?` / Operators, DocFX theme alerts and link RGB, SECURITY.md triggers, VS Code task, changelog wording (#114–#126).

## [6.0.0]
Expand Down
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ docfx docfx/docfx.json --warningsAsErrors

PRs build the site; only `master` deploys to GitHub Pages.

## `netstandard2.0` is deliberate
## `netstandard2.0` stays through 7.0.0

It is the TFM that still reaches .NET Framework and modern .NET from one package. Do not drop it to "simplify" to `net10.0` only.
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.
4 changes: 2 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<RepositoryUrl>https://github.com/fsprojects/FSharp.Interop.Dynamic.git</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<!-- Next release is 6.0.0: net45 and netstandard1.6 were dropped. -->
<VersionPrefix>6.0.0</VersionPrefix>
<!-- 7.0.0 switches the dependency to Dynamitey.Community 4.0.0. Target frameworks stay netstandard2.0 and net10.0. -->
<VersionPrefix>7.0.0</VersionPrefix>

<!-- SDK Roslyn analyzers (CA*). F# has no C# AST, so Roslynator/Sonar C#
would be silent; these IL-level rules still fire. -->
Expand Down
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="coverlet.MTP" Version="10.0.1" />
<PackageVersion Include="Dynamitey" Version="3.0.3" />
<PackageVersion Include="Dynamitey.Community" Version="4.0.0" />
<PackageVersion Include="FSharp.Analyzers.Build" Version="0.5.0" />
<PackageVersion Include="FsCheck" Version="3.4.0" />
<!-- FSharp.Core is the library's published dependency floor, so keep it
Expand Down
2 changes: 1 addition & 1 deletion FSharp.Interop.Dynamic/FSharp.Interop.Dynamic.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

<ItemGroup>
<PackageReference Include="FSharp.Core" />
<PackageReference Include="Dynamitey" />
<PackageReference Include="Dynamitey.Community" />
<PackageReference Include="Microsoft.CSharp" />
<PackageReference Include="FSharp.Analyzers.Build">
<PrivateAssets>all</PrivateAssets>
Expand Down
32 changes: 23 additions & 9 deletions FSharp.Interop.Dynamic/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
"version": 2,
"dependencies": {
".NETStandard,Version=v2.0": {
"Dynamitey": {
"Dynamitey.Community": {
"type": "Direct",
"requested": "[3.0.3, )",
"resolved": "3.0.3",
"contentHash": "ocF4rRKgnmBkblk8RrgRP9YxxeJBvoaoCNLXgmUMgQCjZRw2v6Rtqxt5Kni6/TtbvICeWVN9X/69G5jltUEnbQ==",
"requested": "[4.0.0, )",
"resolved": "4.0.0",
"contentHash": "avIRAxvTkk75sMTg7e8atijRshqDlZgjIj7p2eBWW9MnfY9f6Mtb8hbcEc+2Km5gYZLefASI5Hc7tIUoMNH+ng==",
"dependencies": {
"Microsoft.CSharp": "4.7.0"
"Microsoft.CSharp": "4.7.0",
"System.Reflection.Emit": "4.7.0"
}
},
"FSharp.Analyzers.Build": {
Expand Down Expand Up @@ -48,14 +49,27 @@
"type": "Transitive",
"resolved": "1.1.0",
"contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
},
"System.Reflection.Emit": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==",
"dependencies": {
"System.Reflection.Emit.ILGeneration": "4.7.0"
}
},
"System.Reflection.Emit.ILGeneration": {
"type": "Transitive",
"resolved": "4.7.0",
"contentHash": "AucBYo3DSI0IDxdUjKksBcQJXPHyoPyrCXYURW1WDsLI4M65Ar/goSHjdnHOAY9MiYDNKqDlIgaYm+zL2hA1KA=="
}
},
"net10.0": {
"Dynamitey": {
"Dynamitey.Community": {
"type": "Direct",
"requested": "[3.0.3, )",
"resolved": "3.0.3",
"contentHash": "ocF4rRKgnmBkblk8RrgRP9YxxeJBvoaoCNLXgmUMgQCjZRw2v6Rtqxt5Kni6/TtbvICeWVN9X/69G5jltUEnbQ=="
"requested": "[4.0.0, )",
"resolved": "4.0.0",
"contentHash": "avIRAxvTkk75sMTg7e8atijRshqDlZgjIj7p2eBWW9MnfY9f6Mtb8hbcEc+2Km5gYZLefASI5Hc7tIUoMNH+ng=="
},
"FSharp.Analyzers.Build": {
"type": "Direct",
Expand Down
16 changes: 10 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,23 @@ F# operators for the Dynamic Language Runtime. `target?Name`, `target?Name <- va

**Docs:** [fsprojects.github.io/FSharp.Interop.Dynamic](https://fsprojects.github.io/FSharp.Interop.Dynamic/)

This library sits on [Dynamitey](https://www.nuget.org/packages/Dynamitey/) 3.0.3. It is the F# surface, not Dynamitey itself.
This library sits on [Dynamitey.Community](https://www.nuget.org/packages/Dynamitey.Community/) 4.0.0. It is the F# surface, not Dynamitey itself.

F# has no `dynamic` keyword. Use this when the member is not known at compile time: Expando/JSON bags, optional fields, method names from config, C# APIs that return `dynamic`, pythonnet, COM. Use ordinary F# when the type is in your project. Full argument: [Why this library](https://fsprojects.github.io/FSharp.Interop.Dynamic/docs/why.html).

---

## Version story

**6.0.0** is the current package: `netstandard2.0` + `net10.0`, `Dyn.tryGet` / `Dyn.exists`. That is a TFM break from **5.0.1.268** (`net45` / `netstandard1.6` / `netstandard2.0`). `netstandard2.0` still covers current .NET Framework and .NET.
**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`.

**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.

**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)).

---

## Install (6.0.0)
## Install (7.0.0)

```bash
dotnet add package FSharp.Interop.Dynamic
Expand Down Expand Up @@ -116,7 +120,7 @@ More: [Operators](https://fsprojects.github.io/FSharp.Interop.Dynamic/docs/opera

## Dynamitey

6.0.0 references **Dynamitey 3.0.3**. `tryGet` / `exists` do not wait on Dynamitey 4.0.0. The community continuation of Dynamitey is [dynamitey-community/dynamitey](https://github.com/dynamitey-community/dynamitey); switching this package to it is [#29](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/29).
7.0.0 references [**Dynamitey.Community 4.0.0**](https://www.nuget.org/packages/Dynamitey.Community/4.0.0), from [dynamitey-community/dynamitey](https://github.com/dynamitey-community/dynamitey). The `Dynamitey` package id stopped at 3.0.3 on 8 November 2023. The namespace is still `Dynamitey`. More: [Dynamitey](https://fsprojects.github.io/FSharp.Interop.Dynamic/docs/dynamitey.html).

You can still `open Dynamitey` for `Build`, `Dynamic.Curry`, `DynamicObjects.Dictionary`.

Expand All @@ -126,7 +130,7 @@ You can still `open Dynamitey` for `Build`, `Dynamic.Curry`, `DynamicObjects.Dic

- The DLR cannot see **explicit interface members** (same as C# `dynamic`).
- **Not trim-safe or NativeAOT-safe.**
- **15 or more arguments** throw `TypeLoadException` (ImpromptuInterface was never shipped). Fourteen work.
- **15 or more arguments** threw `TypeLoadException` on 6.0.0 (Dynamitey 3.0.3). 7.0.0 takes the fix in Dynamitey.Community 4.0.0.
- **C# optional parameters** must all be passed. The DLR does not fill defaults.
- `tryGet` / `exists` on a **null target** are `None` / `false`. `Dyn.set` on a null target still throws `NullReferenceException`.
- Do not build member names from untrusted input. [SECURITY.md](SECURITY.md).
Expand All @@ -152,7 +156,7 @@ dotnet test --project Tests/Tests.fsproj -c Release

Docs: `dotnet tool install -g docfx --version 2.78.5`, then `dotnet build FSharp.Interop.Dynamic/FSharp.Interop.Dynamic.fsproj -c Release && docfx docfx/docfx.json`.

Release: add the version's section to [CHANGELOG.md](CHANGELOG.md), then tag `v6.0.0` and push. [Releasing](https://fsprojects.github.io/FSharp.Interop.Dynamic/docs/releasing.html).
Release: add the version's section to [CHANGELOG.md](CHANGELOG.md), then tag `v7.0.0` and push. [Releasing](https://fsprojects.github.io/FSharp.Interop.Dynamic/docs/releasing.html).

---

Expand Down
11 changes: 10 additions & 1 deletion Tests/Invocation.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ open Microsoft.CSharp.RuntimeBinder
type Echo() =
member _.Of<'T>(x: 'T) = x

type AddFifteen() =
member _.Sum(a: int, b: int, c: int, d: int, e: int, f: int, g: int, h: int, i: int, j: int, k: int, l: int, m: int, n: int, o: int) =
a + b + c + d + e + f + g + h + i + j + k + l + m + n + o

type Touch() =
member val Called = false with get, set
member this.Go() = this.Called <- true
Expand Down Expand Up @@ -155,4 +159,9 @@ module Invocation =
[<Fact>]
let ``a throwing getter is not wrapped after a binder failure`` () =
(fun () -> PropThrows() |> Dyn.invokeMember "Bad" () |> ignore)
|> should throw typeof<InvalidOperationException>
|> should throw typeof<InvalidOperationException>

[<Fact>]
let ``fifteen arguments do not throw TypeLoadException`` () =
let n: int = AddFifteen() |> Dyn.invokeMember "Sum" (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
n |> should equal 15
10 changes: 5 additions & 5 deletions Tests/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -267,15 +267,15 @@
"fsharp.interop.dynamic": {
"type": "Project",
"dependencies": {
"Dynamitey": "[3.0.3, )",
"Dynamitey.Community": "[4.0.0, )",
"FSharp.Core": "[4.7.2, )"
}
},
"Dynamitey": {
"Dynamitey.Community": {
"type": "CentralTransitive",
"requested": "[3.0.3, )",
"resolved": "3.0.3",
"contentHash": "ocF4rRKgnmBkblk8RrgRP9YxxeJBvoaoCNLXgmUMgQCjZRw2v6Rtqxt5Kni6/TtbvICeWVN9X/69G5jltUEnbQ=="
"requested": "[4.0.0, )",
"resolved": "4.0.0",
"contentHash": "avIRAxvTkk75sMTg7e8atijRshqDlZgjIj7p2eBWW9MnfY9f6Mtb8hbcEc+2Km5gYZLefASI5Hc7tIUoMNH+ng=="
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion docfx/docs/caveats.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Annotate `'T` / `unit` so the binder and the conversion agree.

## More than 14 arguments

A call with **15 or more** arguments throws `TypeLoadException: Cannot Emit long delegates without ImpromptuInterface installed`. Fourteen arguments work. Dynamitey 3.0.3 never shipped ImpromptuInterface with this package. A fix belongs in a newer Dynamitey, not in a vendor here ([#29](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/29)).
On 6.0.0 a call with **15 or more** arguments threw `TypeLoadException: Cannot Emit long delegates without ImpromptuInterface installed`. Fourteen arguments worked. Dynamitey 3.0.3 never declared the package that path needed. Dynamitey.Community 4.0.0 builds that call site, and 7.0.0 takes that package.

## C# optional parameters

Expand Down
14 changes: 10 additions & 4 deletions docfx/docs/dynamitey.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
# Dynamitey

This library is an F# façade over [Dynamitey](https://www.nuget.org/packages/Dynamitey/). 6.0.0 references **Dynamitey 3.0.3** — the last upstream release. It does not need Dynamitey 4.0.0 to ship.
This library is an F# façade over Dynamitey. 7.0.0 references [**Dynamitey.Community 4.0.0**](https://www.nuget.org/packages/Dynamitey.Community/4.0.0). 6.0.0 referenced **Dynamitey 3.0.3**, the last release from [ekonbenefits/dynamitey](https://github.com/ekonbenefits/dynamitey), published 8 November 2023.

## What each project is

| | Dynamitey | FSharp.Interop.Dynamic |
| --- | --- | --- |
| Language | C# | F# |
| Package | `Dynamitey` 3.0.3 on nuget.org | `FSharp.Interop.Dynamic` |
| Continuation | [dynamitey-community/dynamitey](https://github.com/dynamitey-community/dynamitey) (4.0.0 not published yet) | this repo, `fsprojects` |
| Package | [`Dynamitey.Community` 4.0.0](https://www.nuget.org/packages/Dynamitey.Community/4.0.0). The `Dynamitey` id is still 3.0.3 | `FSharp.Interop.Dynamic` 7.0.0 |
| Source | [dynamitey-community/dynamitey](https://github.com/dynamitey-community/dynamitey) | this repo, `fsprojects` |
| You write | `Dynamic.InvokeGet(o, "Name")` | `o?Name` / `o |> Dyn.get "Name"` |

The F# operators call `Dynamic.InvokeGet`, `InvokeSet`, `InvokeMember`, `InvokeConvert`, and friends. Named arguments are Dynamitey `InvokeArg`. Static calls use Dynamitey `InvokeContext`.

## 4.0.0

The community continuation targets `netstandard2.0` + `net10.0` and is ready as Dynamitey 4.0.0. Until that package exists on nuget.org, this library stays on 3.0.3. Switching the package reference is [#29](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/29). `tryGet` / `exists` already work on 3.0.3 because they use `InvokeGet`.
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).

`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).

## Do not take a compile-time dependency on Dynamitey internals

Expand Down
4 changes: 2 additions & 2 deletions docfx/docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
## Installing

> [!IMPORTANT]
> Install **6.0.0** (`netstandard2.0` + `net10.0`). **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). **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
```

```xml
<PackageReference Include="FSharp.Interop.Dynamic" Version="6.0.0" />
<PackageReference Include="FSharp.Interop.Dynamic" Version="7.0.0" />
```

```fsharp
Expand Down
6 changes: 4 additions & 2 deletions docfx/docs/releasing.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ NuGet publish is tag-triggered. The workflow is `.github/workflows/publish.yml`.

## Version

`VersionPrefix` is **6.0.0**. That was the TFM break (`net45` / `netstandard1.6` dropped). The next release is `v6.0.1` (or `v6.1.0` / `v7.0.0`), not another 5.x.
`VersionPrefix` is **7.0.0**. That release switches the dependency to Dynamitey.Community 4.0.0. Target frameworks stay `netstandard2.0` and `net10.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)). Not another 5.x.

## Cut a release

Expand Down Expand Up @@ -38,4 +40,4 @@ Pull requests never publish.

## After it lands

Confirm nuget.org lists the new version and that README / getting-started install instructions match it. The next version after 6.0.0 is `v6.0.1` (or `v6.1.0` / `v7.0.0`), not another 5.x.
Confirm nuget.org lists the new version and that README / getting-started install instructions match it. After 7.0.0, the next planned major is 8.0.0 (drop `netstandard2.0`). Not another 5.x.
2 changes: 1 addition & 1 deletion docfx/docs/tryget.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[#27](https://github.com/fsprojects/FSharp.Interop.Dynamic/issues/27): unstructured objects, check `o?myProp` without eating a `RuntimeBinderException`.

These ship on Dynamitey **3.0.3**. They do not need Dynamitey 4.0.0.
These call `InvokeGet`. In 7.0.0 that call goes to Dynamitey.Community 4.0.0.

## `Dyn.tryGet`

Expand Down
8 changes: 4 additions & 4 deletions docfx/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ title: FSharp.Interop.Dynamic

F# operators and helpers for the Dynamic Language Runtime. `target?Name`, `target?Name<-value`, and `!?target` do what C#'s `dynamic` keyword does, with F# inference and piping.

This is the fsprojects library that sits on [Dynamitey](https://www.nuget.org/packages/Dynamitey/) 3.0.3. It is not Dynamitey itself; it is the F# surface.
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]
> **6.0.0** is the current package (`netstandard2.0` and `net10.0`). **5.0.1.268** was the last package that still targeted `net45` / `netstandard1.6`.
> **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`.

## Where to start

Expand All @@ -23,7 +23,7 @@ This is the fsprojects library that sits on [Dynamitey](https://www.nuget.org/pa
| Check a member without throwing | [tryGet and exists](docs/tryget.md) |
| Dynamic `+`, `*`, comparisons | [Binary operators](docs/binary-operators.md) |
| Turn a quotation into a member name | [Quotations](docs/quotations.md) |
| How this relates to Dynamitey 3.0.3 / 4.0.0 | [Dynamitey](docs/dynamitey.md) |
| How this relates to Dynamitey.Community 4.0.0 | [Dynamitey](docs/dynamitey.md) |
| What the DLR will not do | [Caveats](docs/caveats.md) |
| Cut a NuGet release | [Releasing](docs/releasing.md) |
| Look up a specific type or member | [API reference](api/index.md) |
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`. The `netstandard2.0` target is kept deliberately — it is the only target reaching both .NET Framework 4.6.2+ and modern .NET from a single package. 6.0.0 dropped `net45` and `netstandard1.6`.
`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)).

## A word on trimming and AOT

Expand Down
Loading