从命令行生成 ClickOnce 应用程序

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

注释

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

使用 MSBuild 重现 .NET Framework 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 窗体应用(.NET Framework)WPF 应用(.NET Framework) 项目模板并命名项目 CmdLineDemo

  2. 在“ 生成 ”菜单中,选择 “发布 ”命令。

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

    此时会显示发布向导。

  3. 在发布向导中,选择“ 完成”。

    Visual Studio 生成并显示默认网页,称为 Publish.htm

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

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

在命令行中重现构建

  1. 退出 Visual Studio。

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

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

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

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

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

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

  5. 输入 msbuild /target:publish

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

注释

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

发布进程输出

MSBuild 使用 PublishDir 属性设置生成输出位置,包括生成工件。 PublishDir MSBuild 用作发布目标的值默认从PublishDir项目文件(.NET Framework)中的属性获取。 可以在 MSBuild 命令行上通过使用 /p 开关覆盖此行为。 如果覆盖该设置,则发布输出内容将转到指定的位置。 输出是在发布 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 位置。

发布属性

使用前面的过程发布应用程序时,发布向导会将以下属性插入项目文件中。 这些属性直接影响 ClickOnce 应用程序的生成方式。

CmdLineDemo.vbproj / CmdLineDemo.csproj 中:

<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>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdateUrlEnabled>false</UpdateUrlEnabled>
<IsWebBootstrapper>true</IsWebBootstrapper>
<BootstrapperEnabled>true</BootstrapperEnabled>

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

msbuild /target:publish /property:BootstrapperEnabled=false

发布属性在 Visual Studio 中由项目设计器“发布”、“安全性”和“签名”属性页控制。

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

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

“安全 ”页上设置以下属性:

  • 启用 ClickOnce 安全设置 可确定是否生成 ClickOnce 清单。 最初创建项目时,ClickOnce 清单生成默认处于关闭状态。 首次发布时,向导会自动打开此标志。

  • TargetZone 确定要发送到 ClickOnce 应用程序清单的信任级别。 可能的值为“Internet”、“LocalIntranet”和“Custom”。Internet 和 LocalIntranet 会导致在 ClickOnce 应用程序清单中发出默认权限集。 LocalIntranet 是默认值,它基本上意味着完全信任。 自定义指定仅将基本 app.manifest 文件中显式指定的权限发出到 ClickOnce 应用程序清单中。 app.manifest 文件是仅包含信任信息定义的部分清单文件。 它是一个隐藏文件,在“ 安全 ”页上配置权限时自动添加到项目中。

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

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

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

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

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

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

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

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

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

  • UpdateMode 指定前台更新或后台更新。

  • UpdateInterval 指定应用程序检查更新的频率。

  • UpdateIntervalUnits 指定该值是否 UpdateInterval 以小时、天或周为单位。

  • 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。