WPF XAML 浏览器应用程序概述

XAML 浏览器应用程序(XBAP)结合了 Web 应用程序和富客户端应用程序的功能。 与 Web 应用程序一样,XBAP 可以部署到 Web 服务器,并从 Windows 上的 Internet Explorer 或 Firefox 启动。 与丰富的客户端应用程序一样,XBAP 可以利用 WPF 的功能。 XBAP的开发类似于富客户端开发。 本主题提供了对 XBAP 开发的简单高级介绍,并介绍了 XBAP 开发与标准富客户端开发有何不同。

警告

XBAP 要求旧版浏览器运行,例如 Internet Explorer 和旧版 Firefox。 这些较旧的浏览器通常在 Windows 10 和 Windows 11 上不受支持。 由于安全风险,新式浏览器不再支持 XBAP 应用所需的技术。 不再支持启用 XBAP 的插件。 有关详细信息,请参阅 有关 WPF 浏览器托管应用程序(XBAP)的常见问题解答。

本主题包含以下部分:

创建新的 XAML 浏览器应用程序 (XBAP)

创建新 XBAP 项目的最简单方法是使用 Visual Studio。 创建新项目时,请从模板列表中选择 WPF 浏览器应用程序 。 有关详细信息,请参阅 如何:创建新的 WPF 浏览器应用程序项目

运行 XBAP 项目时,它会在浏览器窗口中打开,而不是独立窗口。 从 Visual Studio 调试 XBAP 时,应用程序使用 Internet 区域权限运行,因此,如果超出这些权限,则会引发安全异常。 有关详细信息,请参阅 安全和WPF 部分信任安全性

注释

如果不使用 Visual Studio 进行开发,或者想要了解有关项目文件的详细信息,请参阅 生成 WPF 应用程序

部署 XBAP

生成 XBAP 时,输出包含以下三个文件:

文件 DESCRIPTION
可执行文件(.exe) 这包含已编译的代码,并具有 .exe 扩展。
应用程序清单 (.manifest) 这包含与应用程序关联的元数据,并且具有 .manifest 扩展名。
部署清单 (.xbap) 此文件包含 ClickOnce 用于部署应用程序并具有 .xbap 扩展名的信息。

将 XBAP 部署到 Web 服务器,例如Microsoft Internet Information Services (IIS) 5.0 或更高版本。 无需在 Web 服务器上安装 .NET Framework,但必须注册 WPF 多用途 Internet 邮件扩展(MIME)类型和文件扩展名。 有关详细信息,请参阅 配置 IIS 5.0 和 IIS 6.0 以部署 WPF 应用程序

若要准备 XBAP 进行部署,请将 .exe 和关联的清单复制到 Web 服务器。 创建一个 HTML 页面,其中包含用于打开部署清单的超链接,该清单是扩展名为 .xbap 的文件。 当用户单击指向 .xbap 文件的链接时,ClickOnce 会自动处理下载和启动应用程序的机制。 以下示例代码显示了一个 HTML 页面,其中包含指向 XBAP 的超链接。

<html>
    <head></head>
    <body>
        <a href="XbapEx.xbap">Click this link to launch the application</a>
    </body>
</html>

可以将 XBAP 托管在网页框架中。 创建包含一个或多个框架的网页。 将框架的源属性设置为部署清单文件。 如果要使用内置机制在托管网页和 XBAP 之间进行通信,则必须在框架中托管应用程序。 以下示例代码显示了一个包含两个帧的 HTML 页面,第二个帧的源设置为 XBAP。

<html>
    <head>
        <title>A page with frames</title>
    </head>
    <frameset cols="50%,50%">
        <frame src="introduction.htm">
        <frame src="XbapEx.xbap">
    </frameset>
</html>

清除缓存的 XBAP

在某些情况下,重新生成并启动 XBAP 后,你可能会发现打开的是较早版本的 XBAP。 例如,当 XBAP 程序集版本号为静态并且从命令行启动 XBAP 时,可能会出现此行为。 在这种情况下,由于缓存版本(以前启动的版本)和新版本之间的版本号保持不变,因此不会下载 XBAP 的新版本。 而是加载缓存版本。

在这些情况下,可以使用 Mage 命令(随 Visual Studio 或 Windows SDK 一起安装)在命令提示符下删除缓存的版本。 以下命令清除应用程序缓存。

Mage.exe -cc

此命令保证 XBAP 的最新版本已启动。 在 Visual Studio 中调试应用程序时,应启动最新版本的 XBAP。 通常来讲,你应该在每次构建时更新部署版本号。 有关 Mage 的详细信息,请参阅 Mage.exe(清单生成和编辑工具)。

与主机网页通信

当应用程序托管在 HTML 框架中时,可以与包含 XBAP 的网页通信。 通过检索 BrowserInteropHelperHostScript 属性来实现此操作。 此属性返回一个表示 HTML 窗口的脚本对象。 然后,可以使用常规点语法访问 窗口对象 上的属性、方法和事件。 还可以访问脚本方法和全局变量。 以下示例演示如何检索脚本对象并关闭浏览器。

private void Button_Click(object sender, RoutedEventArgs e)
{
    // Retrieve the script object. The XBAP must be hosted in a frame or
    // the HostScript object will be null.
    var scriptObject = BrowserInteropHelper.HostScript;

    // Call close to close the browser window.
    scriptObject.Close();
}
Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    ' Retrieve the script object  The XBAP must be hosted in a frame or
    ' the HostScript object will be null.
    Dim scriptObject = BrowserInteropHelper.HostScript

    ' Call close to close the browser window.
    scriptObject.Close()
End Sub

调试使用 HostScript 的 XBAP

如果 XBAP 使用 HostScript 对象与 HTML 窗口通信,则必须指定两个设置才能在 Visual Studio 中运行和调试应用程序。 应用程序必须有权访问其源站点,并且必须使用包含 XBAP 的 HTML 页启动应用程序。 以下步骤介绍如何检查这两个设置:

  1. 在 Visual Studio 中,打开项目属性。

  2. 在“安全”选项卡上,单击“高级”。

    此时会显示“高级安全设置”对话框。

  3. 确保选中“ 授予应用程序对其源站点的访问权限 ”复选框,然后单击“ 确定”。

  4. “调试 ”选项卡上,选择 带有 URL 选项的“开始”浏览器 ,并为包含 XBAP 的 HTML 页面指定 URL。

  5. 在 Internet Explorer 中,单击 “工具 ”按钮,然后选择 “Internet 选项”。

    将显示“Internet 选项”对话框。

  6. 单击“高级” 选项卡。

  7. “安全性”下的“设置”列表中,选中“允许活动内容在我的计算机上运行”复选框。

  8. 单击 “确定”

    重启 Internet Explorer 后,更改将生效。

谨慎

在 Internet Explorer 中启用活动内容可能会使计算机面临风险。 如果不想更改 Internet Explorer 安全设置,可以从服务器启动 HTML 页并将 Visual Studio 调试器附加到进程。

XBAP 安全注意事项

XBAP 通常在部分信任的安全沙盒中执行,该沙盒仅限于 Internet 区域权限集。 因此,你的实现必须支持 Internet 区域中支持的 WPF 元素的子集,或者必须提升应用程序的权限。 有关详细信息,请参阅安全性

在应用程序中使用 WebBrowser 控件时,WPF 会在后台实例化本机 WebBrowser ActiveX 控件。 当您的应用程序是运行于 Internet Explorer 中的部分信任 XBAP 时,ActiveX 控件会在 Internet Explorer 进程的专用线程中执行。 因此,存在以下限制:

  • 控件 WebBrowser 应提供类似于主机浏览器的行为,包括安全限制。 其中一些安全限制可以通过 Internet Explorer 安全设置进行控制。 有关详细信息,请参阅安全性

  • 当 XBAP 在 HTML 页面中加载跨域时,将引发异常。

  • 输入位于与 WPF WebBrowser不同的线程上,因此无法截获键盘输入,并且 IME 状态不共享。

  • 由于在另一个线程上运行的 ActiveX 控件,导航的计时或顺序可能有所不同。 例如,导航到页面并不总是在启动另一个导航请求时被取消。

  • 由于 WPF 应用程序在单独的线程中运行,自定义 ActiveX 控件在通信方面可能会遇到问题。

  • MessageHook 不会被引发,因为 HwndHost 不能将窗口子类化到正在另一个线程或进程中运行的窗口。

创建 Full-Trust XBAP

如果 XBAP 需要完全信任,则可以更改项目以启用此权限。 以下步骤介绍如何启用完全信任:

  1. 在 Visual Studio 中,打开项目属性。

  2. 在“ 安全 ”选项卡上,选择“ 这是一个完全信任的应用程序 ”选项。

此设置进行以下更改:

  • 在项目文件中, <TargetZone> 元素值更改为 Custom

  • 在应用程序清单(app.manifest)中,将 Unrestricted="true" 属性添加到 `PermissionSet` 元素。

    <PermissionSet class="System.Security.PermissionSet"
                   version="1"
                   ID="Custom"
                   SameSite="site"
                   Unrestricted="true" />
    

部署 Full-Trust XBAP

部署不遵循 ClickOnce 受信任部署模型的完全信任 XBAP 时,用户运行应用程序的行为将取决于安全区域。 在某些情况下,用户在尝试安装它时会收到警告。 用户可以选择继续或取消安装。 下表描述了每个安全区域的应用程序的行为,以及应用程序必须执行的作才能接收完全信任。

安全区域 行为 获取完全信任
本地计算机 自动完全信任 无需执行任何操作。
Intranet 和受信任的站点 提示提供完全信任 使用证书对 XBAP 进行签名,以便用户看到提示中的源。
互联网 出现失败情况,并显示“未授予信任” 使用证书对 XBAP 进行签名。

注释

上表中介绍的行为适用于不遵循 ClickOnce 受信任部署模型的完全信任 XBAP。

建议使用 ClickOnce 受信任的部署模型部署完全信任的 XBAP。 无论安全区域如何,此模型都允许自动授予 XBAP 完全信任,以便不会提示用户。 作为此模型的一部分,必须使用受信任的发布者的证书对应用程序进行签名。 有关详细信息,请参阅 受信任的应用程序部署概述代码签名简介

XBAP 启动时间性能考虑因素

XBAP 性能的一个重要方面是其开始时间。 如果 XBAP 是第一个要加载的 WPF 应用程序,则 冷启动 时间可以是 10 秒或更多。 这是因为进度页由 WPF 呈现,并且 CLR 和 WPF 必须冷启动才能显示应用程序。

从 .NET Framework 3.5 SP1 开始,XBAP 的首次启动时间通过在部署周期的早期显示未管理的进度页来减少。 应用程序启动后,进度页几乎立即显示,因为它由本机托管代码显示并呈现在 HTML 中。

此外,ClickOnce 下载序列的并发性提升使启动时间提高了最多10%。 ClickOnce 下载并验证清单后,应用程序下载将启动,进度栏开始更新。

另请参阅