我估计有些朋友不清楚ActiveX控件,但这篇博客不是来解释这些概念的。如果你对ActiveX的概念不清楚,请参考这里: http://baike.baidu.com/view/28141.htm

这篇博客也不是讨论ActiveX是否有必要用的,因为这历来也是有些争议的。anyway, 我们这里只是探讨一下如何在.NET中也编写ActiveX控件,我用一个实例记录一下该过程

1. 创建一个类库项目,设置 Comvisible为true,设置AllowPartiallyTrustedCallers

为class也添加一个guid,注意这个要与assembly的那个不一样

设置该项目的一个属性: 为COM互操作注册

编译该项目,此时会自动在本机注册

2. 新建一个网页来使用该控件

在浏览器中打开该网页,此时会出现一个警告。正如你经常会看到的那样

点击右键,然后“允许阻止的内容”

点击页面上的“调用ActiveX”按钮,会出现下面的提示

点击“是”之后,就会调用我们写好的方法,显示出来“Hello,world”的文本

看起来不错对吧?你可能会问,怎么要这么麻烦来弹出一个Hello,World呢?这当然是一个演示。ActiveX控件典型的使用场合做一些复杂的客户端操作,例如文件批量上传等等。

我下面稍微修改一下控件

重新编译该项目之后,修改网页文件

在浏览器中再次打开该网页,点击按钮之后,会弹出选择文件的对话框

选择文件之后,单击“打开”

从这里可以看出来,ActiveX控件是在本地运行的,所以他可以做的事情很多。也正因为如此,它就势必也就存在安全方面的隐患。

3. 如何让浏览器信任我们的控件

上面的页面工作得很好,但是我们也看到了两次警告。这是不错的设计,因为要保护客户端的安全嘛。但如果在公司内部开发了一套ActiveX控件,每次都需要用户这样去用的话,显然也是不合适的。

那么,如何让IE识别我们的控件是安全的呢?

首先定义一个IObjecdSafety接口。这其实是一个COM接口,关于该接口,可以参考资料:http://msdn.microsoft.com/en-us/library/aa768224(VS.85).aspx

[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{

[PreserveSig]
    void GetInterfacceSafyOptions(
        int riid,
        out int pdwSupportedOptions,
        out int pdwEnabledOptions);

[PreserveSig]
    void SetInterfaceSafetyOptions(
        int riid,
        int dwOptionsSetMask,
        int dwEnabledOptions);

}

并且让我们的类型实现该接口

[Guid("6D2ECAC4-2D6B-4420-B19E-4CEFFA6AF280")]
public class MyActiveXControl:IObjectSafety
{
    public string HelloWorld() {
        return "Hello,world";
    }

public string SelectFileToUpLoad(string fileType) {
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = fileType;

if (dialog.ShowDialog() == DialogResult.OK) {
            return dialog.FileName;
        }

return "你没有选择文件";
    }

#region IObjectSafety 成员

public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
    {
        pdwEnabledOptions = 2;
        pdwSupportedOptions = 1;
    }

public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
    {
        throw new NotImplementedException();
    }

#endregion
}

再次运行页面,会发现下面这个提示没有了

但是,下面这个警告还是有的

出现这样的警告其实关系不大,提醒一下用户也是有好处的。

如果一定不想看到,那么可以尝试修改安全设置【但不建议这么做】

4. 如何在客户端安装呢?

首先制作一个安装包程序

接下来我们需要为这个安装程序签名。如果要真的有效,则需要向一下证书机构申请真正的证书,当然是要交上$若干。我们这里用一个测试用的证书

先制作一个证书

安装该证书,双击文件

点击“安装证书”

然后利用这个证书给setup.exe签名

 
“从文件选择”

最后修改一下页面

最后,请打开下面的地址进行测试 ,首先也会有一个警告提示说该ActiveX已经被阻止了。

我测试的结果是即便加入到信任站点也不行。我想原因估计是我们的证书是一个测试用的。

所以,可行的方式可能是将安装包单独提供下载(需要提供那个msi安装包给用户安装即可)

只要安装好了之后,以后访问该网页就不会提示了

原文:http://www.cnblogs.com/chenxizhang/archive/2009/11/27/1612233.html

.NET : 开发ActiveX控件(转载)的更多相关文章

  1. C#开发Activex控件(转载别人的只为再看时方便放在自己里边了)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能, 以增强浏览器端的动态处理能力.通常ActiveX控件都 ...

  2. 使用C#开发ActiveX控件

    使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...

  3. 使用C#开发ActiveX控件[Obsolete]

    文章出处:http://www.cnblogs.com/yilin/archive/2009/09/15/1567332.html 附件下载(源代码+安装文件+教程) 0. 前言 ActiveX控件以 ...

  4. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

  5. ATL开发 ActiveX控件的 inf文件模板

    ATL开发 ActiveX控件的 inf文件模板    

  6. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  7. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  8. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  9. [转] 使用C#开发ActiveX控件

    双魂人生 原文 使用C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内 ...

随机推荐

  1. r.js压缩打包(require + backbone)项目开发文件

    最近项目稳定了一点,之前一直没空关注的开发文件压缩打包问题也有时间来解决了 AMD模块化开发中的代码压缩打包工具——r.js 环境搭建基于nodejs:用于AMD模块化开发中的项目文件压缩打包,不是A ...

  2. ABAP SICF服务和Java Servlet的比较

    In my opinion ABAP ICF handler and Java Servlet play the same role in enhancement which enables your ...

  3. pg 关于不插入重复字段的方法

    首先在表的某列加入唯一约束 alter table language_pms add CONSTRAINT language_pms_unique unique(xml); insert into l ...

  4. 防护XSS

    http://blog.csdn.net/kouwoo/article/details/41946683 http://www.2cto.com/article/201309/247100.html ...

  5. Windows与kali双系统安装启动项的选择问题

    在安装kali的时候,选择了用linux的grub启动,但是在重启后发现启动项里已经没有Windows系统可以选择了. 网上资料说,进入kali的终端,输入以下命令: $ sudo update-gr ...

  6. [19/03/27-星期三] 容器_Iterator(迭代器)之遍历容器元素(List/Set/Map)&Collections工具类

    一.概念 迭代器为我们提供了统一的遍历容器的方式 /* *迭代器遍历 * */ package cn.sxt.collection; import java.security.KeyStore.Ent ...

  7. 12、SpringBoot-CRUD增加数据

    1.跳转至员工添加页面 上文的添加按钮: list.html <h2><a class="btn btn-sm btn-success" href="e ...

  8. 解决vuex requires a Promise polyfill in this browser问题

    造成这种现象的原因归根究底就是浏览器对ES6中的promise无法支持,因此需要通过引入babel-polyfill来是我们的浏览器正常使用es6的功能 首先通过npm来安装: npm install ...

  9. 一. Selenium介绍

    1. 什么是Selenium 是web自动化测试工具集,主要包括:IDE.Grid.RC(Selenium1.0).WebDriver(Selenium2.0) 与其他工具的不同: 一般的脚本测试工具 ...

  10. 【noip模拟赛 sword,zero,2048】 题解

    1.光剑 (sword.pas/c/cpp) [题目描述] 小林和亮亮各有一把光剑,长度分别为 a 和 b,他们拿光剑进行比试.每一回合,长光剑会砍向短光剑,砍完后,短光剑完好无损,而长光剑则被截成两 ...