从命令行生成 .NET ClickOnce 应用程序

在 Visual Studio 中,你可以从命令行生成项目,即使这些项目是在集成开发环境(IDE)中创建的。 事实上,可以在安装了 .NET 5 或更高版本的另一台计算机上重新生成使用 Visual Studio 创建的项目。 此功能允许使用自动化过程(例如,在中央生成实验室中或使用超出生成项目本身范围的高级脚本技术)重现生成。

注释

若要从命令行生成 .NET Framework ClickOnce 应用程序,请参阅 从命令行生成 ClickOnce 应用程序

使用 MSBuild 重现 .NET ClickOnce 应用程序部署

在命令行上调用 msbuild /target:publish 时,此命令指示 MSBuild 系统生成项目并在发布文件夹中创建 ClickOnce 应用程序。 此命令等效于在 IDE 中选择 “发布 ”命令。

此命令执行 msbuild.exe,该路径位于 Visual Studio 命令提示符环境中的路径上。

“target”是 MSBuild 有关如何处理命令的指示器。 关键目标是“生成”目标和“发布”目标。 生成目标等效于在 IDE 中选择生成命令(或按 F5)。 如果只想生成项目,可以输入 msbuild。 此命令有效,因为生成目标是 Visual Studio 生成的所有项目的默认目标。 因此,无需显式指定生成目标。 因此,输入 msbuild 与输入 msbuild /target:build作相同。

/target:publish 命令指示 MSBuild 调用发布目标。 发布目标取决于生成目标,这意味着发布作是生成作的超集。 例如,如果更改了 Visual Basic 或 C# 源文件,则发布作会自动重新生成相应的程序集。

完整了解如何使用 Mage.exe 命令行工具创建 ClickOnce 清单并生成 ClickOnce 部署的信息,请参阅 演练:手动部署 ClickOnce 应用程序

使用 MSBuild 创建和生成基本 ClickOnce 应用程序

创建发布配置文件的最简单方法是使用 Visual Studio。 发布时需要使用 MSBuild 发布配置文件。

创建和发布 ClickOnce 项目

  1. 打开 Visual Studio 并创建新项目。

    选择 Windows 窗体应用WPF 应用程序 项目模板并命名项目 CmdLineDemo,然后创建项目。

  2. 右键单击解决方案资源管理器中的项目,然后选择“ 发布”。

    此步骤确保项目被正确配置,以生成 ClickOnce 应用程序的部署。

    此时会显示“发布”页。

  3. 在“发布”页中,选择 “添加发布配置文件”,选择 “ClickOnce”,然后选择“ 完成”。

    在本练习中,可以忽略“发布”页上的其他配置设置。

  4. 该过程完成后,选择“ 关闭 ”退出“发布”页对话框。

  5. 选择发布

    Visual Studio 生成 ClickOnce 部署输出。

  6. 保存项目,并记下存储项目的文件夹位置。

    前面的步骤创建了一个首次发布的 ClickOnce 项目。 现在,您可以在 IDE 之外重现构建。

在命令行中重现构建

  1. 退出 Visual Studio。

  2. 在“Windows 开始 ”菜单中,选择 “工具>命令行>开发人员命令提示符”。

    此时会打开 Visual Studio 开发人员命令提示符。

  3. Visual Studio 命令提示符中,确保当前目录显示之前生成的项目的位置。

    如果不在项目目录中工作,请输入命令切换到所需位置,例如 chdir C:\Users\username\source\repos\CmdLineDemo

  4. 若要删除 上一节中生成的现有文件,请输入 rmdir /s publish

    此步骤是可选的,但它可确保命令行构建产生所有新文件。

    对于 .NET 5 及更高版本,从命令行生成 .NET ClickOnce 应用程序是类似的体验。 一个区别在于,需要在 MSBuild 命令行上为发布配置文件提供额外的属性。

  5. 输入 msbuild /target:publish /p:PublishProfile=<pubxml file> /p:PublishDir="<specific location>"

    前面的步骤会在名为 publish 的项目的子文件夹中生成完整的 ClickOnce 应用程序部署。 CmdLineDemo.application 是 ClickOnce 部署清单。 文件夹 CmdLineDemo_1.0.0.0 包含文件 CmdLineDemo.exeCmdLineDemo.exe.manifest,即 ClickOnce 应用程序清单。 Setup.exe 是引导程序,默认情况下配置为安装 .NET。 此文件夹中的文件包含需要通过 Web 或通过 UNC 或 CD/DVD 部署应用程序的整个文件集。

注释

MSBuild 系统使用 PublishDir 选项指定输出的位置,例如 msbuild /t:publish /p:PublishProfile=<pubxml file> /p:PublishDir="<specific location>"

发布进程输出

MSBuild 使用 PublishDir 属性设置生成输出位置,包括生成工件。 PublishDir 是 MSBuild 用来作为发布目标的值,默认从 .pubxml 文件(.NET)中的 PublishDir 属性获取。 还可以使用 /p 开关在 MSBuild 命令行中覆盖此行为。 如果覆盖该设置,则发布输出内容将转到指定的位置。 输出是在发布 MSBuild 步骤期间生成的。 创建此副本后运行 AfterTargets="ClickOncePublish" 的任何 MSBuild 目标。

PublishDir不同,PublishUrl属性不用于MSBuild步骤。 PublishUrl 从命令行直接调用 MSBuild 发布时,将忽略。

在 Visual Studio IDE 中启动发布时,Visual Studio 调用 MSBuild 将项目发布到 PublishDir 位置。 完成此 MSBuild 步骤后,Visual Studio 会将 ClickOnce 特定文件发布到指向 PublishUrl的位置。 第二步在 Visual Studio 进程中运行。 无法注入在此步骤中运行的任何目标/任务,因为它是 Visual Studio 进程。

对于不使用 Visual Studio 的 MSBuild 部署,请将部署目录中的所有文件复制到部署目标或媒体。 部署目录可以是网站或 FTP 站点、文件共享或 CD-ROM 上的文件夹。 例如,可以使用第三方工具或自定义 MSBuild 任务复制 ClickOnce 文件。

对于 PublishUrl 文件夹中的任何后期处理,你需要一个独立的脚本。

重要

如果将 PublishDir 设置为与 PublishUrl 相同的位置,重复的编译输出会被复制到 PublishUrl 位置。 可以通过创建新配置文件,在 Visual Studio 2022 版本 17.4 及更高版本中避免此问题。 新配置文件将PublishDir设置到与PublishUrl不同的位置。 在发布操作结束时,相关的 ClickOnce 文件将从 PublishDir 位置复制到 PublishUrl 位置。

发布属性

使用前面的过程发布应用程序时,以下属性将插入 .NET 项目的发布配置文件(.NET 5 及更高版本)。 这些属性直接影响 ClickOnce 应用程序的生成方式。

.pubxml 中:

<AssemblyOriginatorKeyFile>WindowsApplication3.snk</AssemblyOriginatorKeyFile>
<GenerateManifests>true</GenerateManifests>
<TargetZone>LocalIntranet</TargetZone>
<PublisherName>Microsoft</PublisherName>
<ProductName>CmdLineDemo</ProductName>
<PublishUrl>http://localhost/CmdLineDemo</PublishUrl>
<Install>true</Install>
<ApplicationVersion>1.0.0.*</ApplicationVersion>
<ApplicationRevision>1</ApplicationRevision>
<UpdateEnabled>true</UpdateEnabled>
<UpdateRequired>false</UpdateRequired>
<UpdateMode>Foreground</UpdateMode>
<UpdateUrlEnabled>false</UpdateUrlEnabled>
<IsWebBootstrapper>true</IsWebBootstrapper>
<BootstrapperEnabled>true</BootstrapperEnabled>

可以在命令行中重写这些属性,而无需更改项目文件本身。 例如,以下代码在没有引导程序的情况下生成 ClickOnce 应用程序部署:

msbuild /target:publish /p:PublishProfile=<pubxml file> /property:BootstrapperEnabled=false

发布属性在 Visual Studio 中由项目设计器“发布”、“安全性”和“签名”属性页控制。 对于 .NET 项目(.NET 5 及更高版本),这些设置在 pubxml 文件中提供,你可以使用发布工具在 Visual Studio 中访问这些设置。

以下发布属性在应用程序设计器的各个属性页中设置。

  • AssemblyOriginatorKeyFile 确定用于对 ClickOnce 应用程序清单进行签名的密钥文件。 此同一键还可用于为程序集分配强名称。 此属性在项目设计器“签名”页上设置。 对于 .NET Windows 应用程序,此设置将保留在项目文件中。

“发布 ”页上设置以下属性:

  • PublishUrl 是应用程序在 IDE 中发布到的位置。 如果未指定 InstallUrlUpdateUrl 属性,则会将其插入到 ClickOnce 应用程序清单中。

  • ApplicationVersion 指定 ClickOnce 应用程序的版本。 版本是一个四位数的数字。 如果最后一个数字是“*”(星号),则 ApplicationRevision 替换在生成时插入清单中的值。

  • ApplicationRevision 指定修订。 此值是一个整数,每次在 IDE 中发布时都会递增。 请注意,对在命令行执行的构建,它不会自动递增。

  • Install 确定应用程序是已安装的应用程序还是从 Web 运行的应用程序。

  • InstallUrl (未显示)是用户从中安装应用程序的位置。 如果已指定该值,并且该IsWebBootstrapper属性已启用,则该值将被写入setup.exe引导程序。 如果未指定 UpdateUrl,它也会被插入到应用程序清单中。

  • SupportUrl (未显示)是已安装应用程序的 “添加/删除程序 ”对话框中链接的位置。

以下属性在“ 应用程序更新 ”对话框中设置,可从 “发布 ”页访问。

  • UpdateEnabled 指示应用程序是否应检查更新。

  • UpdateMode 指定前台更新。 对于 .NET 项目(.NET 5 及更高版本),不支持后台。

  • UpdateUrl (未显示)是应用程序从中接收更新的位置。 如果指定,此值将插入应用程序清单中。

以下属性在“ 发布选项 ”对话框中设置,可从 “发布 ”页访问。

  • PublisherName 指定在安装或运行应用程序时显示的提示中显示的发布者的名称。 对于已安装的应用程序,它还用于在 “开始” 菜单上指定文件夹名称。

  • ProductName 指定在安装或运行应用程序时显示的提示中显示的产品的名称。 对于已安装的应用程序,它还用于在 “开始” 菜单上指定快捷名称。

以下属性在“ 先决条件 ”对话框中设置,可从 “发布 ”页访问。

  • BootstrapperEnabled 确定是否生成 setup.exe 引导程序。

  • IsWebBootstrapper 确定 setup.exe 引导程序在 Web 上还是基于磁盘的模式下工作。

使用选项:InstallURL、SupportUrl、PublishURL、UpdateURL

下表显示了 ClickOnce 部署的四个 URL 选项。

URL 选项 Description
PublishURL 需要将 ClickOnce 应用程序发布到网站。
InstallURL 可选。 如果安装站点不同于PublishURL,请设置此 URL 选项。 例如,您可以将 PublishURL 设置为 FTP 路径,并将 InstallURL 设置为 web URL。
SupportURL 可选。 如果支持网站与PublishURL不同,请设置此 URL 选项。 例如,可以将SupportURL设置为公司的客户支持网站。
UpdateURL 可选。 如果更新位置与 InstallURL 不同,请设置此 URL 选项。 例如,可以将 PublishURL 设置为 FTP 路径,将 UpdateURL 设置为 Web URL。