)
桌面应用【免费下载链接】SoundSwitchC# application to switch default playing device. Download: https://soundswitch.aaflalo.me/项目地址https://gitcode.com/gh_mirrors/so/SoundSwitch点击查看免费下载本篇指南以 docs/building.md 为骨架结合仓库内的 PowerShell 工具链tools/Publish-Release.ps1、tools/Build-Installer.ps1、tools/Install-BuildTools.ps1、tools/Sign-Binary.ps1与 CI/CD 工作流系统讲解 SoundSwitch 从源码编译、自包含发布、Inno Setup 打包签名到 GitHub Releases 发布的完整链路。读者读完可掌握本地命令行构建、x64/ARM64 双架构安装包生成、SHA-256 代码签名以及稳定版/测试版发布流程的每一步实操细节。前置条件与一次性环境准备SoundSwitch 是 Windows 专用应用所有构建与发布脚本都围绕 Windows 生态设计。构建前需要准备以下环境依赖版本要求说明操作系统Windows 10/11x64 或 ARM64项目依赖 Core Audio API、WinForms、WinAPI 钩子等 Windows 专用 API不支持跨平台构建.NET SDK10.0具体版本见 global.json目标框架在 SoundSwitch/SoundSwitch.csproj 中定义为net10.0-windows10.0.17763.0SDK 版本由 global.json 固定为10.0.401并开启rollForward: latestMajor与allowPrereleasePowerShell7Windows 11 自带所有构建、签名、发布脚本均要求 PowerShell 7 或更高版本不兼容 Windows PowerShell 5.1Git任意近期版本源码版本控制GitHub CLIgh由安装脚本自动安装仅发布工作流需要下载草稿发布产物、上传安装包、发布 Release一键安装全部构建工具在新机器上运行一次 tools/Install-BuildTools.ps1 即可准备全部环境.\tools\Install-BuildTools.ps1该脚本内部通过winget依次安装GitHub CLIGitHub.cli、Inno Setup 6JRSoftware.InnoSetup、Certum SimplySign DesktopCertum.SmartSignSimplySignDesktop用于代码签名的云证书提供程序、Python 3.14Python.Python.3.14以及.NET SDK版本号从项目的 TargetFramework 自动解析对应Microsoft.DotNet.SDK.10。此外还会安装 Python 的markdown包用于后续将 Markdown 文档转换为 HTML。脚本的签名工具定位采用四级回退策略见 tools/Install-BuildTools.ps1 中的Install-SignTool函数检查 PATH 中是否已有signtool.exe搜索 Windows Kits 目录C:\Program Files (x86)\Windows Kits\10\bin中已安装的 SDK 自带版本从 Delphier/SignTool 仓库下载独立版signtool.exe并做冒烟测试最后兜底通过 winget 安装完整 Windows SDK。signtool.exe会被写入用户 PATH供后续签名脚本使用。若只想以用户级作用域安装部分包无需管理员权限可加参数-Scope user.\tools\Install-BuildTools.ps1 -Scope user注意安装脚本基于Get-DotNetSdkVersion从 csproj 解析目标框架主版本号来安装对应 SDK如果解析失败会跳过 SDK 安装并给出警告。非 Windows 宿主构建选项仓库的 Directory.Build.props 提供了一个 Linux 宿主下的可选构建开关传入-p:LinuxBuildtrue时启用EnableWindowsTargeting并跳过仅在 Windows PowerShell 下执行的本地化资源补丁目标该目标见 SoundSwitch/SoundSwitch.csproj 的PatchLocalizedResourceDesigners。但需注意这只是让 .NET 在 Linux 上编译 Windows 目标框架的手段最终产物仍是 Windows 专用程序且完整打包签名流程必须在 Windows 上完成。快速构建从 Visual Studio 构建用 Visual Studio 2022 打开解决方案 SoundSwitch.sln选择配置Debug/Release与平台AnyCPU执行Build → Build Solution完成编译。从 SoundSwitch/SoundSwitch.csproj 可以看到项目实际上定义了四种配置Debug;Release;Beta;Nightly。其中Debug为控制台输出型 EXEOutputTypeexeRelease、Beta、Nightly均为窗口型 EXEOutputTypeWinExe且通过DefineConstants注入RELEASE、BETA、NIGHTLY条件编译符号——这解释了后续发布流程中-Configuration参数为什么允许取Release、Debug、Nightly三种值。命令行构建全部项目不依赖 IDE 的最小构建命令dotnet build SoundSwitch.sln -c Debug按项目构建仓库由多个独立项目组成各项目均可单独编译详见后文“项目级构建命令”一节。完整发布工作流Publish-Release.ps1构建发布链路由 tools/ 目录 下的 PowerShell 脚本编排原先的 Make.bat 批处理脚本已被这套工具链取代Make.bat仍保留在仓库中其逻辑为逐架构dotnet publish --self-contained后调用Installer/Make-Installer.bat编译安装包可作为参考但不建议新流程使用。推荐用法本地构建 生成安装包不发布.\tools\Publish-Release.ps1 -BuildFromSource -Configuration ReleasePublish-Release.ps1是完整发布流程的总编排器参数定义见 tools/Publish-Release.ps1脚本执行步骤如下填充Final\目录-BuildFromSource模式下先清理bin、obj、Release、Final等目录然后对每个架构执行dotnet publish -c Config -r RID --self-contained true发布SoundSwitch.CLI与SoundSwitch两个项目将产物合并进Final\rid\。自包含发布会把 .NET Desktop Runtime 打进载荷因此安装后的应用不依赖机器级运行时生成 HTML 文档通过 tools/markdown_to_html.py 将 CHANGELOG.md、README.md、Terms.md、README.de.md 分别转换为Changelog.html、Readme.html、Terms.html、Readme.de.html打包附加资源将 CLI 说明SoundSwitch.CLI/README.md、LICENSE.txt、Terms.txt 等复制进Final\委托安装包编译调用 tools/Build-Installer.ps1 对每个选中的架构编译并签名 Inno Setup 安装包上传与发布仅在非-BuildFromSource模式下执行——将签名后的安装包上传到草稿 Release、从CHANGELOG.md提取最新条目作为发布说明、经人工确认后正式发布。关键参数说明参数默认值说明-Channelrelease发布渠道release查找非预发布草稿或beta查找预发布草稿仅在下载草稿发布时使用-RepositoryBelphemur/SoundSwitchGitHub 仓库owner/repo 格式-BuildFromSource关从源码构建而非下载草稿发布产物启用后不再要求gh登录且跳过上传/发布步骤-ConfigurationRelease源码构建时的配置Release/Debug/Nightly下载草稿时忽略-SkipSigning关即使有signtool也跳过代码签名-CertificateNameOpen Source Developer Antoine Aflalo代码签名证书的主题名CN透传给Build-Installer.ps1/Sign-Binary.ps1-InstallerReleaseState按渠道推导传给 Inno Setup 的发布状态标签-Channel beta自动推导为Beta否则为Release可显式覆盖-Architectureswin-x64,win-arm64要发布并打包的架构接受逗号分隔字符串或数组每选一个架构编译一个对应的安装包架构选择与命名默认同时发布win-x64与win-arm64两个架构可通过以下方式只构建 x64夜间流水线即只发布 x64 安装包.\tools\Publish-Release.ps1 -BuildFromSource -Architectures win-x64x64 安装包保留传统的不带后缀文件名arm64 安装包命名为*_Installer_arm64.exe。该命名逻辑在 Installer/scripts/app_defines.iss 中按#if TargetArch x64/#elif TargetArch arm64分支实现且 Installer/setup.iss 强制要求必须通过/DTargetArchx64|arm64传入架构参数否则编译直接报错。仅构建安装包Build-Installer.ps1如果已经拥有一个填充好的Final\目录包含二进制、HTML 文档与资源可以单独运行安装包编译脚本# 跳过签名本地测试用 .\tools\Build-Installer.ps1 -FinalDir .\Final -SkipSigning # 正常签名构建 .\tools\Build-Installer.ps1 -FinalDir .\Final该脚本专注于安装包编译与签名职责边界见 tools/Build-Installer.ps1不负责源码构建、文档生成或 GitHub 交互按以下顺序工作校验Final\目录目录必须存在且非空更重要的是-FinalDir必须是仓库根目录的规范Final\目录tools/Build-Installer.ps1 会做强制校验并拒绝其他路径——因为setup.iss通过硬编码相对路径..\Final\引用载荷非规范路径会导致签名与打包的不是同一批文件签名应用二进制找到Final\下所有*SoundSwitch*.exe/*SoundSwitch*.dll排除Installer\子目录调用 tools/Sign-Binary.ps1 签名定位 Inno Setup从注册表HKLM:\SOFTWARE\...\Uninstall\Inno Setup 6_is1及其 WOW6432Node 项读取ISCC.exe路径PATH 兜底逐架构编译对每个架构执行一次ISCC.exe setup.iss /DReleaseStateState /DTargetArcharch清理旧安装包后将产物从Final\根移动到Final\Installer\签名安装包对生成的安装包再次调用Sign-Binary.ps1。脚本参数-FinalDir默认.\Final、-SkipSigning、-CertificateName默认OpenSource Developer, Antoine Aflalo、-InstallerReleaseState默认Release、-Architectures默认双架构。代码签名细节Sign-Binary.ps1tools/Sign-Binary.ps1 封装signtool.exe采用现代算法而非已弃用的 SHA-1# 签名单个可执行文件默认证书 .\tools\Sign-Binary.ps1 -Path Final\SoundSwitch.exe # 一次签名多个文件 .\tools\Sign-Binary.ps1 -Path Final\SoundSwitch.exe, Final\SoundSwitch.CLI.exe # 自定义证书与时间戳服务器 .\tools\Sign-Binary.ps1 -Path Final\Installer\SoundSwitch_Installer.exe -CertificateName My Cert -TimestampUrl http://timestamp.digicert.com其底层调用参数见 tools/Sign-Binary.ps1signtool 参数值含义/n证书主题名CN按主题名定位代码签名证书/fdsha256文件摘要算法 SHA-256/tr默认http://timestamp.digicert.comRFC 3161 时间戳服务器/tdsha512时间戳摘要算法 SHA-512脚本还内置失败重试单文件默认最多尝试-MaxRetries默认 3次每次间隔-RetryDelaySec默认 5秒用于应对时间戳服务器暂时不可用等瞬时故障。发布到 GitHub Releases稳定版 / 测试版发布完整带 GitHub 集成的发布工作流# 稳定版查找非预发布草稿 .\tools\Publish-Release.ps1 -Channel release # 测试版查找预发布草稿 .\tools\Publish-Release.ps1 -Channel beta该模式要求机器上已安装并登录 GitHub CLIgh auth login。脚本会用gh release list找到由 semantic-release 创建的对应渠道草稿 Release下载其中的SoundSwitch-v*.zip构建产物并解压到Final\此时跳过文档生成与资源打包因为 CI 已将这些内容包含在 zip 中委托Build-Installer.ps1完成签名、Inno Setup 编译与安装包签名将签名后的安装包上传到草稿 Release对已存在的同名资产使用--clobber覆盖从 CHANGELOG.md 提取最新## [版本小节作为发布正文并可交互式追加额外说明最终展示发布信息并询问确认输入y后正式发布否则仅更新草稿可稍后用gh release edit tag --repo repo --draftfalse手动发布。依赖项PowerShell 7已认证的 GitHub CLIgh代码签名证书默认查找主题名为Open Source Developer Antoine Aflalo的 Certum SimplySign 证书。运行测试单个测试项目dotnet test SoundSwitch.Tests\SoundSwitch.Tests.csproj dotnet test SoundSwitch.Audio.Manager.Tests\SoundSwitch.Audio.Manager.Tests.csproj全解决方案测试dotnet test SoundSwitch.sln -c Debug仓库还包含SoundSwitch.IPC.Tests、SoundSwitch.Mp3Sharp.Tests等测试项目。CI 的.NET工作流.github/workflows/dotnet.yml会在 Windows runner 上同时执行Release与Nightly配置的构建并通过 tools/check_brackets.py 校验翻译资源文件.resx的括号配对是否完整。项目级构建命令以下各项目均可独立构建便于定向调试某个模块项目命令主应用dotnet build SoundSwitch\SoundSwitch.csproj音频管理库WASAPI 封装dotnet build SoundSwitch.Audio.Manager\SoundSwitch.Audio.Manager.csproj共享工具库dotnet build SoundSwitch.Common\SoundSwitch.Common.csproj命令行工具dotnet build SoundSwitch.CLI\SoundSwitch.CLI.csprojIPC 命名管道通信库dotnet build SoundSwitch.IPC\SoundSwitch.IPC.csproj快速菜单 UI 库dotnet build SoundSwitch.UI.Menu\SoundSwitch.UI.Menu.csproj用户控件库dotnet build SoundSwitch.UI.UserControls\SoundSwitch.UI.UserControls.csproj主应用通过项目引用SoundSwitch/SoundSwitch.csproj依赖SoundSwitch.Audio.Manager、SoundSwitch.Common、SoundSwitch.IPC、SoundSwitch.UI.Menu四个库因此发布时需先保证这些依赖项目编译成功。注意 SoundSwitch/SoundSwitch.csproj 中的PatchLocalizedResourceDesigners目标会在编译前调用 PowerShell 补丁脚本处理本地化资源。构建产物说明产物位置说明Debug 二进制各项目bin/Debug/含完整调试符号Release 产物仓库根目录Final\含自包含发布二进制、HTML 文档与资源按架构分子目录安装包Final\Installer\Inno Setup 编译并签名x64 为不带后缀文件名arm64 为*_Installer_arm64.exeCI/CD 流水线仓库使用 GitHub Actions 承担持续集成与部署工作流定义位于 .github/workflows/工作流触发时机说明.NETdotnet.yml推送/PR 到dev、master、beta构建、运行测试、校验翻译check_brackets.py、lint、semantic-release 干跑、文档站点构建并以merge-gate统一把关releaserelease.yml推送master、beta先经 tools/release-dry-run.js 与npx semantic-release计算版本并创建草稿再由reusable-build构建win-x64,win-arm64产物打包上传为SoundSwitch-v{version}.zip最后向 Sentry 上报发布事件nightly定时每日构建并发布预发布夜间版仅 x64test-installer-build推送/PR隔离验证安装包构建链路codeql-analysis定时/推送/PR运行 GitHub CodeQL 静态分析wingetRelease 发布向 Windows 包管理器winget提交新版本docs推送master构建并部署 VuePress 文档站点调试与日志Visual Studio 调试设置断点后按 F5 启动调试主应用入口在 SoundSwitch/Program.cscsproj 中通过StartupObject指定音频管理相关测试可直接在 Test Explorer 中运行。结构化日志SoundSwitch 使用Serilog记录结构化日志相关包引用见 SoundSwitch/SoundSwitch.csproj包括Serilog.Sinks.File、Serilog.Exceptions、Serilog.Formatting.Compact等Debug配置下额外启用控制台输出。日志写入应用数据目录并可通过设置界面的Troubleshooting选项卡导出便于排查设备切换、热键、更新等模块的问题。平台支持与限制平台架构状态Windowsx64主支持WindowsARM64支持7.0 及以后版本不支持跨平台构建SoundSwitch 依赖 Windows 专用 API——Core Audio APIWASAPI见 SoundSwitch.Audio.Manager、WinForms 与 WinAPI 钩子因此编译目标固定为net10.0-windows10.0.17763.0完整发布流程也必须在 Windows 上运行。赞分享桌面应用【免费下载链接】SoundSwitchC# application to switch default playing device. Download: https://soundswitch.aaflalo.me/项目地址https://gitcode.com/gh_mirrors/so/SoundSwitch点击查看免费下载相关推荐从0到1构建Lively安装包Inno Setup实战指南从0到1构建Lively安装包Inno Setup实战指南 你还在为开源项目打包流程繁琐而烦恼吗本文将以Lively Wallpaper项目为例详解如何使桌面应用音视频Podman macOS 安装包pkginstaller构建指南从无签名 pkg 到签名并公证的发布包Podman macOS 安装包pkginstaller构建指南从无签名 pkg 到签名并公证的发布包 本指南围绕 Podman 仓库中 macOS 安装容器运行时云原生CLICaptura 安装包构建全指南Inno Setup 配置解析与发布流水线实践Captura 安装包构建全指南Inno Setup 配置解析与发布流水线实践 Captura 使用 Inno Setup http://www.jrsoft桌面应用屏幕录制音视频上一篇LaserGRBL免费开源的激光雕刻软件终极指南下一篇Linux Wallpaper Engine完全指南打造炫酷动态桌面的终极教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考