專案原使用 WebBrowser (IE 內核) 並透過 ObjectForScripting 暴露 .NET 物件給 JavaScript 呼叫:
wb.ObjectForScripting = new MyClass();
標記 [ComVisible(true)] 後,前端即可 window.external.Test()。但目標網站對 IE 相容性極差,需尋找替代內核。
| 元件 | 引擎 | JS 物件傳遞支援 |
|---|---|---|
| GeckoFx | Firefox Gecko | 文檔缺乏、難以實作 |
| WebKit.NET | WebKit | 無內建 API |
| open-webkit-sharp | WebKit (二次封裝) | 提供 ScriptObject |
最終選擇 open-webkit-sharp。
Core 與 References 資料夾複製至專案目錄。Binary_NET2BinaryOpenWebKitSharp.dll,拖曳 WebKitBrowser 至表單。private void Form1_Load(object sender, EventArgs e)
{
this.webKitBrowser1.Navigate("https://your-site.com");
this.webKitBrowser1.DocumentCompleted += WebKitBrowser1_DocumentCompleted;
}
void WebKitBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
// 關鍵:透過 ScriptManager 暴露物件
this.webKitBrowser1.GetScriptManager.ScriptObject = new MyClass();
}
與 IE 相同,使用 window.external:
window.external.Test();
若想自訂名稱,可在載入完成後注入:
this.webKitBrowser1.GetScriptManager.EvaluateScript("var myObj = window.external;");
之後前端即可 myObj.Test()。
MyClass 標記 [ComVisible(true)] 且為 public。Core 資料夾是否隨輸出目錄複製。open-webkit-sharp 雖文檔較少,但成功解決了 IE 相容性與 JS 互呼叫的雙重需求。若有更佳方案歡迎交流。