博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

浏览器内嵌.NET控件技术架构(二)

Posted on 2011-09-18 01:55  肖敏  阅读(3009)  评论(0编辑  收藏  举报

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按钮,结果如下:

wps_clip_image-15365

如果点击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按钮效果如下:

wps_clip_image-5107

开发与调试技巧

如果.Net控件内部出现异常的话,比如没有提供默认的无参构造函数,该控件也会显示不出来,而且在浏览器中看不到任何提示,因此在开发过程中为了方便调试,我们可以再创建一个Windows项目,把控件拖到一个WinForm中进行调试。

为了让开发更加便利,我们可以在控件上增加一个标签显示当然程序集的版本号,并且让每次编译的Build号加1,这样我们可以通过版本号来判断加载的是不是最新的dll。如果嫌每次编译都要手动修改Build号麻烦的话,可以使用一个VS插件http://www.codeproject.com/KB/macros/versioningcontrolledbuild.aspx

wps_clip_image-15368

完整源码

/Files/xiaomin/DotNetHostWebSite3.rar