从命令行生成 ClickOnce 应用程序

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

注意

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

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

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

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

“目标”是指示 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.exe 和 CmdLineDemo.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 属性设置生成输出位置,包括生成工件。 默认情况下,MSBuild 用作发布目标的 PublishDir 值是从项目文件 (.NET Framework) 中的 PublishDir 属性获取的。 可以使用 /p 开关在 MSBuild 命令行中重写此行为。 如果替代该设置,发布输出将转到指定的位置。 输出在发布的 MSBuild 步骤期间生成。 任何带有 AfterTargets="ClickOncePublish" 的 MSBuild 目标都将在创建此副本后运行。

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

在 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”和“自定义”。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 选项 说明
PublishURL 需要将 ClickOnce 应用程序发布到网站。
InstallURL 可选。 如果安装站点与 PublishURL 不同,请设置此 URL 选项。 例如,可以将 PublishURL 设置为 FTP 路径并将 InstallURL 设置为 Web URL。
SupportURL 可选。 如果支持站点与 PublishURL 不同,请设置此 URL 选项。 例如,可以将 SupportURL 设置为公司的客户支持网站。
UpdateURL 可选。 如果更新位置与 InstallURL 不同,请设置此 URL 选项。 例如,可以将 PublishURL 设置为 FTP 路径并将 UpdateURL 设置为 Web URL。