WPF XAML Browser Applications Overview(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 时,输出将包括以下三个文件:
文件 | 说明 |
---|---|
可执行文件 (.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 将自动处理应用程序的下载和启动机制。 下面的代码示例显示包含指向 XBAP 的超链接的 HTML 页面。
<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 的网页进行通信。 通过检索 BrowserInteropHelper 的 HostScript 属性,可以实现此目的。 此属性返回一个表示 HTML 窗口的脚本对象。 然后可以通过使用常规的点语法访问 window object(window 对象)上的属性、方法和事件。 还可以访问脚本方法和全局变量。 以下示例演示如何检索脚本对象和关闭浏览器。
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 页启动应用程序。 以下步骤介绍如何检查这两个设置:
在 Visual Studio 中,打开项目属性。
在“安全”选项卡上,单击“高级”。
将出现高级安全设置对话框。
请确保选中“授予应用程序对其源站点的访问权”复选框,然后单击“确定”。
在“调试”选项卡上,选择“使用 URL 启动浏览器”选项,然后指定包含 XBAP 的 HTML 页的 URL。
在 Internet Explorer 中,单击“工具”按钮,然后选择“Internet 选项”。
将显示“Internet 选项”对话框。
单击“高级” 选项卡。
在“安全性”下面的“设置”列表中,选中“允许活动内容在我的计算机上的文件中运行”复选框。
单击“确定”。
重启 Internet Explorer 后更改才会生效。
注意
在 Internet Explorer 中启用活动内容可能会给计算机带来风险。 如果不想更改 Internet Explorer 安全设置,则可以从服务器启动 HTML 页,并将 Visual Studio 调试程序附加到进程。
XBAP 安全注意事项
通常在被限制到 Internet 区域权限集的部分信任的安全沙盒中执行 XBAP。 因此,实现必须支持 Internet 区域中所支持的 WPF 元素的子集,或者必须提升应用程序的权限。 有关详细信息,请参阅安全性。
在应用程序中使用 WebBrowser 控件时,WPF 会在内部实例化本机 WebBrowser ActiveX 控件。 如果应用程序是 Internet Explorer 中运行的部分信任的 XBAP,则 ActiveX 控件会在 Internet Explorer 进程的专用线程中运行。 因此,存在以下限制:
WebBrowser 控件应提供类似于宿主浏览器的行为,包括安全限制。 可以通过 Internet Explorer 安全设置控制这些安全限制中的某些限制。 有关详细信息,请参阅安全性。
在 HTML 页中跨域加载 XBAP 时,将引发异常。
输入位于与 WPF WebBrowser 不同的线程上,因此无法截获键盘输入且不会共享 IME 状态。
由于 ActiveX 控件在另一个线程上运行,导航的计时或顺序可能有所不同。 例如,并不总是通过启动另一个导航请求来取消到某页的导航。
自定义 ActiveX 控件可能会在通信方面出现问题,因为 WPF 应用程序在另一个线程上运行。
不会引发 MessageHook,因为 HwndHost 无法对在另一线程或进程中运行的窗口设置子类。
创建完全信任的 XBAP
如果 XBAP 需要完全信任,则可以更改项目以启用此权限。 以下步骤介绍如何启用完全信任:
在 Visual Studio 中,打开项目属性。
在“安全性”选项卡上,选择“这是完全可信的应用程序”选项。
此设置将进行以下更改:
在项目文件中,将
<TargetZone>
元素值更改为Custom
。在应用程序清单 (app.manifest) 中,将
Unrestricted="true"
特性添加到 `PermissionSet 元素。<PermissionSet class="System.Security.PermissionSet" version="1" ID="Custom" SameSite="site" Unrestricted="true" />
部署完全信任的 XBAP
部署不遵循 ClickOnce 受信任部署模型的完全信任的 XBAP 时,用户运行该应用程序时的行为将取决于安全区域。 在某些情况下,用户会在尝试安装它时收到警告。 用户可以选择继续或取消安装。 下表描述每个安全区域的应用程序的行为,以及为了使应用程序接收完全信任而必须执行的操作。
安全区域 | 行为 | 获取完全信任 |
---|---|---|
本地计算机 | 自动完全信任 | 无需采取任何措施。 |
Intranet 和受信任的站点 | 提示完全信任 | 使用证书对 XBAP 进行签名,以便用户在提示中看到源。 |
Internet | 失败,并显示“未授予信任” | 使用证书对 XBAP 进行签名。 |
注意
上表中描述的行为针对的是不遵循 ClickOnce 受信任部署模型的完全信任的 XBAP。
建议使用 ClickOnce 受信任部署模型部署完全信任的 XBAP。 此模型允许自动向 XBAP 授予完全信任(与安全区域无关),这样用户便不会收到提示。 作为此模型的一部分,必须使用来自受信任发行者提供的证书来对应用程序进行签名。 有关详细信息,请参阅受信任的应用程序部署概述和 Introduction to Code Signing(代码签名简介)。
XBAP 启动时间性能注意事项
XBAP 性能的一个重要方面是其启动时间。 如果 XBAP 是要加载的第一个 WPF 应用程序,则冷启动时间可能为十秒或更长。 这是因为进度页面由 WPF 呈现,且 CLR 和 WPF 都必须冷启动才能显示应用程序。
在 .NET Framework 3.5 SP1 中启动时,通过在部署周期早期显示未托管进度页可以缩短 XBAP 的冷启动时间。 启动应用程序后几乎会立即显示进度页,因为它由本机宿主代码显示,并以 HTML 格式呈现。
此外,改进的 ClickOnce 下载序列并发最多可将启动时间缩短 10%。 当 ClickOnce 下载并验证清单后,将启动应用程序下载并开始更新进度栏。