WebBrowser 控制項 (基於 IE 内核) 提供 ObjectForScripting 機制,讓載入的網頁 JavaScript 能直接呼叫 C# 公開方法,C# 也能透過 InvokeScript 執行 JS 函式。本文完整示範雙向通訊實作。
[ComVisible(true)]。webBrowser.ObjectForScripting。window.external.方法名(參數)。webBrowser.Document.InvokeScript("函式名", 參數陣列)。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WebBrowserInteropDemo
{
[ComVisible(true)] // 關鍵:允許 COM 可見
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 載入本地測試頁
string path = Path.Combine(Application.StartupPath, "test.html");
webBrowser1.Url = new Uri(path);
// 將 Form1 本身 (或獨立類別) 公開給 JS
webBrowser1.ObjectForScripting = this;
}
// C# 供 JS 呼叫的方法
public void ShowMessageFromJs(string msg)
{
MessageBox.Show($"JS 呼叫 C#:{msg}", "跨語言通訊");
}
public void OpenChildForm()
{
new Form2().Show();
}
// C# 主動呼叫 JS 的按鈕事件
private void btnCallJs_Click(object sender, EventArgs e)
{
object[] args = { "這是來自 C# 的訊息 " + DateTime.Now };
webBrowser1.Document?.InvokeScript("showAlert", args);
}
}
// 建議:將 COM 介面獨立為專用類別,避免 Form 過度暴露
[ComVisible(true)]
public class JsBridge
{
private readonly Form1 _owner;
public JsBridge(Form1 owner) => _owner = owner;
public void Log(string msg) => _owner.AppendLog(msg);
public void CloseApp() => _owner.Close();
}
}
WebBrowser Interop Test
C# <=> JavaScript 雙向通訊測試
// Form1_Load 改為:
var bridge = new JsBridge(this);
webBrowser1.ObjectForScripting = bridge;
// HTML 中呼叫:
// window.external.Log("訊息")
// window.external.CloseApp()
優點:職責分離、易測試、避免 Form 公開過多內部方法、支援多個 WebBrowser 共用橋接器。
| 問題 | 原因 | 解決 |
|---|---|---|
| JS 呼叫 C# 無反應/報錯 | 未設定 ComVisible(true) 或 ObjectForScripting | 檢查類別與屬性設定 |
| 參數傳遞失敗 | JS 物件無法直接序列化為 C# 類型 | 僅傳基本型別 (string, number, bool) 或 JSON 字串再反序列化 |
| InvokeScript 回傳 null | JS 函式無 return 或執行錯誤 | JS 加 try/catch,確保有 return 值 |
| 頁面尚未載入完成就呼叫 | Document 為 null | 在 DocumentCompleted 事件後操作 |
| IE 相容模式導致 JS 錯誤 | WebBrowser 預設用 IE7 模式 | 註冊表設定 FEATURE_BROWSER_EMULATION 或頁面加 `` |
CoreWebView2.WebMessageReceived / PostWebMessageAsJson 通訊,效能與相容性大幅提升。透過 ComVisible + ObjectForScripting + InvokeScript,WinForms 與 WebBrowser 可實現無縫雙向互動。採用獨立 Bridge 類別是企業級應用的最佳實踐。新專案請優先考慮 WebView2。