使用 CLI 发布适用于 Windows 的 .NET MAUI 应用
分发适用于 Windows 的 .NET 多平台应用 UI (.NET MAUI) 应用时,可以将应用及其依赖项发布到文件夹,以便部署到另一个系统。 还可以将应用打包到 MSIX 包中,这对安装应用的用户有很多好处。 有关 MSIX 优势的详细信息,请参阅 什么是 MSIX?
.NET MAUI 目前仅允许发布 MSIX 包。 你还不能发布 Windows 可执行文件进行分发。
创建签名证书
必须使用签名证书来发布应用。 此证书用于对 MSIX 包进行签名。 以下步骤演示如何使用 PowerShell 创建和安装自签名证书:
注意
创建和使用自签名证书时,只有安装并信任你的证书的用户才能运行你的应用。 这很容易实现以进行测试,但它可能会阻止其他用户安装你的应用。 准备好发布应用时,建议使用由受信任的源颁发的证书。 这种集中信任系统有助于确保应用生态系统具有级别的验证,以保护用户免受恶意行动者的侵害。
打开 PowerShell 终端,导航到包含项目的目录。
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}")
使用以下 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
稍后将使用证书的 指纹 ,因此请将其复制到剪贴板。 它是 指纹 值,其条目与证书的 Subject 和 FriendlyName 匹配。
有关详细信息,请参阅 创建用于包签名的证书。
配置项目生成设置
项目文件是放置特定于 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 不会允许你安装该应用。 将显示如下所示的对话框,其中禁用了“安装”按钮:
请注意,在上图中,发布服务器为“未知”。
若要信任应用包的证书,请执行以下步骤:
右键单击 .msix 文件,然后选择“属性”。
选择“ 数字签名 ”选项卡。
选择证书,然后按 “详细信息”。
选择“ 查看证书”。
选择 “安装证书...”。
选择 “本地计算机” ,然后选择“ 下一步”。
如果“用户帐户控制”提示你 是否允许此应用对设备进行更改?,请选择“ 是”。
在 “证书导入向导” 窗口中,选择“ 将所有证书放入以下存储区”。
选择“浏览...”,然后选择“受信任的人员存储”。 选择“确定”关闭对话框。
选择“下一步”,然后选择“完成”。 应会看到一个对话框,显示: 导入成功。
在此过程过程中打开的任何窗口上,选择 “确定 ”以将其全部关闭。
现在,尝试再次打开包文件以安装应用。 应会看到如下所示的对话框,其中正确显示了发布服务器:
如果要安装应用,请选择“ 安装 ”按钮。
当前限制
以下列表描述了发布和打包的当前限制:
- 如果尝试使用发布文件夹中的可执行文件直接运行已发布的应用,则发布的应用不起作用。
- 运行应用的方法是首先通过打包的 MSIX 文件安装它。