当你创建 ClickOnce 应用程序并将其提供给客户进行发布和部署时,客户通常必须更新部署清单并对其进行重新签名。 虽然这在大多数情况下仍是首选方法,但 .NET Framework 3.5 使你可以创建可由客户部署的 ClickOnce 部署,而无需重新生成新的部署清单。 有关详细信息,请参阅 在不重新签名的情况下为测试服务器和生产服务器部署 ClickOnce 应用程序

当你创建 ClickOnce 应用程序,然后将其分配给客户进行发布和部署时,应用程序可以使用客户的署名或保留你自己的署名。 例如,如果应用程序是单个专用应用程序,你可能想要保留你自己的署名。 如果应用程序是针对每个客户高度自定义的,那么你可能希望使用客户署名。 通过 .NET Framework 3.5,你可以在将应用程序提供给组织进行部署时保留你自己的署名、出版商信息和安全签名。 有关详细信息,请参阅 创建供其他人部署的 ClickOnce 应用程序

在本演练中,你将使用命令行工具 Mage.exe 或图形工具 MageUI.exe 手动创建部署。 有关手动部署的详细信息,请参阅 演练:手动部署 ClickOnce 应用程序

在适用于 .NET Core 3.1 和 .NET 5 或更高版本的 ClickOnce 中,使用 dotnetmage.exe,而不是 Mage.exe 。 有关详细信息,请参阅 适用于 .NET 的 ClickOnce

若要执行本演练中的步骤,需要以下各项:

  • 准备部署的 Windows 窗体应用程序。 此应用程序将称为 WindowsFormsApp1。

  • Visual Studio 或 Windows SDK。

    使用 Mage.exe 部署具有多个部署和署名支持的 ClickOnce 应用程序

  • 打开 Visual Studio 命令提示符或 Windows SDK 命令提示符,然后更改到要存储 ClickOnce 文件的目录。

  • 创建一个以当前部署版本命名的目录。 如果这是你首次部署应用程序,则可能会选择“1.0.0.0”。

    部署版本可能与应用程序版本文件不同。

  • 创建名为 bin 的子目录,并复制此处的所有应用程序文件(包括可执行文件、程序集、资源和数据文件)。

  • 通过调用 Mage.exe 生成应用程序清单。

    mage -New Application -ToFile 1.0.0.0\WindowsFormsApp1.exe.manifest -Name "Windows Forms App 1" -Version 1.0.0.0 -FromDirectory 1.0.0.0\bin -UseManifestForTrust true -Publisher "A. Datum Corporation"
    
  • 使用数字证书对应用程序清单进行签名。

    mage -Sign WindowsFormsApp1.exe.manifest -CertFile mycert.pfx
    
  • 通过调用 Mage.exe 生成部署清单。 默认情况下,Mage.exe 会将 ClickOnce 部署标记为已安装的应用程序,以便它可以联机和脱机运行。 若要使应用程序仅在用户联机时可用,请使用值为 f-i 参数。 由于此应用程序将利用多个部署功能,因此请排除 Mage.exe 的 -providerUrl 参数。 (在版本 3.5 之前的 .NET Framework 版本中,排除脱机应用程序的 -providerUrl 将导致错误。)

    mage -New Deployment -ToFile WindowsFormsApp1.application -Name "Windows Forms App 1" -Version 1.0.0.0 -AppManifest 1.0.0.0\WindowsFormsApp1.manifest
    
  • 请不要签署部署清单。

  • 将所有文件提供给客户,客户将在其网络上部署应用程序。

  • 此时,客户必须用自己的自行生成证书对部署清单进行签名。 例如,如果客户在一家名为 Adventure Works 的公司工作,则他可以使用 MakeCert.exe 工具生成自签名证书。 接下来,使用 Pvk2pfx.exe 工具将 MakeCert.exe 创建的文件合并到可传递到 Mage.exe 的 PFX 文件中。

    makecert -r -pe -n "CN=Adventure Works" -sv MyCert.pvk MyCert.cer
    pvk2pfx.exe -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx
    
  • 接下来,客户使用此证书对部署清单进行签名。

    mage -Sign WindowsFormsApp1.application -CertFile MyCert.pfx
    
  • 客户向其用户部署应用程序。

    使用 MageUI.exe 部署具有多个部署和署名支持的 ClickOnce 应用程序

  • 打开 Visual Studio 命令提示符或 Windows SDK 命令提示符,然后导航到要存储 ClickOnce 文件的目录。

  • 创建名为 bin 的子目录,并复制此处的所有应用程序文件(包括可执行文件、程序集、资源和数据文件)。

  • 创建一个以当前部署版本命名的子目录。 如果这是你首次部署应用程序,则可能会选择“1.0.0.0”。

    部署版本可能与应用程序版本文件不同。

  • 将 \bin 目录移动到步骤 2 中创建的目录中。

  • 启动图形工具 MageUI.exe。

    MageUI.exe
    
  • 从菜单中依次选择“文件”、“新建”、“应用程序清单”,创建新的应用程序清单。

  • 在默认的“名称”选项卡上,输入此部署的名称和版本号。 此外,为 Publisher 提供一个值,该值将用作部署时“开始”菜单中应用程序快捷方式链接的文件夹名称。

  • 选择“应用程序选项”选项卡,然后单击“使用应用程序清单以获取信任信息”。 这将为此 ClickOnce 应用程序启用第三方署名。

  • 选择“文件”选项卡,然后单击“应用程序目录”文本框旁边的“浏览”按钮。

  • 选择包含在步骤 2 中创建的应用程序文件的目录,然后在“文件夹选择”对话框中单击“确定”。

  • 单击“填充”按钮,将所有应用程序文件添加到文件列表中。 如果应用程序包含多个可执行文件,请从“文件类型”下拉列表中选择“入口点”,将此部署的主要可执行文件标记为启动应用程序。 (如果应用程序仅包含一个可执行文件,则 MageUI.exe 会标记该文件。)

  • 选择“所需的权限”选项卡并选择需要应用程序断言的信任级别。 默认值为 Full Trust,适用于大多数应用程序。

  • 从菜单中选择“文件”、“保存”,然后保存应用程序清单。 保存应用程序清单时,系统将提示你对应用程序清单进行签名。

  • 如果将证书作为文件存储在文件系统上,请使用“签署为证书文件”选项,然后使用省略号 (…) 按钮从文件系统中选择证书。

    如果证书保存在可从计算机访问的证书存储中,请选择“使用存储的证书签名”选项,然后从提供的列表中选择证书。

  • 从菜单中选择“文件”、“新建”、“部署清单”以创建部署清单,然后在“名称”选项卡上,提供名称和版本号(本例中为 1.0.0.0)。

  • 切换到“更新”选项卡,并指定希望此应用程序更新的频率。 如果应用程序使用 ClickOnce 部署 API 自行检查更新,请清除标记为“此应用程序应检查更新”的复选框。

  • 切换到“应用程序引用”选项卡。你可以通过单击“选择清单”按钮,然后选择在前面步骤中创建的应用程序清单,预先填充此选项卡上的所有值。

  • 选择“保存”,并将部署清单保存到磁盘。 保存应用程序清单时,系统将提示你对应用程序清单进行签名。 单击“取消”可保存清单,而无需对其进行签名。

  • 向客户提供所有应用程序文件。

  • 此时,客户必须用自己的自行生成证书对部署清单进行签名。 例如,如果客户在一家名为 Adventure Works 的公司工作,则他可以使用 MakeCert.exe 工具生成自签名证书。 接下来,使用 Pvk2pfx.exe 工具将 MakeCert.exe 创建的文件合并到可传递到 MageUI.exe 的 PFX 文件中。

    makecert -r -pe -n "CN=Adventure Works" -sv MyCert.pvk MyCert.cer
    pvk2pfx.exe -pvk MyCert.pvk -spc MyCert.cer -pfx MyCert.pfx
    
  • 生成证书后,客户现在会通过在 MageUI.exe 中打开部署清单并保存它来签署部署清单。 当出现签名对话框时,客户选择“签署为证书文件”选项,然后选择已保存在磁盘上的 PFX 文件。

  • 客户向其用户部署应用程序。

  • Mage.exe(清单生成和编辑工具)
  • MageUI.exe(图形化客户端中的清单生成和编辑工具)
  • MakeCert
  • 即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback

    提交和查看相关反馈

  •