You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF与WinForms项目间共享WebView2通用代码?

在C#中复用WebView2跨WPF/WinForms的工具代码方案

针对你遇到的WebView2在WPF和WinForms中需要不同命名空间导致代码重复的问题,C#有几种成熟的解决方案,无需复制粘贴代码:

方案1:条件编译指令(最简单直接)

通过定义项目专属的编译符号,在同一个代码文件中区分不同平台的using语句和平台相关逻辑。

步骤:

  1. 创建单一工具代码文件,写入以下结构:
// 根据当前项目类型选择对应的命名空间
#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) =>
        {
            // 初始化完成后的通用操作
        };
    }
}
  1. 给项目添加编译符号:

    • 右键WPF项目 → 属性 → 生成 → 条件编译符号,添加WPF
    • 右键WinForms项目 → 属性 → 生成 → 条件编译符号,添加WINFORMS
  2. 将该文件同时添加到两个项目中(右键项目 → 添加 → 现有项 → 选择文件,点击添加按钮旁的下拉箭头,选择"添加为链接",避免文件复制)。

编译时,项目会根据自身的编译符号自动选择对应的命名空间,实现代码复用。

方案2:接口抽象+依赖注入(最优雅的架构方案)

将WebView2的核心操作抽象为接口,针对WPF和WinForms分别实现具体类,通用工具代码依赖接口而非具体平台类型,彻底解耦平台差异。

步骤:

  1. 定义通用接口:
public interface IWebView2Operations
{
    void NavigateToUrl(string url);
    Task<string> RunJavaScript(string script);
    // 按需添加你需要的WebView2操作方法
}
  1. 实现平台专属类:
    • 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);
}
  1. 编写通用工具类:
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);
    }
}
  1. 在各项目中使用:
    • WPF项目中:var tool = new WebView2Tool(new WpfWebView2Adapter(myWpfWebView));
    • WinForms项目中:var tool = new WebView2Tool(new WinFormsWebView2Adapter(myWinFormsWebView));

这种方案适合工具逻辑复杂的场景,后续扩展其他平台(比如MAUI)也只需新增对应适配器即可。

方案3:使用共享项目(Shared Project)

共享项目是一种特殊的项目类型,它的代码会直接嵌入到引用它的项目中,可自动适配项目的平台上下文。

步骤:

  1. 创建一个共享项目(Visual Studio中新建项目时选择"共享项目")。
  2. 将你的通用工具代码放入共享项目中,配合方案1的条件编译指令处理命名空间差异。
  3. 分别在WPF和WinForms项目中添加对该共享项目的引用。

共享项目的好处是无需手动添加文件链接,所有引用项目都会自动同步共享项目中的代码变更。

内容的提问来源于stack exchange,提问作者oscar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:15:05