Skip to content

Add C# csm-tcp-router-client SDK - #38

Merged
nevstop merged 3 commits into
Dev_2026Q2from
copilot/add-csharp-csm-tcp-router-client
Apr 27, 2026
Merged

Add C# csm-tcp-router-client SDK#38
nevstop merged 3 commits into
Dev_2026Q2from
copilot/add-csharp-csm-tcp-router-client

Conversation

CopilotAI commented Apr 27, 2026

Copy link
Copy Markdown
Contributor
  • Create SDK/csharp/ directory mirroring SDK/python/
  • Implement single-file SDK src/CsmTcpRouter/CsmTcpRouter.cs
  • Add CsmTcpRouter.csproj library project (netstandard2.0 + net8.0, NuGet metadata)
  • Add xUnit test project tests/CsmTcpRouter.Tests/
  • Add examples/BasicUsage/ console example
  • Add VS solution file CsmTcpRouter.sln
  • Add README.md, README.zh-cn.md, CHANGELOG.md, LICENSE
  • Add .github/workflows/CSharp_SDK.yml
  • Update .gitignore for C# build artifacts
  • Build and run all tests locally
  • Address review feedback:
    • Replace flaky port-1 assumption with GetClosedPort() helper that binds a TcpListener to port 0, captures the OS-assigned port, then stops the listener
    • Replace Thread.Sleep in UnsubscribeStatus_RemovesCallback with ManualResetEventSlim.Wait(150) assertion
    • WaitForServerAsync now awaits the connect task in both success and timeout-loss paths so faults are observed; proactively closes the probe when the delay wins so the in-flight connect attempt is cancelled
    • WaitForRespAsync and WaitForCmdRespAsync now force _transport.Disconnect() on timeout so a late RESP / CMD_RESP from the timed-out command can no longer be misattributed to the next request (protocol v0 has no correlation id)

CopilotAI linked an issue Apr 27, 2026 that may be closed by this pull request
…sts, example, NuGet packaging, and GitHub Actions workflow
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/1c9d260f-6983-4c60-9d7a-f07538723b70
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
@nevstop
nevstop requested a review from CopilotApril 27, 2026 11:57
CopilotAI changed the title [WIP] Add C# external interface for csm-tcp-router-client SDKAdd C# csm-tcp-router-client SDKApr 27, 2026
CopilotAI requested a review from nevstopApril 27, 2026 11:58

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new C#/.NET client SDK under SDK/csharp/ that mirrors the existing Python client’s protocol and feature surface, including a single-file implementation, tests, example app, packaging metadata, and CI workflow.

Changes:

  • Introduces the single-file .NET client implementation (TcpRouterClient, protocol codec, models, exceptions, transport).
  • Adds xUnit protocol + integration tests with an in-process loopback MockServer.
  • Adds docs, runnable console example, NuGet packaging metadata, solution file, CI workflow, and .gitignore updates.

Reviewed changes

Copilot reviewed 14 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
FileDescription
SDK/csharp/src/CsmTcpRouter/CsmTcpRouter.csCore single-file SDK: protocol codec, transport, client APIs, models, exceptions
SDK/csharp/src/CsmTcpRouter/CsmTcpRouter.csprojMulti-targeted NuGet packaging metadata and deterministic CI build settings
SDK/csharp/tests/CsmTcpRouter.Tests/ProtocolTests.csProtocol codec + model/error parsing unit tests
SDK/csharp/tests/CsmTcpRouter.Tests/MockServer.csLoopback TCP mock server used by integration tests
SDK/csharp/tests/CsmTcpRouter.Tests/ClientIntegrationTests.csEnd-to-end tests for connect, commands, subscriptions, callbacks, timeouts, disconnect behavior
SDK/csharp/tests/CsmTcpRouter.Tests/CsmTcpRouter.Tests.csprojTest project dependencies + reference to the SDK project
SDK/csharp/examples/BasicUsage/Program.csRunnable example showing typical client flows
SDK/csharp/examples/BasicUsage/BasicUsage.csprojExample project referencing the SDK
SDK/csharp/README.mdEnglish SDK documentation and API overview
SDK/csharp/README.zh-cn.mdChinese SDK documentation and API overview
SDK/csharp/CHANGELOG.mdInitial changelog entry for v0.1.0
SDK/csharp/LICENSEMIT license for the C# SDK distribution
SDK/csharp/CsmTcpRouter.slnSolution grouping src/tests/examples
.github/workflows/CSharp_SDK.ymlCross-OS build/test + pack + tag-gated NuGet publish workflow
.gitignoreIgnore .NET build artifacts and NuGet outputs

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +59 to +63
using var client = new TcpRouterClient();
// Port 1 is virtually guaranteed to be closed; use a short timeout.
Assert.Throws<RouterConnectionException>(
() => client.Connect("127.0.0.1", 1, TimeSpan.FromMilliseconds(500)));
}

CopilotAIApr 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests assume TCP port 1 is closed to trigger connection/availability failures. On some machines/containers that port can be open, which would make the tests flaky. Consider allocating an unused port more deterministically (e.g., bind a TcpListener to port 0 to obtain a free port, stop it, then test against that port) or use an address/port combination guaranteed to fail in the test environment.

Copilot uses AI. Check for mistakes.
Comment on lines +590 to +596
var ct = probe.ConnectAsync(host, port);
var winner = await Task.WhenAny(ct, Task.Delay(TimeSpan.FromSeconds(1))).ConfigureAwait(false);
if (winner == ct && !ct.IsFaulted)
{
try { probe.Close(); } catch { /* ignore */ }
return true;
}

CopilotAIApr 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WaitForServerAsync starts TcpClient.ConnectAsync and uses Task.WhenAny with a 1s delay, but it never awaits/observes the connect task when it faults or times out. This can leave unobserved exceptions and potentially keep an in-flight connect attempt running until the socket is disposed. Consider awaiting the connect task in both success and failure paths (to observe exceptions) and proactively closing the probe socket when the delay wins (or using a CancellationToken/WaitAsync timeout) so each retry is cleanly cancelled.

Suggested change
varct=probe.ConnectAsync(host,port);
varwinner=awaitTask.WhenAny(ct,Task.Delay(TimeSpan.FromSeconds(1))).ConfigureAwait(false);
if(winner==ct&&!ct.IsFaulted)
{
try{probe.Close();}catch{/* ignore */}
returntrue;
}
varconnectTask=probe.ConnectAsync(host,port);
varwinner=awaitTask.WhenAny(connectTask,Task.Delay(TimeSpan.FromSeconds(1))).ConfigureAwait(false);
if(winner==connectTask)
{
awaitconnectTask.ConfigureAwait(false);
try{probe.Close();}catch{/* ignore */}
returntrue;
}
try{probe.Close();}catch{/* ignore */}
try
{
awaitconnectTask.ConfigureAwait(false);
}
catch(SocketException){/* not ready yet */}
catch(IOException){/* not ready yet */}
catch(ObjectDisposedException){/* connect aborted by closing probe */}

Copilot uses AI. Check for mistakes.
Comment on lines +788 to +796
var tcs = _respTcs;
var winner = await Task.WhenAny(tcs.Task, Task.Delay(timeout)).ConfigureAwait(false);
if (winner != tcs.Task)
throw new RouterTimeoutException($"No response received within {timeout.TotalSeconds:F1}s.");
object item = await tcs.Task.ConfigureAwait(false);
if (item is Exception exc) throw exc;
var packet = (Packet)item;
return new CommandResponse(packet.Data);
}

CopilotAIApr 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If WaitForRespAsync times out, the connection remains open and subsequent SendAndWait calls can consume a late RESP from the previous request (there is no correlation ID in the protocol, and OnPacket always completes the current _respTcs). This can cause callers to receive the wrong response for a later command. A safer approach is to treat a RESP timeout as a protocol desync and force a Disconnect() (or otherwise prevent further requests until reconnect) so late frames cannot be misattributed.

Copilot uses AI. Check for mistakes.
Comment on lines +800 to +807
var tcs = _cmdRespTcs;
var winner = await Task.WhenAny(tcs.Task, Task.Delay(timeout)).ConfigureAwait(false);
if (winner != tcs.Task)
throw new RouterTimeoutException($"No cmd-resp received within {timeout.TotalSeconds:F1}s.");
object item = await tcs.Task.ConfigureAwait(false);
if (item is Exception exc) throw exc;
// CMD_RESP payload is a handshake acknowledgment; discard it.
}

CopilotAIApr 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WaitForCmdRespAsync has the same desync risk as WaitForRespAsync: after a cmd-resp timeout the client stays connected, and a late CMD_RESP from the prior request can complete the next in-flight _cmdRespTcs, making a later Post/Subscribe appear to succeed incorrectly. Consider disconnecting (or marking the connection unusable) on CMD_RESP timeouts to avoid misattributing late frames.

Copilot uses AI. Check for mistakes.
Comment on lines +215 to +219
client.SubscribeStatus("Status", "AI", _ => Interlocked.Increment(ref hits), DefaultTimeout);
client.UnsubscribeStatus("Status", "AI", DefaultTimeout);

server.PushStatus("Status >> v1 <- AI");
Thread.Sleep(150);

CopilotAIApr 27, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test uses Thread.Sleep to assert that a callback is not invoked after UnsubscribeStatus. Sleep-based timing assertions are inherently flaky across CI environments. Prefer using a synchronization primitive (e.g., ManualResetEventSlim) and asserting it is not signaled within a timeout window, or push multiple status messages and assert the counter remains unchanged with a bounded wait loop.

Suggested change
client.SubscribeStatus("Status","AI", _ =>Interlocked.Increment(refhits),DefaultTimeout);
client.UnsubscribeStatus("Status","AI",DefaultTimeout);
server.PushStatus("Status >> v1 <- AI");
Thread.Sleep(150);
usingvarev=newManualResetEventSlim();
client.SubscribeStatus("Status","AI", _ =>{Interlocked.Increment(refhits);ev.Set();},DefaultTimeout);
client.UnsubscribeStatus("Status","AI",DefaultTimeout);
server.PushStatus("Status >> v1 <- AI");
Assert.False(ev.Wait(150),"callback was invoked after unsubscribe");

Copilot uses AI. Check for mistakes.
@nevstop

Copy link
Copy Markdown
Contributor

@copilot apply changes based on the comments in this thread

…m in unsubscribe test, observe WaitForServerAsync connect task, force disconnect on RESP/CMD_RESP timeout
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a52165ab-7829-42b0-91f9-e4ba84e0b6b9
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>

CopilotAI commented Apr 27, 2026

Copy link
Copy Markdown
ContributorAuthor

@copilot apply changes based on the comments in this thread

Addressed all five review comments in 050485e:

  • Replaced flaky port-1 usage in Connect_BadPort_Throws and WaitForServer_ReturnsFalseOnTimeout with a GetClosedPort() helper that binds a TcpListener to port 0, captures the OS-assigned port, then stops the listener.
  • Reworked WaitForServerAsync to await the connect task in both success and delay-wins paths so faults are observed; the probe socket is closed proactively when the delay wins to abort the in-flight connect attempt.
  • WaitForRespAsync and WaitForCmdRespAsync now force _transport.Disconnect() on timeout so a late RESP/CMD_RESP from the timed-out command cannot be misattributed to the next request (protocol v0 has no correlation id).
  • UnsubscribeStatus_RemovesCallback now uses ManualResetEventSlim.Wait(150) instead of Thread.Sleep.

All 51 tests still pass.

@nevstop
nevstop marked this pull request as ready for review April 27, 2026 12:20
@nevstop
nevstop merged commit 1193739 into Dev_2026Q2Apr 27, 2026
@nevstop
nevstop deleted the copilot/add-csharp-csm-tcp-router-client branch April 27, 2026 12:21
nevstop added a commit that referenced this pull request Jul 14, 2026
* Refactor bilingual README for clarity and replace Mermaid diagrams with Excalidraw-based PNG images (#29)
* docs: rewrite bilingual README with mermaid diagrams
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/457dc57e-fd6d-4087-a604-3a7a4dd68b7b
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: replace mermaid diagrams with static PNG images
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: replace mermaid with png diagrams and add excalidraw sources
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: align client diagram alt text with sequence content
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: normalize client diagram naming and alt text
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: unify client diagram alt text naming
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: improve diagram alt text accessibility in both READMEs
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a92684df-d1ef-4e7f-801e-473ee3d2911d
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Convert `.doc/CSM-TCP-Router.drawio` to Excalidraw source and synced PNG export (#30)
* docs: add excalidraw and png converted from drawio
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/8747d072-0055-4877-a383-891476e8e333
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: fix application spelling in converted diagram
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/8747d072-0055-4877-a383-891476e8e333
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* 17 python sdk (#32)
* feat: add Python pip-publishable SDK for CSM-TCP-Router (#31)
* feat: add Python pip-publishable SDK for CSM-TCP-Router
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/4a1ee665-7464-4bd0-8898-0725daef43d5
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* fix: add least-privilege permissions to CI workflow jobs
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/4a1ee665-7464-4bd0-8898-0725daef43d5
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* feat: add asyncio client, Chinese README, and TestPyPI CI stage (v0.2.0)
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/93afe5c4-c917-4b9b-a347-189efb3bf4db
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* fix: address all PR review comments (shared _errors, socket leak, locks, disconnect sentinels, isawaitable, changelog)
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/b0917f8e-c50c-4a63-ae30-a1c245a6d3d7
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Add bilingual VI API reference docs for CSM-TCP-Router (Server + Client) (#35)
* Initial plan
* docs: add bilingual VI API documentation for CSM-TCP-Router
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/cacb955d-6c38-4fc7-b30d-9381fbbd06e1
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: move VI API docs under src and align reference format
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/117da425-df26-4ecc-a8c4-ab0e98412e50
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* docs: restore compatibility notes in status API sections
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/117da425-df26-4ecc-a8c4-ab0e98412e50
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
* update PythonClientAPI/*
* Consolidate Python SDK into single-file `csm_tcp_router_client` module and release as v0.3.0 (#37)
* Consolidate Python SDK into single-file csm_tcp_router_client module
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/ffc74aa4-b55d-45b4-b066-749d1db8c176
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Bump SDK to 0.3.0 and fix workflow paths so publish jobs trigger
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/f2eec384-ae45-4817-bcb3-1f990db4954b
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Add C# csm-tcp-router-client SDK (#38)
* Initial plan
* Add C# csm-tcp-router-client SDK (single-file), VS solution, xUnit tests, example, NuGet packaging, and GitHub Actions workflow
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/1c9d260f-6983-4c60-9d7a-f07538723b70
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Address review: deterministic closed-port helper, ManualResetEventSlim in unsubscribe test, observe WaitForServerAsync connect task, force disconnect on RESP/CMD_RESP timeout
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/a52165ab-7829-42b0-91f9-e4ba84e0b6b9
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Add C csm-tcp-router-client SDK (multi-platform, VS2026, CMake, tests) (#40)
* Add C csm-tcp-router-client SDK with VS2026 + CMake + tests
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/ea6c42b2-b6f8-4ebe-8438-786601832ef5
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Address PR review comments on the C SDK
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/de04612d-484c-4905-9c04-06c451a01e15
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Drop redundant g_wsa_lock_inited; route cleanup through InitOnceExecuteOnce
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/de04612d-484c-4905-9c04-06c451a01e15
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Fix INADDR_LOOPBACK undeclared on macOS in mock_server.c (#41)
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/eab9769d-1260-4715-8d72-1e3241719ef1
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* 将 SDK/ 下所有代码注释翻译为中文 (#42)
* translate: convert all C SDK comments from English to Chinese
Translated all code comments in 11 C SDK files from English to Chinese,
preserving all code logic, variable names, function names, string literals,
Doxygen tags (@PARAM, @return, etc.) and technical proper names (TCP, CSM,
WSA, POSIX, BSD, Win32, Winsock2, pthreads, CMake, NUL, DLL, etc.).
Files translated:
- SDK/c/include/csm_tcp_router_client.h
- SDK/c/src/csm_tcp_router_client.c
- SDK/c/examples/basic_usage.c
- SDK/c/examples/subscribe_status.c
- SDK/c/tests/test_harness.h
- SDK/c/tests/mock_server.h
- SDK/c/tests/mock_server.c
- SDK/c/tests/test_main.c
- SDK/c/tests/test_client.c
- SDK/c/tests/test_protocol.c
- SDK/c/tests/test_integration.c
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* translate: convert all C# SDK comments from English to Chinese
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* translate: convert all Python SDK comments from English to Chinese
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* translate: convert all Python SDK comments from English to Chinese (partial)
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/097602f2-f319-49ea-84a2-3c8a30aa0915
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Add interactive ClientConsole example to Python, C# and C SDKs (#43)
* Add interactive ClientConsole example to Python, C# and C SDKs
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/ca3628f9-8283-448f-8789-d860c873c1dc
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* Validate port argument in Python and C# ClientConsole examples
Agent-Logs-Url: https://github.com/NEVSTOP-LAB/CSM-TCP-Router-App/sessions/1a565ac6-daf6-4291-8c0c-b3444c37d8ba
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <8196752+nevstop@users.noreply.github.com>
* update deps
* 重命名example
* backup code
* mass compile to trigger build
---------
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: nevstop <nevstop@NEVSTOP-LAB>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

添加 C# 的外部接口

3 participants

@nevstop