C# WinForms WebBrowser与JavaScript双向通信实现
本文介绍在C# WinForms应用中,如何通过配置ComVisible属性和ObjectForScripting属性,实现C#后端代码与前端JavaScript脚本之间的双向通信。
核心原理与准备条件
C#的System.Windows.Forms.WebBrowser控件封装了IE内核,默认情况下出于安全考虑,托管代码不会直接暴露给页面的脚本环境。若要允许JavaScript调用C#方法,必须将宿主类显式标记为对COM可见(COM Visible),并将其实例赋给WebBrowser的ObjectForScripting属性。
反之,当需要从C#控制页面行为或获取数据时,可利用WebBrowser文档对象的InvokeScript方法主动执行页面上的JavaScript函数。
第1步:配置C#端可视性
首先,需要修改承载WebBrowser控件的窗体类(如Form1),添加[System.Runtime.InteropServices.ComVisible(true)]特性。这将确保该类及其公共方法可以被底层ActiveX/COM接口访问。
[System.Runtime.InteropServices.ComVisible(true)]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// 关键步骤:将当前窗体实例暴露给脚本引擎
webBrowser1.ObjectForScripting = this;
// 加载包含交互逻辑的HTML页面
webBrowser1.Navigate("about:blank");
}
}
第2步:编写JavaScript端交互逻辑
在HTML页面中,定义两个部分:一是供C#调用的函数;二是供用户触发、进而调用C#方法的入口。JS调用C#的方法必须挂载在window.external对象上。
- 供C#调用的方法: 直接定义普通函数即可。
- 供C#访问的属性: 必须是
Form1中的public成员。
<script type="text/javascript">
// 1. 提供给C#调用的方法
function callFromCS(number, text) {
alert('C#传来数据: ' + number + '/' + text);
}
// 2. C#中提供的方法,供JS调用
// 注意:此函数不需要显式声明在全局作用域的特殊处理,
// 只要Form1中有对应的public方法即可被window.external引用
window.external = { /* 实际引用由ObjectForScripting自动注入 */ };
function callCSharpMethod() {
try {
// 调用Form1中的 public string GetMessage() 或类似方法
var result = window.external.GetStatus();
alert('C#返回值: ' + result);
} catch (e) {
alert('调用失败: ' + e.message);
}
}
</script>
补充:C#侧必须实现的对应方法
为了配合上述JS调用,Form1中需要至少有一个public方法,例如:
public string GetStatus()
{
return "C# Status OK";
}
public void ProcessData(int id, string name)
{
MessageBox.Show($"ID: {id}, Name: {name}");
}
第3步:C#主动调用JavaScript
当需要在C#后台发起动作时(如初始化、数据更新),使用webBrowser1.Document.InvokeScript。该方法接受函数名和参数数组。
// 调用页面上的 callFromCS 函数
object[] args = new object[] { 100, "TestValue" };
webBrowser1.Document.InvokeScript("callFromCS", args);
注意事项
- 参数类型:
InvokeScript的参数数组应使用Object[]。基本类型会自动转换,但复杂对象或数组可能需要JSON序列化后作为字符串传递,或在JS端解析。 - 异常处理: JS调用C#若失败通常抛出COMException或运行时错误,建议JS端使用
try...catch包裹。 - 安全性:
ObjectForScripting仅对同源或本地文件有效,跨域场景下可能受限。
完成判断
点击页面上的按钮或C#触发动作后,若能弹出正确内容的提示框,说明双向通信已建立。此时可移除测试用的alert,替换为DOM操作或变量更新。
简要总结
实现C#与JS通信的关键在于[ComVisible(true)]设置与ObjectForScripting绑定。JS通过window.external.MethodName()调用C#,C#通过InvokeScript("func", args)调用JS。理解这一机制可有效提升桌面应用Web模块的交互体验。
以上就是C# WinForms中WebBrowser与JavaScript双向通信的详细内容,更多关于C# WebBrowser与JS互操作的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









