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
2 changes: 2 additions & 0 deletions .github/workflows/Build_VIPM_Library.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ on:
- '**.json'
- '**.yml'
- 'c/**'
- 'csharp/**'

push:
paths-ignore:
Expand All @@ -29,6 +30,7 @@ on:
- '**.json'
- '**.yml'
- 'c/**'
- 'csharp/**'

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/Check_Broken_VIs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ on:
- '**.json'
- '**.yml'
- 'c/**'
- 'csharp/**'

pull_request:
branches:
Expand All @@ -31,6 +32,7 @@ on:
- '**.json'
- '**.yml'
- 'c/**'
- 'csharp/**'

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
Expand Down
13 changes: 12 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,19 @@ c/**/*.ilk
c/**/*.idb
c/**/*.tlog

# C# / .NET / Visual Studio build artefacts (under csharp/)
csharp/**/bin/
csharp/**/obj/
csharp/**/Debug/
csharp/**/Release/
csharp/**/x64/
csharp/**/x86/
csharp/**/.vs/
csharp/**/*.user
csharp/**/*.suo

# Python build artefacts (under python/)
python/**/__pycache__/
python/**/*.pyc
python/**/*.pyo
python/**/.pytest_cache/
python/**/.pytest_cache/
99 changes: 99 additions & 0 deletions csharp/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# CSM MassData Parameter Support —— C# 移植

本目录提供 CSM MassData Parameter Support 插件的 C# 实现,
接口与 [`addons/MassData-Parameter`](../addons/MassData-Parameter)
中的 LabVIEW VI 以及 [`c/`](../c) 目录下的 C 移植版本保持等价语义,
可与 LabVIEW / C 端无缝互通同一份 MassData 参数字符串。

## 目录结构

```
csharp/
├── src/CsmMassData/ # .NET 类库(API 实现)
│ ├── CsmMassData.cs # 公开 API(中文 XML 文档注释)
│ ├── CsmMassDataException.cs # 错误异常类
│ ├── CsmMassDataOperation.cs # 读 / 写操作描述结构体
│ ├── CsmMassDataStatus.cs # 与 C / LabVIEW 端对齐的状态码枚举
│ └── CsmMassData.csproj # 类库工程
├── _test/
│ └── vs/
│ ├── CsmMassData.Tests.sln # Visual Studio 2026 解决方案
│ └── CsmMassData.Tests/ # MSTest 测试工程
│ ├── CsmMassDataTests.cs # 端到端断言
│ ├── MSTestSettings.cs # 全局禁用并行执行
│ └── CsmMassData.Tests.csproj
└── README.md # 本文件
```

## 接口对应关系

每个 C# 静态方法都是对应 LabVIEW VI 与 C 函数的逐字翻译:
名称相同、参数顺序一致、语义完全等价。

| LabVIEW VI | C# 方法 (`Csm.MassData.CsmMassData`) |
| --------------------------------------------------- | --------------------------------------------------------- |
| `CSM - Config MassData Parameter Cache Size.vi` | `ConfigMassDataParameterCacheSize` |
| `CSM - Convert MassData to Argument.vim` | `ConvertMassDataToArgument` |
| `CSM - Convert MassData to Argument With DataType.vim` | `ConvertMassDataToArgumentWithDataType` |
| `CSM - Convert Argument to MassData.vim` | `ConvertArgumentToMassData` |
| `CSM - MassData Data Type String.vi` | `MassDataDataTypeString` |
| `CSM - MassData Parameter Status.vi` | `MassDataParameterStatus` |

参考字符串格式与 LabVIEW / C 端完全一致:

```
<MassData>Start:<N>;Size:<N>[;DataType:<T>]
```

## 错误处理

所有方法都遵循 .NET 的惯用做法:成功时返回结果值,失败时抛出
`CsmMassDataException`。该异常通过 `Status` 属性暴露与 C 端
`csm_massdata_status_t` 数值一致的 `CsmMassDataStatus` 枚举,
方便在 C# / C / LabVIEW 三种语言之间共享错误码语义。

## 线程安全

所有公开 API 都是线程安全的:

- 静态字段的初始化由 CLR 保证“仅一次且对其它线程可见”。
- 后续访问通过 `lock` 串行化。
- 建议在进入多线程阶段前主动调用
`CsmMassData.ConfigMassDataParameterCacheSize(...)` 完成缓冲区配置,
以获得最佳性能。

## 构建与运行测试

### Visual Studio 2026(推荐)

1. 用 Visual Studio 2026 打开 `csharp/_test/vs/CsmMassData.Tests.sln`。
2. 在“测试资源管理器”中运行 `CsmMassData.Tests` 中的全部用例,
或直接按 <kbd>Ctrl+R</kbd>,<kbd>A</kbd> 运行所有测试。

### 命令行(任意 .NET 8 SDK)

```bash
cd csharp/_test/vs
dotnet test
```

## 在自己的工程中链接

```bash
dotnet add reference path/to/csharp/src/CsmMassData/CsmMassData.csproj
```

典型的编码 / 解码往返如下:

```csharp
using Csm.MassData;

byte[] samples = new byte[8 * 1024];

CsmMassData.ConfigMassDataParameterCacheSize(64 * 1024 * 1024); // 64 MiB 缓冲区
string arg = CsmMassData.ConvertMassDataToArgumentWithDataType(samples, "1D DBL");

// ... 通过 CSM 总线传递 arg ...

byte[] restored = CsmMassData.ConvertArgumentToMassData(arg);
```
48 changes: 48 additions & 0 deletions csharp/_test/vs/CsmMassData.Tests.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.0.0.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsmMassData", "..\..\src\CsmMassData\CsmMassData.csproj", "{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CsmMassData.Tests", "CsmMassData.Tests\CsmMassData.Tests.csproj", "{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|x64.ActiveCfg = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|x64.Build.0 = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|x86.ActiveCfg = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Debug|x86.Build.0 = Debug|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|Any CPU.Build.0 = Release|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|x64.ActiveCfg = Release|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|x64.Build.0 = Release|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|x86.ActiveCfg = Release|Any CPU
{FF61A168-BF0A-47DF-9FAD-47A0BCA87DC3}.Release|x86.Build.0 = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|x64.ActiveCfg = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|x64.Build.0 = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|x86.ActiveCfg = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Debug|x86.Build.0 = Debug|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|Any CPU.Build.0 = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|x64.ActiveCfg = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|x64.Build.0 = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|x86.ActiveCfg = Release|Any CPU
{D4B99627-DB4E-4C0F-B9F0-8EFD5B138468}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
22 changes: 22 additions & 0 deletions csharp/_test/vs/CsmMassData.Tests/CsmMassData.Tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MSTest" Version="4.0.2" />
</ItemGroup>

<ItemGroup>
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\src\CsmMassData\CsmMassData.csproj" />
</ItemGroup>

</Project>
Loading
Loading