diff --git a/Windows/CS/Framework4.0/CubeLib/CubeLib.ico b/Windows/CS/Framework4.0/CubeLib/CubeLib.ico
new file mode 100644
index 0000000..e90ab1c
Binary files /dev/null and b/Windows/CS/Framework4.0/CubeLib/CubeLib.ico differ
diff --git a/Windows/CS/Framework4.0/CubeLib/CubeLib.sln b/Windows/CS/Framework4.0/CubeLib/CubeLib.sln
new file mode 100644
index 0000000..71143c6
--- /dev/null
+++ b/Windows/CS/Framework4.0/CubeLib/CubeLib.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.36617.4
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CubeLib", "CubeLib\CubeLib.csproj", "{0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {7019BD3D-89E7-4B0D-85B6-9E26BD8EF151}
+ EndGlobalSection
+EndGlobal
diff --git a/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.csproj b/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.csproj
new file mode 100644
index 0000000..8fc13fa
--- /dev/null
+++ b/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.csproj
@@ -0,0 +1,71 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {0AAA20B8-F8B1-4C09-ADBF-E6FD650EE9D4}
+ Library
+ Properties
+ JoyD.Windows.CS
+ JoyD.Windows.CS.CubeLib
+ v4.0
+ 512
+ true
+
+
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ bin\Debug\JoyD.Windows.CS.CubeLib.xml
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\packages\WebSocketSharp-netstandard.1.0.1\lib\net35\websocket-sharp.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.ico b/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.ico
new file mode 100644
index 0000000..e90ab1c
Binary files /dev/null and b/Windows/CS/Framework4.0/CubeLib/CubeLib/CubeLib.ico differ
diff --git a/Windows/CS/Framework4.0/CubeLib/CubeLib/Properties/AssemblyInfo.cs b/Windows/CS/Framework4.0/CubeLib/CubeLib/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..f419692
--- /dev/null
+++ b/Windows/CS/Framework4.0/CubeLib/CubeLib/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("Net40通用控件库")]
+[assembly: AssemblyDescription("包含WebSocket等控件")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("JoyD")]
+[assembly: AssemblyProduct("com.joyd.CubeLib")]
+[assembly: AssemblyCopyright("Copyright © 2025 JoyD")]
+[assembly: AssemblyTrademark("JoyD")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("0aaa20b8-f8b1-4c09-adbf-e6fd650ee9d4")]
+
+// 程序集的版本信息由下列四个值组成:
+//
+// 主版本
+// 次版本
+// 生成号
+// 修订号
+//
+// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.1.0")]
+[assembly: AssemblyFileVersion("1.0.1.0")]
diff --git a/Windows/CS/Framework4.0/CubeLib/publish-nuget.ps1 b/Windows/CS/Framework4.0/CubeLib/publish-nuget.ps1
new file mode 100644
index 0000000..990879f
--- /dev/null
+++ b/Windows/CS/Framework4.0/CubeLib/publish-nuget.ps1
@@ -0,0 +1,374 @@
+# 托普瑞控制库发布脚本 请在 chcp 65001下运行
+
+# 配置参数 - 基本设置
+$scriptDir = Get-Location
+$output = Join-Path $scriptDir "Output"
+$server = "http://47.111.181.23:8081/repository/nuget-releases/"
+$key = "admin:admin"
+$actualDllName = "JoyD.Windows.CS.Utils.dll"
+$targetDllName = "JoyD.Windows.CS.Utils.dll" # 保持与AssemblyName一致,避免引用问题
+
+# NuGet包元数据配置 - 在此处修改所有元数据
+$packageId = "com.joyd.utils"
+
+# 从AssemblyInfo.cs的AssemblyFileVersion获取版本号
+$assemblyInfoPath = Join-Path $scriptDir "Utils\Properties\AssemblyInfo.cs"
+if (Test-Path $assemblyInfoPath) {
+ $assemblyInfoContent = Get-Content -Path $assemblyInfoPath -Encoding UTF8 -Raw
+
+ # 只从AssemblyFileVersion获取版本号
+ $fileVersionMatch = [regex]::Match($assemblyInfoContent, '(?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"@
+
+# 设置配置文件
+Set-Content -Path $localNugetConfigPath -Value $nugetConfigContent
+Write-Host "已在Output目录设置NuGet.Config: $localNugetConfigPath"
+
+# 创建一个简单的.csproj文件用于打包,无需还原
+$tempProjContent = @"
+
+
+ net40
+ $packageId
+ $version
+ $title
+ $authors
+ $owners
+ $description
+ $copyright
+ $tagsString
+ $projectUrl
+ $licenseUrl
+ $iconFileName
+
+ $releaseNotes
+ .
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+"@
+
+$tempProjPath = "$output\Temp.csproj"
+Set-Content -Path $tempProjPath -Value $tempProjContent
+
+# 在输出目录中创建包结构
+Write-Host "3. 创建NuGet包.."
+
+# 在输出目录中创建完整的nuspec文件
+$nuspecPath = Join-Path $output "$packageId.nuspec"
+
+# 将tags数组转换为空格分隔的字符串
+$tagsString = $tags -join " "
+
+$nuspecContent = @"
+
+
+
+ $packageId
+ $version
+ $title
+ $authors
+ $owners
+ false
+ $description
+ $releaseNotes
+ $copyright
+ $tagsString
+ $projectUrl
+ $licenseUrl
+ $iconFileName
+ $iconUrl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+"@
+
+Set-Content -Path $nuspecPath -Value $nuspecContent -Encoding UTF8
+Write-Host "已创建nuspec文件: $nuspecPath"
+
+# 手动创建nupkg包结构
+Write-Host "创建包结构.."
+$tempDir = Join-Path $output "temp_pkg"
+
+# 确保临时目录存在
+if (!(Test-Path $tempDir)) {
+ New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
+}
+
+# 创建lib/net40子目录
+$libDir = Join-Path $tempDir "lib\net40"
+if (!(Test-Path $libDir)) {
+ New-Item -ItemType Directory -Path $libDir -Force | Out-Null
+}
+
+# 复制DLL到包结构中
+$sourceDllPath = Join-Path $output $targetDllName
+$destDllPath = Join-Path $libDir $targetDllName
+Copy-Item -Path $sourceDllPath -Destination $destDllPath -Force
+Write-Host "已复制$sourceDllPath 到$destDllPath"
+
+# 复制pdb文件到包结构中
+$targetPdbName = [System.IO.Path]::ChangeExtension($targetDllName, ".pdb")
+$sourcePdbPath = Join-Path $output $targetPdbName
+$destPdbPath = Join-Path $libDir $targetPdbName
+if (Test-Path $sourcePdbPath) {
+ Copy-Item -Path $sourcePdbPath -Destination $destPdbPath -Force
+ Write-Host "已复制$sourcePdbPath 到$destPdbPath"
+}
+
+# 复制xml文件到包结构中
+$targetXmlName = [System.IO.Path]::ChangeExtension($targetDllName, ".xml")
+$sourceXmlPath = Join-Path $output $targetXmlName
+$destXmlPath = Join-Path $libDir $targetXmlName
+if (Test-Path $sourceXmlPath) {
+ Copy-Item -Path $sourceXmlPath -Destination $destXmlPath -Force
+ Write-Host "已复制$sourceXmlPath 到$destXmlPath"
+}
+
+# 复制图标文件到包结构根目录
+$sourceIconPath = Join-Path $output $iconFileName
+$destIconPath = Join-Path $tempDir $iconFileName
+if (Test-Path $sourceIconPath) {
+ Copy-Item -Path $sourceIconPath -Destination $destIconPath -Force
+ Write-Host "已复制图标文件到包结构: $destIconPath"
+} else {
+ Write-Host "警告: 在输出目录中找不到图标文件 $sourceIconPath" -ForegroundColor Yellow
+}
+
+# 创建[Content_Types].xml文件(有效nupkg必需)
+$contentTypesPath = Join-Path $tempDir "[Content_Types].xml"
+# 使用-LiteralPath参数避免方括号被解释为通配符
+Set-Content -LiteralPath $contentTypesPath -Value ""
+Write-Host "已在 $contentTypesPath 创建[Content_Types].xml"
+
+# 复制nuspec文件到包结构根目录
+$sourceNuspecPath = Join-Path $output "$packageId.nuspec"
+$destNuspecPath = Join-Path $tempDir "$packageId.nuspec"
+if (Test-Path $sourceNuspecPath) {
+ Copy-Item -Path $sourceNuspecPath -Destination $destNuspecPath -Force
+ Write-Host "已复制nuspec文件到包结构: $destNuspecPath"
+} else {
+ Write-Host "警告: 找不到nuspec文件 $sourceNuspecPath" -ForegroundColor Yellow
+}
+
+# 创建zip文件并将其重命名为nupkg
+$zipPath = Join-Path $output "temp_manual.zip"
+
+# 清理任何现有文件
+if (Test-Path $zipPath) {
+ Remove-Item -Path $zipPath -Force
+ Write-Host "已移除现有的zip文件"
+}
+if (Test-Path $nupkgFilePath) {
+ Remove-Item -Path $nupkgFilePath -Force
+ Write-Host "已移除现有的nupkg文件"
+}
+
+Write-Host "从$tempDir\* 创建zip归档到$zipPath..."
+Compress-Archive -Path "$tempDir\*" -DestinationPath $zipPath -Force
+
+if (Test-Path $zipPath) {
+ Write-Host "正在将$zipPath 重命名为 $nupkgFilePath..."
+ Rename-Item -Path $zipPath -NewName $nupkgFileName -Force
+
+ if (Test-Path $nupkgFilePath) {
+ $nupkgFile = Get-Item $nupkgFilePath
+ Write-Host "✅ 成功创建包: $($nupkgFile.FullName)"
+ Write-Host "包大小: $([math]::Round($nupkgFile.Length / 1KB, 2)) KB"
+ }
+}
+
+# 清理临时文件夹
+Remove-Item -Path $tempDir -Recurse -Force
+Write-Host "已清理临时文件夹"
+
+# 检查包文件是否存在
+if (Test-Path $nupkgFilePath) {
+ $nupkgFile = Get-Item $nupkgFilePath
+ Write-Host "找到包文件: $($nupkgFile.FullName)"
+ Write-Host "4. 正在发布包到仓库..."
+
+ # 使用curl直接发布到HTTP仓库
+ Write-Host "使用curl直接发布到HTTP仓库..."
+
+ # 构建curl命令
+ $curlCommand = "curl.exe -X PUT -u $key -F package=@$nupkgFilePath $server"
+ Write-Host "正在执行: $curlCommand"
+
+ # 执行curl命令(使用curl.exe避免PowerShell别名冲突)
+ & curl.exe -X PUT -u $key -F package=@$nupkgFilePath $server
+
+ if ($LASTEXITCODE -eq 0) {
+ Write-Host "✅ 成功: 包发布成功" -ForegroundColor Green
+ Write-Host "包ID: $packageId"
+ Write-Host "版本: $version"
+ Write-Host "标题: $title"
+ Write-Host "作者: $authors"
+ Write-Host "所有者: $owners"
+ Write-Host "描述: $description"
+ Write-Host "标签: $tagsString"
+ Write-Host "仓库: $server"
+ } else {
+ Write-Host "❌ 错误: 包创建成功但发布失败" -ForegroundColor Red
+ Write-Host "包文件位置: $($nupkgFile.FullName)"
+ Write-Host "
+您可以尝试手动发布(使用curl命令):"
+ Write-Host "curl -X PUT -u admin:admin -F \"package=@$($nupkgFile.FullName)\" $server"
+ Write-Host "
+或者直接在项目中使用创建的包文件"
+ }
+} else {
+ Write-Host "❌ 错误: 未创建NuGet包" -ForegroundColor Red
+ Write-Host "请检查dotnet CLI是否正确配置"
+ Write-Host "您可以尝试使用Output目录中的文件手动创建包"
+}
+
+# 最终清理
+Write-Host "正在执行最终清理.."
+if (Test-Path "$output\Temp.csproj") {
+ Remove-Item -Path "$output\Temp.csproj" -Force
+ Write-Host "已移除Temp.csproj"
+}
+
+# 删除我们在Output目录创建的NuGet.Config文件
+if (Test-Path $localNugetConfigPath) {
+ Remove-Item -Path $localNugetConfigPath -Force
+ Write-Host "已删除临时创建的NuGet.Config"
+}
+
+Write-Host "发布过程完成"
\ No newline at end of file