如何在WPF与WinForms项目间共享WebView2通用代码?
在C#中复用WebView2跨WPF/WinForms的工具代码方案
针对你遇到的WebView2在WPF和WinForms中需要不同命名空间导致代码重复的问题,C#有几种成熟的解决方案,无需复制粘贴代码:
方案1:条件编译指令(最简单直接)
通过定义项目专属的编译符号,在同一个代码文件中区分不同平台的using语句和平台相关逻辑。
步骤:
- 创建单一工具代码文件,写入以下结构:
// 根据当前项目类型选择对应的命名空间 #if WPF using Microsoft.Web.WebView2.Wpf; #elif WINFORMS using Microsoft.Web.WebView2.WinForms; #endif // 你的通用工具代码,比如: public class WebView2Helper { public static void ConfigureWebView(WebView2 webView) { // 通用配置逻辑,比如初始化环境、设置事件监听等 webView.CoreWebView2InitializationCompleted += (s, e) => { // 初始化完成后的通用操作 }; } }
给项目添加编译符号:
- 右键WPF项目 → 属性 → 生成 → 条件编译符号,添加
WPF - 右键WinForms项目 → 属性 → 生成 → 条件编译符号,添加
WINFORMS
- 右键WPF项目 → 属性 → 生成 → 条件编译符号,添加
将该文件同时添加到两个项目中(右键项目 → 添加 → 现有项 → 选择文件,点击添加按钮旁的下拉箭头,选择"添加为链接",避免文件复制)。
编译时,项目会根据自身的编译符号自动选择对应的命名空间,实现代码复用。
方案2:接口抽象+依赖注入(最优雅的架构方案)
将WebView2的核心操作抽象为接口,针对WPF和WinForms分别实现具体类,通用工具代码依赖接口而非具体平台类型,彻底解耦平台差异。
步骤:
- 定义通用接口:
public interface IWebView2Operations { void NavigateToUrl(string url); Task<string> RunJavaScript(string script); // 按需添加你需要的WebView2操作方法 }
- 实现平台专属类:
- WPF实现:
using Microsoft.Web.WebView2.Wpf; public class WpfWebView2Adapter : IWebView2Operations { private readonly WebView2 _webView; public WpfWebView2Adapter(WebView2 webView) { _webView = webView; } public void NavigateToUrl(string url) => _webView.Navigate(url); public Task<string> RunJavaScript(string script) => _webView.ExecuteScriptAsync(script); }
- WinForms实现:
using Microsoft.Web.WebView2.WinForms; public class WinFormsWebView2Adapter : IWebView2Operations { private readonly WebView2 _webView; public WinFormsWebView2Adapter(WebView2 webView) { _webView = webView; } public void NavigateToUrl(string url) => _webView.Navigate(url); public Task<string> RunJavaScript(string script) => _webView.ExecuteScriptAsync(script); }
- 编写通用工具类:
public class WebView2Tool { private readonly IWebView2Operations _webViewOps; // 通过构造注入获取平台适配实例 public WebView2Tool(IWebView2Operations webViewOps) { _webViewOps = webViewOps; } // 通用业务逻辑,和平台完全无关 public async Task<string> LoadPageAndGetData(string url, string extractScript) { _webViewOps.NavigateToUrl(url); // 可添加等待页面加载完成的逻辑 return await _webViewOps.RunJavaScript(extractScript); } }
- 在各项目中使用:
- WPF项目中:
var tool = new WebView2Tool(new WpfWebView2Adapter(myWpfWebView)); - WinForms项目中:
var tool = new WebView2Tool(new WinFormsWebView2Adapter(myWinFormsWebView));
- WPF项目中:
这种方案适合工具逻辑复杂的场景,后续扩展其他平台(比如MAUI)也只需新增对应适配器即可。
方案3:使用共享项目(Shared Project)
共享项目是一种特殊的项目类型,它的代码会直接嵌入到引用它的项目中,可自动适配项目的平台上下文。
步骤:
- 创建一个共享项目(Visual Studio中新建项目时选择"共享项目")。
- 将你的通用工具代码放入共享项目中,配合方案1的条件编译指令处理命名空间差异。
- 分别在WPF和WinForms项目中添加对该共享项目的引用。
共享项目的好处是无需手动添加文件链接,所有引用项目都会自动同步共享项目中的代码变更。
内容的提问来源于stack exchange,提问作者oscar
相关产品推荐
相关产品推荐

