将自定义.NET控件嵌入IE浏览器

原创 2007年10月02日 15:50:00

 

利用Visual Studio .NET开发自定义的WinForm控件,恐怕大家都已经很熟悉了。正常情况下,这种控件只能用在基于.NETWindows Application程序开发上,而无法直接嵌入到IE,这不免让人感觉遗憾。 

毕竟.NET控件已经不同于在Win32下用DelphiC++Builder开发的自定义控件。基于.NET开发的任何受控装配件(Assembly)都是IL代码,可以在运行期被.NET FrameWork进行反射(Reflection)、安全检查。应该有办法让这种特殊控件被IE使用。  

经过几日的研究,终于找到一个方法可以将.NET WinForm自定义控件即用于普通的Windows Application开发,又可以将其当做ActiveX控件直接嵌入到IE中,同js脚本语言进行互动(客户端需要安装.NET FrameWork)。这无疑可以大大的节省客户端代码在WindowsWeb应用的移植工作,并保持控件代码的最大复用。  

原理为:.NET自定义控件没有普通ActiveXGUID唯一标示,同时为了解决以往版本冲突引起的“DLL地狱”问题,.NET控件不再向注册表进行类型的注册,而是不同的版本部署在应用程序当前目录或GACGloble Assembly Cache)中。.NET可以为.NET控件产生强名称的代理,从而提供给其他语言比如VBVCDelphi等调用。我们只需要在装配件文件(C#下为AssemblyInfo.cs)中就可以设置这些开关,也可以在VS.NET的项目属性中设置。这样.NET就可以为我们自动产生ClassLibrary对应的OLE对象特征。然后我们再创建ActiveX用到的事件接口、安全接口等。 

第一步――创建.NET自定义控件。

下面用Visual Studio.NET 2005 Professional为开发工具进行介绍。

    创建新项目,选择Windows Control Library。名称为默认的:WindowsControlLibrary1

    在界面中放置如下控件:TextBoxButton。这就是界面上所有的内容。双击界面中的Button控件,书写如下代码:

        private void button1_Click(object sender, EventArgs e)

        {

            StreamWriter bplStreamWriter = new StreamWriter(

                System.Environment.GetEnvironmentVariable("SystemDrive")+"//a.txt",

                true);

            bplStreamWriter.WriteLine(DateTime.Now.ToUniversalTime() +

                "/tInserted Text by .Net WinFormControl.");

            bplStreamWriter.Close();

        }

 

该部分代码表示在系统盘根目录下创建一个文件,并添加一行文本。为了能调用StreamWriter类,我们要添加System.IO名称空间。

同时添加自定义控件的属性:ButtonCaption

        [Category("自定义控件的属性")]

        [Description("设置按钮的文本内容")]

        public string ButtonCaption

        {

            get

            {

                return button1.Text;

            }

            set

            {

                button1.Text = value;

            }

        }

添加委托(delegate)并创建按键点击事件:

    // 声明按键点击事件类型

    public delegate void ButtonClickHandler(string SendMsg);

    public partial class UserControl1 : UserControl

    {

        // 声明按键点击事件

        public event ButtonClickHandler OnButtonClick;

 

在刚才的按钮点击函数中增加点燃事件的代码:

        private void button1_Click(object sender, EventArgs e)

        {

            ……

            if (OnButtonClick != null)

                OnButtonClick(textBox1.Text);

        }

增加公共方法SetText

        public void SetText(string text)

        {

            textBox1.Text = text;

        }

此时点击运行,可以利用VS.NET 2005自带的控件容器运行我们的控件。通过属性编辑器可以验证ButtonCaption属性。点击Button可以发现在系统盘创建文件,并添加了文本内容。您也可以新创建一个Windows Application项目,将这个控件加入后,测试其属性、事件和方法,这里就不介绍了。

上一篇我介绍了如何创建普通的.NET控件。为了能让.NET控件嵌入到IE中,这次我们来
为控件添加COM特性。

打开项目属性,在Application页面中点击“Assembly Information…”按钮,打开
Make assembly COM-Visible选项。

进入项目属性的Build页面,打开Register for COM interop选项。

保存配置后进行Build,此时的.NET控件已经具备普通OLE对象的特性。打开VS.NET自带
的OLE/COM对象查看器(默认目录为C:/Program Files/Microsoft Visual Studio
8/Common7/Tools/Bin/OleView.Exe)。我们可以在.NET Category下看到我们创建的控
件WindowsControlLibrary1.UserControl1。所有的信息已经被自动注册,包括控件的
强路径。

其实,此时的.NET控件已经可以放入IE了,只是还不能算是合格的ActiveX控件,但仍
然是合格的.NET控件。

我们编写一个htm文件来测试该控件。htm文件内容如下:

文本框: <HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
</HEAD>
<body bgcolor="#D8EEFB">
<OBJECT id="UserControl1"
classid="WindowsControlLibrary1.dll#WindowsControlLibrary1.UserControl1"
VIEWASTEXT></OBJECT>
<br><br><br><br>
<input type='button' value=' 调用方法' onclick='UserControl1.SetText("Hello
World!");'>
<br><br><br><br>
<input type='button' value=' 设置属性' onclick='UserControl1.ButtonCaption =
"Set";'>
</body>
</HTML>


将htm文件和WindowsControlLibrary1.dll部署在IIS的虚拟目录中,用浏览器浏览,就
可以看到如下效果。

虽然.NET控件可以被显示在IE中,但是.NET FrameWork能动态检查代码的安全性,因为
没有安全授权,不安全的代码将无法执行。比如点击按钮,我们可以得到如下提示。

有意思的是,只要该控件在装载时没有不安全代码,IE就不会有任何的提示,不同于IE
对加载ActiveX时的安全警告。这样说明IE对.NET的代码安全性是交给FrameWork处理
的。因此此类控件也有一种用处,就是不必数字签名,就可以加载显示在用户的IE浏览
器中,并顺利执行安全的受控代码。当然前提是用户需要安装.NET FrameWork。

此时我们还是没有得到一个真正的ActiveX控件,虽然它可以通过IIS发布在Web页面
中,也可以执行安全的代码。但存在如下局限性:无法发布到其他Web服务器上、无法
访问本地资源、js脚本无法响应控件的事件等。

下一篇我们将讨论.NET自定义控件如何实现所有的COM对象接口,包括属性、方法、事
件。并利用js脚本在Web页面中形成互动。



这次我们将讨论.NET自定义控件如何实现所有的COM对象接口,包括属性、方法、事件。并利用js脚本在Web页面中形成互动。

按照上一篇我们介绍的将.NET控件添加COM特性后,VS.NET已经自动注册了该控件的属性、方法和事件,只是还需要我们实现事件接口。

为了实现事件接口,我们需要添加如下代码:

    [ComVisible(true)]

    [Guid("43BCDB16-0281-487b-BB53-997546122442")]

    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

    public interface UserControl1Events

    {

        [DispId(0)]

        void OnButtonClick(string SendMsg);

    }

为了保证Guid的有效性,我们可以使用VS.NETCreate GUID工具创建。接口中的方法就是我们要触发的事件函数。该函数的声明要参照我们控件中的事件,名称必须保持一致。

        public event ButtonClickHandler OnButtonClick;

下一步我们就是要为我们的控件类创建Guid,并实现上面声明的事件接口。这里我们不要试图去实现事件接口,而是要用属性的方式去引用该COM接口。

    [Guid("FBA0FCC2-D75F-40a5-9C8C-1C9D03813731")]

    [ComSourceInterfaces(typeof(UserControl1Events))]

    public partial class UserControl1 : UserControl

    {

Build后我们已经得到一个具有公共属性、方法和事件的COM控件了。 

我们创建html文件来测试新的ActiveX控件,代码如下:

<HTML>

<HEAD>

  <meta http-equiv="Content-Type" content="text/html; charset=GBK">

</HEAD>

<script language='javascript' for='usercontrol1' event='OnButtonClick(Message)'>

     alert("响应ActiveX触发的事件成功。"+Message);

  window.defaultStatus = "OnButtonClick()";

</script>

 

<body>

<object id="usercontrol1" classid="clsid:FBA0FCC2-D75F-40a5-9C8C-1C9D03813731">

</object>

<br><br><br><br>

<input type='button' value=' 调用ActiveX方法' onclick='usercontrol1.SetText("Hello World!");'>

<br><br><br><br>

<input type='button' value=' 设置ActiveX属性' onclick='usercontrol1.ButtonCaption = "Set";'>

 

</HTML>

这次我们不再需要IIS,可以直接运行该html文件。可以得到下面的结果: 

我们的.NET控件已经可以象普通的ActiveX控件使用。同时,该.NET控件也可以继续被.NET Windows Application使用。(全篇完)

自定义浏览器控件

同自动化浏览器(http://blog.joycode.com/jiangsheng/archive/2005/10/20/65489.aspx)相比,自动化浏览器控件(WebBrowser Con...
  • wangweixing2000
  • wangweixing2000
  • 2008年05月26日 13:59
  • 2314

MFC程序添加Web浏览器控件(IE控件)

MFC程序添加Web浏览器控件(IE控件)       1. 新建一个基于对话框的MFC程序   这里使用VS2010建立一个MFC Application,种类选择基于对话框Dialog...
  • u011763045
  • u011763045
  • 2013年11月05日 00:17
  • 8212

QT OSG 浏览器插件 ,将OSG嵌入到IE中

关于OSG嵌入浏览器,王锐老师有过一篇文章。但是那篇文章是利用mfc,现如今mfc有点老态龙钟了。本文是使用QT,开发ActiveX插件,实现OSG嵌入QT。          关于QT版本,截止目前...
  • villean
  • villean
  • 2014年03月17日 09:34
  • 2270

【转载】WIN32 应用程序内嵌IE浏览器(注意非MFC)

直接上代码: 后面附带注释 (代码是我从网上搜下来的,然后经过我的机器调试,并且编译通过的) 本文用到了COM组件的相关知识,ATL的相关知识 #include CComModule ...
  • zhubosa
  • zhubosa
  • 2016年10月14日 16:39
  • 1072

三个基于.net的浏览器内核使用的比较

最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NE...
  • likey3
  • likey3
  • 2014年04月25日 19:28
  • 1102

卸载浏览器的控件

本文说明的是卸载IE浏览器的加载控件。 很多时候,控件是由浏览器经过用户的允许后,从服务器下载控件的安装文件并安装在客户端电脑的。从这以后,控件就被加载到浏览器的加载项,用户通过浏览器使用控件时,浏览...
  • jjavaboy
  • jjavaboy
  • 2014年12月20日 13:07
  • 775

vs2010开发activex(MFC)控件/ie插件(一)

vs2010制作基于mfc的ie插件
  • yhhyhhyhhyhh
  • yhhyhhyhhyhh
  • 2016年03月02日 20:35
  • 3802

JS日期选择器(兼容IE,Firefox,Opera等主流浏览器)

JS文件下载:   1. CSDN下载地址: http://download.csdn.net/detail/u013068377/8657779 程序截图: ...
  • u013068377
  • u013068377
  • 2015年05月03日 22:41
  • 1784

WIN764IE下,安装OCX插件

我们在Win7系统上浏览网页的时候,会遇到这样的情况,提示“您的Web浏览器已经阻止此站点不安全的ActiveX控件”的问题。出现这样的问题,是因为没有安装ActiveX控件,只要按照ActiveX控...
  • smith_work
  • smith_work
  • 2016年09月18日 10:36
  • 1151

单机情况下,IE浏览器访问activeX控件出现红叉问题的解决

本人也是刚接触activeX控件,自己通过vs2010编写了几个简单的例子,经测试工具测试过都可以用,在html文件添加之后如果双击文件用IE打开,会有加载控件之类的提示,但是在浏览器中输入url地址...
  • huangyz59420
  • huangyz59420
  • 2013年08月08日 22:39
  • 3199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:将自定义.NET控件嵌入IE浏览器
举报原因:
原因补充:

(最多只允许输入30个字)