Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1fc4f5e
build(deps): bump actions/upload-artifact from 4.6.2 to 7.0.1
dependabot[bot] Aug 1, 2026
5b89d5c
build(deps): bump actions/setup-dotnet from 4.3.1 to 6.0.0
dependabot[bot] Aug 1, 2026
c70f091
build(deps): bump actions/download-artifact from 4.3.0 to 8.0.1
dependabot[bot] Aug 1, 2026
55b6486
build(deps): bump actions/checkout from 4.4.0 to 7.0.1
dependabot[bot] Aug 1, 2026
dbf7b38
Bump the microsoft-extensions group with 8 updates
dependabot[bot] Aug 1, 2026
f6c4b82
Bump the roslyn group with 2 updates
dependabot[bot] Aug 1, 2026
f2fbb3e
Bump the testing group with 1 update
dependabot[bot] Aug 1, 2026
2172c90
Bump System.Text.Json from 10.0.2 to 10.0.10
dependabot[bot] Aug 1, 2026
620ef23
Bump System.Threading.RateLimiting from 10.0.2 to 10.0.10
dependabot[bot] Aug 1, 2026
b21274a
release: prepare SharpLink 1.0.1
Aug 2, 2026
8f4785c
Merge pull request #24: bump actions/upload-artifact
Aug 2, 2026
b3d8927
Merge pull request #25: bump actions/setup-dotnet
Aug 2, 2026
a451adc
Merge pull request #26: bump actions/download-artifact
Aug 2, 2026
e92d7c3
Merge pull request #27: bump actions/checkout
Aug 2, 2026
5e4a208
Merge pull request #29: bump Microsoft.Extensions
Aug 2, 2026
93fdf93
Merge pull request #30: bump Roslyn
Aug 2, 2026
9d75b0c
Merge pull request #31: bump TUnit
Aug 2, 2026
6d29b24
Merge pull request #32: bump System.Text.Json
Aug 2, 2026
3572aa0
Merge pull request #33: bump System.Threading.RateLimiting
Aug 2, 2026
ed5f4fd
release: prepare SharpLink 1.0.1 dependency refresh
Aug 2, 2026
23b6093
Merge pull request #38 from SunSi12138/release/1.0.1-automated-depend…
SunSi12138 Aug 2, 2026
fc3e39f
chore: sync main into dev before 1.0.1 release
Aug 2, 2026
5ed4096
Merge pull request #40 from SunSi12138/release/1.0.1-main-sync
SunSi12138 Aug 2, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Initialize CodeQL
uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
Expand Down
18 changes: 9 additions & 9 deletions .github/workflows/nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand Down Expand Up @@ -79,10 +79,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -100,10 +100,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -121,10 +121,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -147,7 +147,7 @@ jobs:

- name: Upload Chaos Report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: chaos-nightly-2h-${{ runner.os }}
path: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/performance-evidence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ jobs:
SHARPLINK_MATRIX_OUTPUT: ${{ github.workspace }}/artifacts/performance/smoke/${{ github.sha }}
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -42,7 +42,7 @@ jobs:

- name: Upload raw smoke evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: sharplink-performance-smoke-${{ github.sha }}
path: artifacts/performance/smoke/${{ github.sha }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pr-quick.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand Down Expand Up @@ -91,7 +91,7 @@ jobs:

- name: Upload Chaos Report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: chaos-pr-smoke
path: |
Expand Down
28 changes: 14 additions & 14 deletions .github/workflows/release-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand Down Expand Up @@ -63,7 +63,7 @@ jobs:

- name: Upload Integration Diagnostics
if: failure()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: integration-${{ runner.os }}-diagnostics
path: artifacts/test-results/integration-${{ runner.os }}
Expand Down Expand Up @@ -100,10 +100,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -121,10 +121,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand Down Expand Up @@ -156,7 +156,7 @@ jobs:
test -n "$(find artifacts/nuget -name '*.nupkg' -type f)"

- name: Upload NuGet artifacts
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: nuget-packages
path: |
Expand All @@ -174,10 +174,10 @@ jobs:
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

Expand All @@ -194,7 +194,7 @@ jobs:

- name: Upload Chaos Report
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: chaos-release-smoke-${{ runner.os }}
path: |
Expand Down Expand Up @@ -223,15 +223,15 @@ jobs:
contents: read
steps:
- name: Checkout exact tag
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

- name: Setup .NET
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 10.0.x

- name: Download release-gated packages
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: nuget-packages
path: artifacts/nuget
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@

## [Unreleased]

## [1.0.1] - 2026-08-02

### Fixed

- A standalone contract project can now reference only `SharpLink.Sdk`. The package brings the required runtime and abstractions transitively, so generated Proxy, Stub, Codec, and Manifest sources no longer fail with missing SharpLink namespaces or types.
- Contract marker types now live in `SharpLink.Abstractions` while retaining the `SharpLink.Sdk` namespace. `SharpLink.Sdk` forwards every type published by 1.0.0, preserving existing compiled consumers without introducing a NuGet dependency cycle.

### Changed

- The README multi-cluster client section is now fully localized in Chinese, and the package graph, separated-contract guidance, architecture, and release order reflect the SDK-only contract reference model.
- All SharpLink NuGet packages now include the transparent SharpLink icon, which is also displayed in the README.
- Runtime and build dependencies are refreshed together: Microsoft.Extensions, System.Text.Json, and System.Threading.RateLimiting move to 10.0.10, while Microsoft.CodeAnalysis.Analyzers moves to 5.6.0. The source-generator compiler API and TUnit remain pinned to their verified SDK-compatible baselines after the proposed major updates failed the release gate.
- GitHub Actions remain pinned to exact commits while moving to checkout 7.0.1, setup-dotnet 6.0.0, upload-artifact 7.0.1, and download-artifact 8.0.1.

### Compatibility

- Protocol v2 bytes, generated contract IDs, runtime routing, transport behavior, and public type names are unchanged. This patch repairs package dependency closure, preserves old assembly references through type forwarding, updates release assets and documentation, and refreshes compatible build/runtime dependencies.

## [1.0.0] - 2026-08-02

### Highlights
Expand Down
4 changes: 3 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@
</PropertyGroup>
<!-- Nuget包信息 -->
<PropertyGroup>
<VersionPrefix>1.0.0</VersionPrefix>
<VersionPrefix>1.0.1</VersionPrefix>
<Authors>sunsi</Authors>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>sharplink-icon.png</PackageIcon>
<PackageTags>rpc;dotnet;source-generator;streaming;ipc;tcp;shared-memory;nativeaot</PackageTags>
<PackageReleaseNotes>https://github.com/SunSi12138/SharpLink/blob/v$(Version)/CHANGELOG.md</PackageReleaseNotes>
<RepositoryUrl>https://github.com/SunSi12138/SharpLink</RepositoryUrl>
Expand Down Expand Up @@ -46,6 +47,7 @@

<ItemGroup Condition="'$(IsPackable)' == 'true' and Exists('$(MSBuildThisFileDirectory)README.md')">
<None Include="$(MSBuildThisFileDirectory)README.md" Pack="true" PackagePath="\" Visible="false" />
<None Include="$(MSBuildThisFileDirectory)assets/sharplink-icon.png" Pack="true" PackagePath="\" Visible="false" />
</ItemGroup>
<!-- 项目配置 -->
<PropertyGroup>
Expand Down
23 changes: 12 additions & 11 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,30 @@
</PropertyGroup>
<ItemGroup>
<!-- 分析器依赖 -->
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.6.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="5.0.0" />
<!-- Source generators must not reference a compiler API newer than the compiler hosted by the pinned .NET SDK. -->
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="5.0.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="5.0.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="5.0.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="5.0.0" />
<PackageVersion Include="System.Text.Json" Version="10.0.2" />
<PackageVersion Include="System.Threading.RateLimiting" Version="10.0.2" />
<PackageVersion Include="System.Text.Json" Version="10.0.10" />
<PackageVersion Include="System.Threading.RateLimiting" Version="10.0.10" />
<!-- 第三方依赖 -->
<PackageVersion Include="SharpPack" Version="[1.1.0]" />
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.2" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.10" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.10" />
<PackageVersion Include="TUnit" Version="1.14.0" />
</ItemGroup>
</Project>
28 changes: 12 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# SharpLink

<p align="center">
<img src="assets/sharplink-icon.png" alt="SharpLink 图标" width="128" height="128" />
</p>

[![PR Quick](https://github.com/SunSi12138/SharpLink/actions/workflows/pr-quick.yml/badge.svg)](https://github.com/SunSi12138/SharpLink/actions/workflows/pr-quick.yml)
[![Nightly Regression](https://github.com/SunSi12138/SharpLink/actions/workflows/nightly.yml/badge.svg)](https://github.com/SunSi12138/SharpLink/actions/workflows/nightly.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
Expand All @@ -19,9 +23,9 @@

核心项目(`src/`):

- `SharpLink.Abstractions`:Protocol v2 公共模型、公共接口、通道与传输抽象
- `SharpLink.Abstractions`:契约标记、Protocol v2 公共模型、公共接口、通道与传输抽象
- `SharpLink.Runtime`:`RpcSession`、`StreamManager`、实例级 Codec Provider、传输实现与底层收发逻辑
- `SharpLink.Sdk`:`IService`、`[RpcContract]`、`[RpcService]`、`[Oneway]`、`[Timeout]` 等契约标记
- `SharpLink.Sdk`:契约项目的单一引用入口,提供分析器、源生成器及 1.0.0 类型转发兼容层
- `SharpLink.Client`:客户端 Builder、连接生命周期、请求管理与代理调用通道
- `SharpLink.Server`:服务端 Builder、连接管理、Stub 分发、心跳与取消处理
- `SharpLink.Hosting`:`IServiceCollection` 扩展与 HostedService 集成
Expand Down Expand Up @@ -99,22 +103,18 @@ dotnet run --project demo/SeparatedClient/SeparatedClient.csproj
[assembly: SharpLinkRpcContracts(typeof(MyContract1), typeof(MyContract2))]
```

## Multi-cluster clients
## 多集群客户端

`SharpLinkMultiClusterClientBuilder` owns several isolated child clients. A contract is mapped to a
single child while its proxy is created; RPC calls made through that proxy do not consult a
coordinator, cluster name, or per-call routing context.
`SharpLinkMultiClusterClientBuilder` 管理多个彼此隔离的子客户端。创建代理时,每个契约只映射到一个子客户端;之后通过该代理发起 RPC 调用时,不会再查询协调器、集群名称或逐调用路由上下文。

Declare static contract-assembly routes in the application or host assembly, not in a reusable
contract package:
静态契约程序集路由应声明在应用或宿主程序集中,不要写入可复用的契约包:

```csharp
[assembly: SharpLinkClusterContractAssembly("orders", typeof(OrderContractsMarker))]
[assembly: SharpLinkClusterContractAssembly("payments", typeof(PaymentContractsMarker))]
```

Configure each slot with the existing child builder API. The `UseCluster` method inside the delegate
still configures endpoint topology for that one slot; it is not the multi-cluster coordinator API.
每个槽位继续使用现有的子 Builder API 配置。委托内的 `UseCluster` 仍然只负责该槽位自身的端点拓扑,并不是多集群协调器 API。

```csharp
var client = SharpLinkMultiClusterClientBuilder.Create()
Expand All @@ -127,18 +127,14 @@ var orders = client.Get<IOrderService>();
var payments = client.Get<IPaymentService>();
```

Every slot is required by default. A slot intentionally reserved for plugins must explicitly opt in:
默认情况下,每个槽位都必须具有契约。专门预留给插件的槽位必须显式启用动态契约:

```csharp
.AddCluster("plugins", child => child.UseTcp("127.0.0.1", 5103),
slot => slot.AllowDynamicContracts = true)
```

Dynamic contracts are registered against an explicit slot with
`RegisterAssembly(cluster, assembly)`, `UnregisterAssemblyAsync(cluster, assembly, timeout)`, and
`ReplaceAssemblyAsync(cluster, oldAssembly, newAssembly, timeout)`. There is no default cluster,
per-call cluster override, cross-cluster retry, or cluster identifier on the wire. See
[`doc/dynamic-modules-and-multicluster.md`](doc/dynamic-modules-and-multicluster.md) for lifecycle and migration details.
动态契约必须注册到明确指定的槽位,相关 API 为 `RegisterAssembly(cluster, assembly)`、`UnregisterAssemblyAsync(cluster, assembly, timeout)` 和 `ReplaceAssemblyAsync(cluster, oldAssembly, newAssembly, timeout)`。当前不存在默认集群、逐调用集群覆盖、跨集群重试,线上协议也不携带集群标识。生命周期与迁移细节见 [`doc/dynamic-modules-and-multicluster.md`](doc/dynamic-modules-and-multicluster.md)。

## 契约 Manifest 与兼容性基线

Expand Down
Binary file added assets/sharplink-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading