使用 CLI 发布适用于 Windows 的 .NET MAUI 应用

分发适用于 Windows 的 .NET 多平台应用 UI (.NET MAUI) 应用时,可以将应用及其依赖项发布到文件夹,以便部署到另一个系统。 还可以将应用打包到 MSIX 包中,这对安装应用的用户有很多好处。 有关 MSIX 优势的详细信息,请参阅 什么是 MSIX?

.NET MAUI 目前仅允许发布 MSIX 包。 你还不能发布 Windows 可执行文件进行分发。

创建签名证书

必须使用签名证书来发布应用。 此证书用于对 MSIX 包进行签名。 以下步骤演示如何使用 PowerShell 创建和安装自签名证书:

注意

创建和使用自签名证书时,只有安装并信任你的证书的用户才能运行你的应用。 这很容易实现以进行测试,但它可能会阻止其他用户安装你的应用。 准备好发布应用时,建议使用由受信任的源颁发的证书。 这种集中信任系统有助于确保应用生态系统具有级别的验证,以保护用户免受恶意行动者的侵害。

  1. 打开 PowerShell 终端,导航到包含项目的目录。

  2. New-SelfSignedCertificate使用 命令生成自签名证书。

    当用户安装你的应用时,将 <PublisherName> 向用户显示该值,提供你自己的值并省略 < > 字符。 可以将 参数设置为 FriendlyName 所需的任何文本字符串。

    New-SelfSignedCertificate -Type Custom `
                              -Subject "CN=<PublisherName>" `
                              -KeyUsage DigitalSignature `
                              -FriendlyName "My temp dev cert" `
                              -CertStoreLocation "Cert:\CurrentUser\My" `
                              -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}")
    
  3. 使用以下 PowerShell 命令查询已创建的证书的证书存储:

    Get-ChildItem "Cert:\CurrentUser\My" | Format-Table Subject, FriendlyName, Thumbprint
    

    应看到结果类似于以下输出:

    Thumbprint                               Subject                                  FriendlyName
    ----------                               -------                                  ------------
    DE8B962E7BF797CB48CCF66C8BCACE65C6585E2F CN=1f23fa36-2a2f-475e-a69e-3a14fe56ed4
    A6CA34FD0BA6B439787391F51C87B1AD0C9E7FAE CN=someone@microsoft.com
    94D93DBC97D4F7E4364A215F15C6ACFEFC71E569 CN=localhost                             ASP.NET Core HTTPS development certificate
    F14211566DACE867DA0BF9C2F9C47C01E3CF1D9B CN=john
    568027317BE8EE5E6AACDE5079D2DE76EC46EB88 CN=e1f823e2-4674-03d2-aaad-21ab23ad84ae
    DC602EE83C95FEDF280835980E22306067EFCA96 CN=John Smith, OU=MSE, OU=Users, DC=com
    07AD38F3B646F5AAC16F2F2570CAE40F4842BBE0 CN=Contoso                               My temp dev cert
    
  4. 稍后将使用证书的 指纹 ,因此请将其复制到剪贴板。 它是 指纹 值,其条目与证书的 SubjectFriendlyName 匹配。

有关详细信息,请参阅 创建用于包签名的证书

配置项目生成设置

项目文件是放置特定于 Windows 的生成设置的好地方。 你可能不希望将某些设置放入项目文件,例如密码。 本部分所述的设置可以使用 格式在命令行 -p:name=value 上传递。 如果已在项目文件中定义设置,则命令行上传递的设置将替代项目设置。

将以下 <PropertyGroup> 节点添加到项目文件。 仅当目标框架为 Windows 且配置设置为 Release时,才会处理此属性组。 每当在模式下生成或发布 Release 时,此配置部分将运行。

<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows' and '$(Configuration)' == 'Release'">
    <AppxPackageSigningEnabled>true</AppxPackageSigningEnabled>
    <PackageCertificateThumbprint>A10612AF095FD8F8255F4C6691D88F79EF2B135E</PackageCertificateThumbprint>
</PropertyGroup>
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows' and '$(RuntimeIdentifierOverride)' != ''">
    <RuntimeIdentifier>$(RuntimeIdentifierOverride)</RuntimeIdentifier>
</PropertyGroup>

<PackageCertificateThumbprint> 属性值替换为之前生成的证书指纹。 或者,可以从项目文件中删除此设置,并在命令行中提供此设置。 例如:-p:PackageCertificateThumbprint=A10612AF095FD8F8255F4C6691D88F79EF2B135E

此示例中的第二 <PropertyGroup> 个是解决 Windows SDK 中的 bug 所必需的。 有关该 bug 的详细信息,请参阅 WindowsAppSDK 问题 #2940

发布

若要发布应用,请打开 VS 2022 终端的开发人员命令提示 ,并导航到 .NET MAUI 应用项目的 文件夹。 dotnet publish运行 命令,并提供以下参数:

参数
-f 目标框架,即 net7.0-windows{version}。 此值是 Windows TFM,例如 net7.0-windows10.0.19041.0。 确保此值与 .csproj 文件中节点<TargetFrameworks>中的值相同。
-c 生成配置,即 Release
-p:RuntimeIdentifierOverride=win10-x64
- 或 -
-p:RuntimeIdentifierOverride=win10-x86
避免 WindowsAppSDK 问题 #2940 中详述的 bug。 -x64根据目标平台选择 参数的 或 -x86 版本。

警告

尝试发布 .NET MAUI 解决方案将导致 dotnet publish 命令尝试单独发布解决方案中的每个项目,这在将其他项目类型添加到解决方案时可能会导致问题。 因此,命令 dotnet publish 的范围应限定为 .NET MAUI 应用项目。

例如:

dotnet publish -f net7.0-windows10.0.19041.0 -c Release -p:RuntimeIdentifierOverride=win10-x64

发布生成和打包应用,将签名的包复制到 bin\Release\net7.0-windows10.0.19041.0\win10-x64\AppPackages\<appname>\ 文件夹。 <appname> 是一个以项目和版本命名的文件夹。 在此文件夹中,有一个 msix 文件,即应用包。

有关 命令的详细信息 dotnet publish ,请参阅 dotnet publish

安装应用

若要安装应用,必须使用已信任的证书对应用进行签名。 否则,Windows 不会允许你安装该应用。 将显示如下所示的对话框,其中禁用了“安装”按钮:

安装不受信任的应用。

请注意,在上图中,发布服务器为“未知”。

若要信任应用包的证书,请执行以下步骤:

  1. 右键单击 .msix 文件,然后选择“属性”。

  2. 选择“ 数字签名 ”选项卡。

  3. 选择证书,然后按 “详细信息”。

    MSIX 文件的“属性”窗格,其中选择了“数字签名”选项卡。

  4. 选择“ 查看证书”。

  5. 选择 “安装证书...”

  6. 选择 “本地计算机” ,然后选择“ 下一步”。

    如果“用户帐户控制”提示你 是否允许此应用对设备进行更改?,请选择“ ”。

  7. “证书导入向导” 窗口中,选择“ 将所有证书放入以下存储区”。

  8. 选择“浏览...”,然后选择“受信任的人员存储”。 选择“确定”关闭对话框。

    选择“受信任的人员存储时,会显示证书导入向导窗口。

  9. 选择“下一步”,然后选择“完成”。 应会看到一个对话框,显示: 导入成功

    包含成功导入消息的证书导入向导窗口。

  10. 在此过程过程中打开的任何窗口上,选择 “确定 ”以将其全部关闭。

现在,尝试再次打开包文件以安装应用。 应会看到如下所示的对话框,其中正确显示了发布服务器:

安装受信任的应用。

如果要安装应用,请选择“ 安装 ”按钮。

当前限制

以下列表描述了发布和打包的当前限制:

  • 如果尝试使用发布文件夹中的可执行文件直接运行已发布的应用,则发布的应用不起作用。
  • 运行应用的方法是首先通过打包的 MSIX 文件安装它。