使用C#开发ActiveX控件全攻略

 这段时间因为工作的需要,研究了一下ActiveX控件。总结如下:
    先说说ActiveX的基本概念。
    根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组件或对象,可以将其插入到WEB网页或其它应用程序中。
    ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM)。在有目录和其它支持的网络中,COM变成了分布式COM(DCOM)。在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。
    目前支持ActiveX的主要是IE浏览器。
    以前ActiveX开发普遍使用VC++或VB,随着C#和.net的发布,用C#开发ActiveX控件变得更方便、更简单。但需要注意的是用C#开发的ActiveX控件需要客户机装有.net framework,有点郁闷。可是相对.net强大的功能良好的易用性,这点牺牲还是值得的,况且现在好多计算机已经安装有.net framework了。
    其实.net下的winform控件也是可以直接嵌入到web网页里的,但是由于.net安全性的限制,无法在客户端实现复杂的操作,比如磁盘空间操作和注册表操作。因为ActiveX控件是以本地用户的身份运行,可以突破.net安全性的限制,所以开发ActiveX控件还是很必要的。
    C#写ActiveX控件的原理很简单,就是使用了.net平台和COM的互操作性。修改项目属性的目的就是将.net控件注册为com。这样,你就可以把这个控件完全当作ActiveX控件来对待了。比如,可以使用JS和VBS来调用,也可以使用C++来调用。
    下面一步步来实现C#写ActiveX控件。
第一部分:用vs2008制作一个winForm控件
    用vs2008建立一个新的“windows窗体控件库”命名为“WindowsFormsControlLibrary1”如下图

点击确定后,将UserControl1.cs更名为demo.cs。向界面里添加一个Labal、一个TextBox和一个Button,相应的修改控件属性。如下图:

    为button1添加Click事件,代码如下:
private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = textBox1.Text;
        }
    在AssemblyInfo.cs中引用System.Security命名空间,并添加一句:
[assembly : AllowPartiallyTrustedCallers()]
    好,现在编译整个工程,生成/bin/Debug/WindowsFormsControlLibrary1.dll,我们的winform控件就做好了。
    下面在解决方案里添加一个web应用程序的工程,名为WebApplication1,用来测试我们的控件。
    将WindowsFormsControlLibrary1.dll拷贝到WebApplication1所在的目录下。然后在Default.aspx里面加入“<object id="helloworld" classid='http://localhost:59639/WindowsFormsControlLibrary1.dll#WindowsFormsControlLibrary1.demo' width="184" height="96" >
    </object>
    ok,编译运行后你将看到如下界面:

 
第二部分:把这个winForm控件转换为ActiveX控件
    到目前为止,我们所实现的只是winform控件,还不是真正的ActiveX控件。
    鼠标右键,打开WindowsFormsControlLibrary1的工程属性,在“应用程序”里点击“程序集信息...”显示如下界面:

    选中“使程序集COM可见”,然后确定。
    进入“生成”页面,如下图:

    选中“为COM互操作注册”。
    重新编译工程,这时WindowsFormsControlLibrary1.dll就变成了一个ActiveX控件。
    我们使用 工具—〉OLE/COM对象查看器 查看,如图:
   
    WindowsFormsControlLibrary1.demo已经被正确识别为COM组件。现在,我们已经可以像使用其它ActiveX控件一样在网页中显示了。在WindowsFormsControlLibrary1.demo点击鼠标右键,选择Copy HTML <object> Tag to Clipboard,可以将代码拷入剪贴板。
    我们在 Default.aspx  中粘贴剪贴板的内容,如下:
     <object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F"
            width="184"
            >
        </object>
编译运行整个工程,我们会在网页中看到之前的内容。好,现在我们的控件已经是货真价实的ActiveX控件了。
 
第三部分:实现ActiveX控件与网页的交互
    我们在Demo中加入s1属性:
        private string _s1;
        public string s1
        {
            get
            {
                return _s1;
            }
            set
            {
                _s1 = value;
            }
        }
    我们在Demo中加入ShowMessage方法:
    public void showMessage()
        {
            MessageBox.Show(_s1);
        }
    修改Default.aspx  中的内容:
        <object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F"
            width="184"
            >
            <param  name="s1" value="用param传递控件属性"/>  
        </object>
        <input type='button' οnclick='helloworld.ShowMessage()' value='用param传递控件属性'/>
        <input type='button' οnclick='helloworld.s1="用js和控件交互"; helloworld.ShowMessage()' value='用js和控件交互'/>
    好,编译运行整个工程,显示如下:

    点击单击“用js和控件交互”按钮,应该可以实现交互了。  
    但是结果却很遗憾,我们发现IE跳出了对话框,如图所示
  
    这时我们通过修改IE安全属性“对没有标记为安全的ActiveX控件进行初始化和运行”可以绕过这个问题,但是要真正解决需要实现IObjectSafety接口,把ActiveX控件标记为安全的ActiveX控件。
    首先在工程里添加一个接口,命名为IObjectSafety.cs,代码如下:
using System;
using System.Runtime.InteropServices;
namespace WindowsFormsControlLibrary1
{
    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        void GetInterfacceSafyOptions( System.Int32 riid,out System.Int32 pdwSupportedOptions, out System.Int32 pdwEnabledOptions);
        void SetInterfaceSafetyOptions( System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions); 
    }
}
  注意添加命名空间“using System.Runtime.InteropServices”,Guid一定不能搞错。
    然后在demo类里添加继承,如下:
    public partial class demo : UserControl, WindowsFormsControlLibrary1.IObjectSafety
    {...}
    最后在demo类里实现两个特定方法:
        public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
        {
            // TODO:  添加 WebCamControl.GetInterfacceSafyOptions 实现 
            pdwSupportedOptions = 1;
            pdwEnabledOptions = 2;
        }
        public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
        {
            // TODO:  添加 WebCamControl.SetInterfaceSafetyOptions 实现             
        }
    重新编译,然后将IE里面的设置改回来。现在,我们发现,和JS的交互已经没有问题了。
    在前面我们已经完成了ActiveX控件的开发,接下来的就是发布它了。
第四部分:制作安装包
     在解决方案了添加一个“安装”项目,命名为SetupActiveX。
     在项目的“应用程序文件夹”里添加“主输出项目”WindowsFormsControlLibrary1
     将主输出项目”WindowsFormsControlLibrary1的Register属性改为vsdrpCOM.如图:

    现在我们生成安装程序,并把相应得程序拷贝到正确的目录中(本例中为默认网站目录下的跟文件夹中)。
现在我们又要重新改动Default.aspx  文件了。修改后的结果如下: 
    <div>
        <object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F"
            width="184"
            codebase="Setup.exe"
            >
            <param  name="s1" value="用param传递控件属性"/>  
        </object>
        <input type='button' οnclick='helloworld.ShowMessage()' value='用param传递控件属性'/>
        <input type='button' οnclick='helloworld.s1="用js和控件交互"; helloworld.ShowMessage()' value='用js和控件交互'/>
    </div>
    注意,我们在object块中加入了codebase属性,这就是制定的下载控件的位置,可以使用相对路径。
    但是,我们现在还不能正确请求这个页面,因为我们还没有对我们的控件进行签名。为了绕过这个问题,我们可以修改IE的安全属性"对没有标记为安全的ActiveX控件进行初始化和脚本运行"和"下载未签名的ActiveX控件"。
 
    下面两部分明天接着写。。。。。
 
第五部分:给安装包签名
 
第六部分:部署


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/TemateRoom/archive/2010/02/02/5276250.aspx

专为程序员设计的数学课

11-11
<p> 限时福利限时福利,<span>15000+程序员的选择!</span> </p> <p> 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! </p> <p> <br> </p> <p> 套餐中一共包含5门程序员必学的数学课程(共47讲) </p> <p> 课程1:《零基础入门微积分》 </p> <p> 课程2:《数理统计与概率论》 </p> <p> 课程3:《代码学习线性代数》 </p> <p> 课程4:《数据处理的最优化》 </p> <p> 课程5:《马尔可夫随机过程》 </p> <p> <br> </p> <p> 哪些人适合学习这门课程? </p> <p> 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; </p> <p> 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; </p> <p> 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; </p> <p> 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; </p> <p> 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 </p> <p> <br> </p> <p> 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些:<br> <br> <span> </span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">①价值300元编程课程大礼包</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">②应用数学优化代码的实操方法</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">③数学理论在编程实战中的应用</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">④程序员必学的5大数学知识</span> </p> <p class="ql-long-24357476"> <span class="ql-author-24357476">⑤人工智能领域必修数学课</span> </p> <p> <br> 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。<br> <br> 如何听课? </p> <p> 1、登录CSDN学院 APP 在我的课程中进行学习; </p> <p> 2、登录CSDN学院官网。 </p> <p> <br> </p> <p> 购课后如何领取免费赠送的编程大礼包和加入答疑群? </p> <p> 购课后,添加助教微信:<span> csdn590</span>,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流! </p> <p> <img src="https://img-bss.csdn.net/201912251155398753.jpg" alt=""> </p>
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值