許多開發者好奇 360 軟體管家、安全衛士等產品的華麗介面是用何技術實現。本文分析其核心架構:以 C++/C# 為宿主,內嵌 WebBrowser (IE 內核) 或 CEF (Chromium 內核) 控件,載入本地/遠端 HTML5+CSS3+JS 頁面構建 UI,並透過 ObjectForScripting / JSBridge 實現前後端雙向通訊。
+---------------------+ COM/Interop +--------------------------+ | Native Host App | <-----------------> | WebBrowser / CEF Control | | (C++ MFC / C# WPF) | JSBridge / | (HTML5 + CSS3 + JS UI) | | - 業務邏輯 | ObjectForScripting | - 介面渲染 | | - 系統介面調用 | | - 動畫/特效 | +---------------------+ +--------------------------+
| 方案 | 宿主語言 | 內核 | 優點 | 缺點 |
|---|---|---|---|---|
| MFC + WebBrowser (IE) | C++ | MSHTML (IE7~11) | 零依賴、系統自帶、相容舊專案 | IE 內核老舊、CSS3/ES6 支援差、安全風險 |
| C# WinForms/WPF + WebBrowser | C# | MSHTML | 開發效率高、Managed 互調容易 | 同 IE 內核缺點 |
| C++/C# + CEF (Chromium Embedded Framework) | C++/C# | Chromium (最新) | 現代 Web 標準完整支援、效能強、跨平台 | 體積大 (~100MB)、整合複雜、授權 LGPL |
| C# + WebView2 (Edge/Chromium) | C# | Edge (Chromium) | 系統級 Evergreen 更新、體積小、官方支援 | 需 Win10 1803+、較新技術文較少 |
// Form1.cs
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
webBrowser1.ObjectForScripting = new Bridge(this); // 註入 C# 物件給 JS
webBrowser1.DocumentText = GetHtml(); // 載入本地 HTML 字串
// 或 webBrowser1.Url = new Uri("file:///C:/ui/index.html");
}
// 供 JS 呼叫
public void ShowMessage(string msg) {
MessageBox.Show("JS 說: " + msg);
}
// C# 主動呼叫 JS
private void btnCallJs_Click(object sender, EventArgs e) {
webBrowser1.Document.InvokeScript("updateTitle", new object[] { "來自 C# 的標題" });
}
}
// 橋接類別需標記 ComVisible
[System.Runtime.InteropServices.ComVisible(true)]
public class Bridge {
private Form1 _form;
public Bridge(Form1 form) { _form = form; }
public void NotifyReady() { _form.ShowMessage("頁面載入完成"); }
}
<!-- 內嵌 HTML 範本 -->
<html>
<head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /></head>
<body>
<h1 id="title">360 風格標題</h1>
<button onclick="window.external.NotifyReady()">通知 C#</button>
<script>
function updateTitle(text) { document.getElementById('title').innerText = text; }
// 頁面載入後主動通知
window.external.NotifyReady();
</script>
</body></html>
<meta http-equiv="X-UA-Compatible" content="IE=Edge"> 強制使用最高版本 IE 內核渲染,否則預設 IE7 模式會導致 CSS3 失效。webBrowser1.ScriptErrorsSuppressed = true; 避免 JS 錯誤彈窗干擾。webBrowser1.Dispose(),並解除事件訂閱。dpiAware,或使用 WebView2 獲得原生支援。
新專案優先採用 WebView2 (C#/C++) 或 CEF:
360 系產品介面本質上是「原生殼 + Web 內核」的混合架構。早期借助 WebBrowser (IE) 快速構建華麗 UI,現代開發應轉向 WebView2 或 CEF 以獲得最佳相容性、效能與安全性。核心關鍵在於建立穩健的 JSBridge 讓前後端無縫協作。