3. 使用javascript调用.Net对象
使用javascript调用.Net控件
在网页中,对于任何一个DOM对象,我们都可以使用document.getElementById方法获取该对象然后对它进行操作。而对于嵌入的.Net对象其实是一样的。
我们在前面的例子的基础上,给HelloIE控件增加一个函数
public void SendMessage(string text)
{
this.label1.Text = text;
}
然后在页面中增加一个按钮,为按钮增加一个响应函数,获取HelloIE控件对象,并调用SendMessage函数。
<input id="Button1" type="button" onclick="SendMessageToWinControl();" value="Call SendMessage" />
<script type="text/javascript">
function SendMessageToWinControl()
{
var winCtrl = document.getElementById("HelloIE");
winCtrl.SendMessage("Message sent from the HTML page!!");
}
</script>
重新编译,然后打开一个新的浏览器浏览,点击Call SendMessage按钮,结果如下:
如果点击Call SendMessage按钮后出现脚本错误“对象不支持此属性或方法”,是因为HelloIE控件类缺少一个最关键的代码:为该类添加[ComVisible(true)]属性。这也充分说明了该控件与IE的交互其实就是COM组件之间的通信,只不过是多经过一个中介:脚本引擎而已。
每次重新编译程序以后,一定要开一个新的浏览器,启动一个新的进程,才能把新的dll加载进来。如果只是使用刷新页面,浏览器依然会使用已经加载的旧的dll。
使用javascript调用非可视化.Net对象
可以嵌入网页的不仅仅是控件,所有的.Net类都可以。我们增加一个MathClass类,增加一个方法返回PI值。
[ComVisible(true)]
public class MathClass
{
public double GetPI()
{
return Math.PI;
}
}
然后在页面中嵌入MathClass,增加一个按钮,点击显示PI值
<object id="MathClass" classid="http:bin/WindowsFormsControlLibrary.dll#WindowsFormsControlLibrary.MathClass" height="0" width="0" ></object>
<input id="Button2" type="button" onclick="GetPi();" value="Call MathClass" />
<script type="text/javascript">
function GetPi()
{
var winCtrl = document.getElementById("MathClass");
var pi=winCtrl.GetPI();
alert(pi);
}
</script>
重编译项目,点击Call MathClass按钮效果如下:
开发与调试技巧
如果.Net控件内部出现异常的话,比如没有提供默认的无参构造函数,该控件也会显示不出来,而且在浏览器中看不到任何提示,因此在开发过程中为了方便调试,我们可以再创建一个Windows项目,把控件拖到一个WinForm中进行调试。
为了让开发更加便利,我们可以在控件上增加一个标签显示当然程序集的版本号,并且让每次编译的Build号加1,这样我们可以通过版本号来判断加载的是不是最新的dll。如果嫌每次编译都要手动修改Build号麻烦的话,可以使用一个VS插件http://www.codeproject.com/KB/macros/versioningcontrolledbuild.aspx
完整源码