首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForms 與 WebBrowser 互操作:HTML/JS 呼叫 C# 與 C# 呼叫 JS 完整指南

     編輯:關於C語言

WebBrowser 控制項 (基於 IE 内核) 提供 ObjectForScripting 機制,讓載入的網頁 JavaScript 能直接呼叫 C# 公開方法,C# 也能透過 InvokeScript 執行 JS 函式。本文完整示範雙向通訊實作。

關鍵設定

  1. 類別或 Form 標記 [ComVisible(true)]。
  2. 將提供給 JS 呼叫的物件指派給 webBrowser.ObjectForScripting。
  3. JS 呼叫 C#:window.external.方法名(參數)。
  4. C# 呼叫 JS:webBrowser.Document.InvokeScript("函式名", 參數陣列)。

完整範例程式碼

1. C# 端 (Form1.cs)


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();
    }
}

2. HTML/JS 端 (test.html)





    
    WebBrowser Interop Test
    


    

C# <=> JavaScript 雙向通訊測試





進階:使用獨立 Bridge 類別 (推薦)


// 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 回傳 nullJS 函式無 return 或執行錯誤JS 加 try/catch,確保有 return 值
頁面尚未載入完成就呼叫Document 為 null在 DocumentCompleted 事件後操作
IE 相容模式導致 JS 錯誤WebBrowser 預設用 IE7 模式註冊表設定 FEATURE_BROWSER_EMULATION 或頁面加 ``

現代替代方案

  • WebView2 (Edge Chromium):.NET Core/5+ 推薦,使用 CoreWebView2.WebMessageReceived / PostWebMessageAsJson 通訊,效能與相容性大幅提升。
  • CefSharp:Chromium 嵌入,功能豐富。

總結

透過 ComVisible + ObjectForScripting + InvokeScript,WinForms 與 WebBrowser 可實現無縫雙向互動。採用獨立 Bridge 類別是企業級應用的最佳實踐。新專案請優先考慮 WebView2。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved