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

C# WinForm 與 WebBrowser 控制項雙向互動完整指南

     編輯:關於C#

架構概述

WinForm 專案嵌入 WebBrowser 控制項 (基於 IE 核心),常需雙向呼叫:
1. C# 呼叫網頁內 JavaScript 函數
2. JavaScript 呼叫 C# 公開方法

前置需求:類別標記為 COM 可見


using System.Security.Permissions;
using System.Runtime.InteropServices;

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[ComVisible(true)]
public partial class MainForm : Form
{
    // ...
}

缺少此兩行屬性,JS 無法呼叫 C# 方法。

C# 呼叫 JavaScript


// 網頁端 JS
function ShowAlert(msg) { alert("C# 呼叫: " + msg); }

// C# 端呼叫
webBrowser1.Document.InvokeScript("ShowAlert", new object[] { "Hello from C#" });
  • InvokeScript 參數:函數名稱、引數陣列 (對應 JS 參數順序)。
  • 需確保 webBrowser1.Document 不為 null (頁面載入完成後呼叫,可在 DocumentCompleted 事件中)。

JavaScript 呼叫 C#


// C# 公開方法 (需標記 ComVisible)
public void ReceiveFromJS(string message)
{
    MessageBox.Show($"JS 呼叫: {message}");
}

// 網頁端 JS
function CallCSharp() {
    window.external.ReceiveFromJS("Hello from JS");
}
  • JS 透過 window.external 存取 C# 公開的公用方法。
  • 方法必須為 public、非靜態、類別已標記 [ComVisible(true)]。
  • 參數型別建議使用基本型別 (string, int, bool) 或 COM 可序列化型別。

完整事件綁定範例


private void MainForm_Load(object sender, EventArgs e)
{
    webBrowser1.DocumentCompleted += (s, args) =>
    {
        // 頁面載入完成後可安全呼叫 JS
        webBrowser1.Document.InvokeScript("initPage", new object[] { "參數" });
    };
    webBrowser1.Navigate("https://example.com/page.html");
}

常見問題與解決

問題原因解決
InvokeScript 回傳 "Object doesn't support this property"JS 函數名錯誤或頁面未載入完成確認函數名、在 DocumentCompleted 後呼叫
JS 呼叫 C# 無反應/報錯類別未標記 ComVisible / 方法非 public加上 [ComVisible(true)]、確保 public 實例方法
跨網域腳本錯誤載入的頁面網域與應用程式不同源設定 WebBrowser 信任區域、或使用 WebView2 (Edge 核心)
WebBrowser 為 IE 核心,相容性差IE 11 已停止更新,無法支援現代 JS/CSS**強烈建議遷移至 WebView2 (Microsoft.Web.WebView2)**

現代替代方案:WebView2


// NuGet: Microsoft.Web.WebView2
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;

var webView = new WebView2();
await webView.EnsureCoreWebView2Async();
webView.CoreWebView2.AddHostObjectToScript("csharpBridge", new BridgeClass());
webView.CoreWebView2.Navigate("https://example.com");

WebView2 使用 Edge (Chromium) 核心,支援現代 Web 標準,JS 呼叫 C# 透過 AddHostObjectToScript,C# 呼叫 JS 透過 ExecuteScriptAsync,架構更清晰、安全、效能優異。

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