VB Visual Basic 2026 中文教程
第 35 课 · 从开发电脑走向用户电脑

发布与部署应用

在 Visual Studio 中按 F5 能运行,并不代表程序已经准备好交给用户。发布(Publish)会把应用、依赖项和必要运行组件整理成可以部署的输出。本课将学习 Release、Folder Publish、Framework-dependent、Self-contained、win-x64 与 Single-file,并特别检查 appsettings.json、用户设置与 LocalDB 等外部依赖,最后建立一个真正可以复制到另一台 Windows 电脑测试的发布版本。

环境:Visual Studio 2026 · VB.NET · .NET 10目标:Windows x64实作:StudentDeploymentDemo2026

本课学习目标

  • 理解 Build、Publish 与 Deploy 的区别。
  • 理解 Debug 与 Release 的用途差异。
  • 在 Visual Studio 建立 Folder Publish Profile。
  • 认识 Framework-dependent deployment。
  • 认识 Self-contained deployment。
  • 理解 Runtime Identifier,例如 win-x64
  • 使用 Single-file 发布。
  • 知道发布输出目录在哪里。
  • 确认 appsettings.json 等内容文件一起发布。
  • 理解 Self-contained 不会自动包含 SQL Server LocalDB。
  • 建立部署前检查清单并在另一台电脑测试。

35.1 Build、Publish 与 Deploy

Build

编译

把源代码转换成程序集和可执行文件,主要用于开发与测试。

Publish

发布

准备可分发版本,并根据模式加入应用依赖或 .NET Runtime。

Deploy

部署

把发布结果交付、复制或安装到用户电脑或发布位置。

35.2 Debug 与 Release

Debug

主要用于开发、断点与调试。开发期间通常从 Visual Studio 运行。

Release

用于准备正式发布版本。发布操作通常使用 Release configuration。

在 Visual Studio 工具栏可以把:

Debug

切换成:

Release

35.3 建立 StudentDeploymentDemo2026

为了把重点放在部署,本课可以使用一个简化 Windows Forms 项目:

StudentDeploymentDemo2026

窗体显示:

应用名称
应用版本
运行目录
配置文件状态
.NET Runtime 信息
数据库依赖说明

35.4 在程序中显示运行信息

Form1.vb:

Imports System.Runtime.InteropServices

Public Class Form1

    Private Sub Form1_Load(
        sender As Object,
        e As EventArgs) Handles MyBase.Load

        lblAppName.Text =
            "Student Deployment Demo 2026"

        lblRuntime.Text =
            RuntimeInformation.FrameworkDescription

        lblArchitecture.Text =
            RuntimeInformation.ProcessArchitecture.ToString()

        lblFolder.Text =
            AppContext.BaseDirectory

    End Sub

End Class

发布后,这些信息可以帮助确认程序实际运行的位置和架构。

35.5 建立 Publish Profile

在 Solution Explorer:

右键项目
→ Publish

第一次发布时选择:

Folder

再选择输出位置,例如:

bin\Release\net10.0-windows\publish\
Visual Studio Publish Profile
Target:
Folder
Configuration:
Release
Deployment Mode:
Self-contained
Target Runtime:
win-x64
Produce Single File:
Optional
SavePublish
Publish succeeded — output folder ready for testing.

35.6 Framework-dependent 发布

Framework-dependent 模式发布:

应用程序
+ 应用依赖
- 不包含完整 .NET Runtime

目标电脑必须安装可供应用使用的相应 .NET Runtime。

优点

发布体积较小;运行环境可以使用已安装的 .NET Runtime 安全更新。

限制

目标电脑必须已经安装适当的 .NET Runtime。

35.7 Self-contained 发布

Self-contained 会把应用运行所需要的 .NET 文件一起发布。

应用程序
+ 应用依赖
+ .NET Runtime

因此目标电脑不需要预先安装对应 .NET Runtime。

Self-contained 不代表“所有外部软件都包含了” 它主要打包 .NET Runtime 和应用依赖。SQL Server LocalDB、打印机驱动、外部数据库服务器等独立软件仍需要单独考虑。

35.8 应该选哪一种?

Framework-dependent
适合可以控制目标环境,并确定已安装正确 .NET Runtime 的场景。
Self-contained
适合希望用户无需另外安装 .NET Runtime,接受较大发布体积的场景。

对本教程初次部署练习,可以优先体验:

Self-contained
Target Runtime = win-x64

35.9 什么是 Runtime Identifier?

RID 用来指定目标操作系统和架构。例如:

win-x64

表示:

Windows
64-bit x64

还有其他 RID,例如不同架构或操作系统,但 Windows Forms 应用本身是 Windows 桌面技术,因此本教程部署目标使用 Windows。

35.10 Single-file 发布

Visual Studio Publish → Show all settings 中可以启用:

Produce single file

这会把应用相关文件尽量捆绑成单个应用二进制,方便复制和分发。

普通 Publish Folder

目录里可能有 EXE、DLL、JSON 和其他依赖文件。

Single-file

主要应用依赖被捆绑,目录更简洁,但仍要检查外部内容文件和外部软件依赖。

35.11 Visual Studio 推荐练习设置

Configuration
Release
Target Framework
项目当前的 .NET 10 Windows 目标框架。
Deployment Mode
Self-contained
Target Runtime
win-x64
Produce single file
第一次可先关闭;确认普通发布成功后再尝试开启。

35.12 Publish 后会得到什么?

普通发布目录可能类似:

publish ├─ StudentDeploymentDemo2026.exe ├─ StudentDeploymentDemo2026.dll ├─ StudentDeploymentDemo2026.deps.json ├─ StudentDeploymentDemo2026.runtimeconfig.json ├─ appsettings.json └─ 其他依赖文件...

实际文件数量取决于发布模式和项目依赖。

35.13 不要只在 Visual Studio 里测试

发布成功后:

  1. 关闭 Visual Studio 中正在运行的程序。
  2. 打开 publish 文件夹。
  3. 双击应用的 EXE。
  4. 确认程序可以独立启动。
  5. 测试配置、文件、网络和数据库功能。
Publish succeeded 只是第一关 真正部署测试必须从发布目录运行,并最终在没有开发工具的目标电脑测试。

35.14 appsettings.json 是否一起发布?

Lesson 34 已经设置:

<None Update="appsettings.json">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

为了明确发布行为,也可以配置:

<None Update="appsettings.json">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</None>

发布后要实际检查:

publish\appsettings.json

35.15 user-settings.json 不需要跟着发布

Lesson 34 的用户偏好位于:

LocalApplicationData
\VBTutor
\StudentSettingsManager2026
\user-settings.json

这是运行后为每个用户建立的资料,不应该把开发电脑自己的 user-settings.json 当成应用文件复制给所有用户。

35.16 LocalDB 是独立部署依赖

前面的数据库课程使用:

(localdb)\MSSQLLocalDB

开发电脑通常因为 Visual Studio 的数据工作负载而已经拥有 LocalDB,但普通用户电脑不一定有。

Self-contained .NET ≠ Self-contained database 即使你的 EXE 已经包含 .NET Runtime,目标电脑如果没有 SQL Server Express LocalDB,连接 (localdb)\MSSQLLocalDB 仍会失败。

35.17 数据库应用怎样正式部署?

教学 / 本机

安装 LocalDB

目标机器另外安装 SQL Server Express LocalDB,并准备数据库。

局域网 / 企业

连接 SQL Server

应用连接由管理员维护的 SQL Server 实例。

现代架构

通过 Web API

客户端不直接连接远程数据库,而是通过 HTTPS API 访问服务端。

本教程当前 LocalDB 项目适合继续学习桌面数据库基础;真正商业部署前,应根据用户数量、安全、备份与网络结构重新选择数据库部署方案。

35.18 数据库结构也需要部署

只复制 EXE 并不会自动在目标 SQL Server 中建立:

StudentManagementDB
dbo.Students

因此数据库部署还可能需要:

CREATE DATABASE
CREATE TABLE
ALTER TABLE
初始基础数据

正式项目通常会使用数据库脚本或迁移机制管理数据库版本。

35.19 发布前检查 Connection String

开发连接字符串:

Server=(localdb)\MSSQLLocalDB;
Database=StudentManagementDB;
Integrated Security=True;

如果正式环境改用服务器数据库,连接字符串也必须改为目标环境对应设置。

不要把生产数据库密码硬编码到发布程序 密码、API Key 和 Token 应通过安全部署配置或密钥管理方式提供。

35.20 实作:Student Deployment Demo 2026

Form1 建议控件:

lblAppName
应用名称。
lblVersion
应用版本。
lblRuntime
.NET Runtime 描述。
lblArchitecture
当前进程架构。
lblFolder
应用实际运行目录。
lblConfigStatus
appsettings.json 是否存在。
btnOpenFolder
打开运行目录。

35.21 检查配置文件是否存在

Imports System.IO

Private Sub CheckConfiguration()

    Dim configPath As String =
        Path.Combine(
            AppContext.BaseDirectory,
            "appsettings.json")

    If File.Exists(
        configPath) Then

        lblConfigStatus.Text =
            "appsettings.json:已找到"

    Else

        lblConfigStatus.Text =
            "appsettings.json:未找到"

    End If

End Sub

35.22 显示应用版本

Dim version =
    Reflection.Assembly.
        GetExecutingAssembly().
        GetName().
        Version

lblVersion.Text =
    $"Version: {version}"

这有助于用户和技术支持人员确认正在运行哪一个版本。

35.23 完整发布流程

Rebuild Release确认无错误
Publish ProfileFolder
Publish生成文件
Local Test从 publish 运行
Target PC部署验证

35.24 为什么发布前要 Rebuild?

发布前建议:

Build
→ Rebuild Solution

并确认:

0 Errors

这样可以避免把仍然无法完整构建的项目直接交给用户。

35.25 最重要的测试:另一台电脑

开发电脑通常已经装有:

Visual Studio
.NET SDK
LocalDB
开发工具
NuGet 缓存
各种运行组件

因此只在开发电脑测试,很容易误以为部署已经完整。

程序能否启动?

双击 EXE 是否正常打开。

配置是否存在?

appsettings.json 是否能正确读取。

文件权限是否正常?

用户设置是否能写进 LocalApplicationData。

数据库是否可用?

目标电脑是否具备需要的数据库运行环境。

网络是否可用?

Web API 是否被防火墙、代理或网络限制阻挡。

架构是否正确?

例如 win-x64 是否符合目标电脑。

35.26 再尝试 Single-file

普通 Self-contained Folder 发布成功后,再打开 Publish Profile:

Show all settings
→ Produce single file
→ Save
→ Publish

比较两次发布目录的文件数量和 EXE 大小。

35.27 ClickOnce 简介

Folder Publish 适合先理解部署文件本身。如果希望提供较完整的 Windows 安装与更新体验,还可以研究 ClickOnce。

现代 .NET Windows 应用在 Visual Studio 中使用 Publish 工具建立 ClickOnce 发布配置。

本课不展开完整 ClickOnce 设置 先掌握 Folder Publish、Framework-dependent、Self-contained 与部署依赖,再学习安装和自动更新机制会更容易。

35.28 dotnet publish 简介

除了 Visual Studio,也可以从命令行发布。

Framework-dependent:

dotnet publish -c Release

Windows x64 Self-contained:

dotnet publish -c Release -r win-x64 --self-contained true

Single-file:

dotnet publish -c Release -r win-x64 \
  --self-contained true \
  -p:PublishSingleFile=true

Windows PowerShell 或命令提示符输入时,可以放在一行。

35.29 发布前最终检查清单

Release Build

Rebuild 成功,无编译错误。

Publish Mode

明确选择 Framework-dependent 或 Self-contained。

Target Runtime

确认 win-x64 或其他目标架构。

Config Files

检查 appsettings.json 等必要文件。

Secrets

发布目录和源码中没有真实秘密凭证。

Database

确认 LocalDB / SQL Server / API 的实际部署方式。

User Data

可写数据放在用户目录,不写死安装目录。

Clean PC Test

在没有 Visual Studio 的目标环境验证。

35.30 初学者常见错误

错误 1

直接把 bin\Debug 复制给用户

应该使用 Publish 生成明确的发布输出。

错误 2

以为 Self-contained 包含 LocalDB

Self-contained 解决 .NET Runtime 依赖,不会自动安装 SQL Server LocalDB。

错误 3

只在开发电脑测试

开发电脑依赖齐全,无法代表普通用户环境。

错误 4

配置和数据库仍指向开发环境

发布前必须检查 API URL、连接字符串和环境依赖。

35.31 小练习

  1. 建立 Framework-dependent Folder Publish,记录发布目录大小。
  2. 再建立 Self-contained win-x64 Publish,比较大小。
  3. 开启 Produce single file,再比较文件数量。
  4. 从 publish 目录直接运行,而不是按 F5。
  5. 确认 appsettings.json 出现在发布目录。
  6. 在没有 Visual Studio 的电脑测试 Self-contained 版本。
  7. 列出 StudentManagementDB 项目真正部署时还需要处理的数据库依赖。

本课复习

  1. Build、Publish 与 Deploy 有什么区别?
  2. Release 与 Debug 的主要用途有什么不同?
  3. Framework-dependent 发布需要目标电脑具备什么?
  4. Self-contained 发布包含什么?
  5. win-x64 表示什么?
  6. Single-file 发布有什么优点与限制?
  7. 为什么必须检查 appsettings.json 是否进入 publish 目录?
  8. 为什么 user-settings.json 不应该从开发电脑一起发布?
  9. 为什么 Self-contained 应用仍可能无法连接 LocalDB?
  10. 为什么最终必须在没有开发环境的目标电脑测试?
技术参考: 本课发布方式依据 Microsoft Learn 当前 .NET 与 Visual Studio 文档整理。 .NET application publishing overview · ClickOnce for .NET on Windows · SQL Server Express LocalDB