一、组件介绍
常见的内嵌入c#中的浏览器插件有两种一种是编译器自带的WebBrowser控件,这个控件是基础IE内核开发的,另外一种是WebView2,此控件需要额外引入安装包。
二者的比较如下:
WebBrowser控件优劣势:
- 优势:
- 内置支持:WebBrowser控件是C#中原生支持的控件,在Windows环境中使用方便。
- 易用性:对于简单的Web页面展示和交互需求,WebBrowser控件提供了基本的功能和接口。
- 传统稳定:作为较早引入的控件,WebBrowser在一些场景下仍然表现稳定可靠。
- 劣势:
- 基于IE内核:WebBrowser控件基于Internet Explorer内核,可能存在兼容性和性能方面的问题。
- 功能限制:对于一些现代Web技术和功能,WebBrowser控件可能无法提供良好的支持。
WebView2插件优劣势:
- 优势:
- 现代化技术:WebView2插件基于Chromium内核,拥有更好的性能和更先进的功能支持。
- 兼容性:由于采用Chromium内核,WebView2在兼容性方面更出色,能够适配更多网页内容。
- 更新迭代:Microsoft积极维护和更新WebView2插件,保障其与最新的Web标准和技术保持同步。
- 劣势:
- 需要安装:WebView2插件需要用户安装相应的运行时组件才能正常使用,增加了部署和维护成本。
- 学习曲线:相较于WebBrowser控件,可能需要花费一些时间来熟悉WebView2插件的新特性和接口。
根据具体需求和项目情况,开发人员可以权衡两者的优劣势来选择合适的工具。对于需要更现代化、性能更好、功能更丰富的应用程序,推荐使用WebView2插件;而对于简单需求或对传统功能有依赖的应用,则可以考虑继续使用WebBrowser控件。为了适应多样化的样式以及功能,笔者选择的是WebView2控件,接下来我们就以这个控件为基础进行下一步的讲解。
二、组件使用和兼容
1、浏览器初始化加载
为了避免频初始化环境,这里我们将环境只初始化一次,提高代码的复用性和效率。
namespace easy_bid_plugin.tool
{
internal class WebView2EnvironmentManager
{
// 私有静态变量,用于存储 WebView2 环境实例
private static CoreWebView2Environment webView2Environment = null;
// 私有构造函数,防止外部创建实例
private WebView2EnvironmentManager() { }
// 公共静态方法,用于获取或创建 WebView2 环境实例
public static async Task<CoreWebView2Environment> GetOrCreateWebView2EnvironmentAsync()
{
if (webView2Environment == null)
{
// 创建 userDataFolder 路径
string userDataFolder = Path.Combine(Path.GetTempPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
// 创建 WebView2 环境实例
webView2Environment = await CoreWebView2Environment.CreateAsync(null, userDataFolder);
}
return webView2Environment;
}
}
}
2、使用
public partial class BrowsingWindow : Form
{
public string MyParam { get; set; }
private WebView2 webView;
public BrowsingWindow(string param)
{
InitializeComponent();
MyParam = param;
InitializeWebView();
this.ShowIcon = false; // 隐藏窗体左上角的图标
}
private async void InitializeWebView()
{
try
{
// 获取或创建 WebView2 环境
CoreWebView2Environment environment = await WebView2EnvironmentManager.GetOrCreateWebView2EnvironmentAsync();
// 创建 WebView2 控件并添加到窗体中
webView = new WebView2
{
Dock = DockStyle.Fill
};
Controls.Add(webView);
// 确保 WebView2 控件初始化完成
await webView.EnsureCoreWebView2Async(environment);
// 设置要加载的页面
webView.Source = new Uri(BaseUrl.GetBaseUrl() + MyParam);
// 订阅 WebMessageReceived 事件
webView.CoreWebView2.WebMessageReceived += OnWebMessageReceived;
}
catch (Exception ex)
{
// 处理异常并显示消息框
MessageBox.Show("WebView 初始化失败: " + ex.Message, "初始化错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
3、使用 Advanced Installer打包兼容34与64位程序
将debug或者Release文件夹下的 runtimes文件夹打进此包中即可适配多种环境
4、兼容WPS
原理不再赘述,主要是找到WPS的注册表是什么样子的,我们在打包时生成对应的注册表文件即可,下边直接贴图,照图修改即可
三、心得分享
在引入WebView2控件时,博主本地使用visual运行没有任何问题,但是打包之后,一直提示缺少某个组件,为此网上找了不少资料都没有解决,最终在通过阅读源时发现,此控件运行时需要先初始化环境,会用到一个WebView2Loader.dll 但是此控件在打包的过程中却没有被自动添加进去,因此打成的包始终是有问题的,后来新引入了runtimes文件夹后解决此问题,此控件会遍历系统中是否存在WebView2Loader.dll组件,因为博主本地有此环境,所以没有报错,有时候找不到问题的原因,多去阅读源码会有很大的帮助!至此博主学习VSTO开发的路程算是告一段落,希望这些文章能够为正在阅读的你提供一些微不足道的帮助。