c#

位置:IT落伍者 >> c# >> 浏览文章

用C#编写ActiveX控件


发布日期:2019年03月15日
 
用C#编写ActiveX控件
首先建立一个WinForm控件项目HelloWorld并拖入一个Label控件文字设为HelloWorld如图

UserControlcs内容如下

usingSystem;

usingSystemCollections;

usingSystemComponentModel;

usingSystemDrawing;

usingSystemData;

usingSystemWindowsForms;

namespaceHelloWorld

{

/**////<summary>

///UserControl的摘要说明

///</summary>

publicclassDemo:SystemWindowsFormsUserControl

{

privateSystemWindowsFormsLabellabel;

/**////<summary>

///必需的设计器变量

///</summary>

privateSystemComponentModelContainercomponents=null;

publicDemo()

{

//该调用是WindowsForms窗体设计器所必需的

InitializeComponent();

//TODO:在InitComponent调用后添加任何初始化

}

/**////<summary>

///清理所有正在使用的资源

///</summary>

protectedoverridevoidDispose(booldisposing)

{

if(disposing)

{

if(components!=null)

componentsDispose();

}

baseDispose(disposing);

}

组件设计器生成的代码#region组件设计器生成的代码

/**////<summary>

///设计器支持所需的方法不要使用代码编辑器

///修改此方法的内容

///</summary>

privatevoidInitializeComponent()

{

thislabel=newSystemWindowsFormsLabel();

thisSuspendLayout();

//

//label

//

thislabelLocation=newSystemDrawingPoint();

thislabelName=label;

thislabelSize=newSystemDrawingSize();

thislabelTabIndex=;

thislabelText=HelloWorld;

thislabelTextAlign=SystemDrawingContentAlignmentMiddleCenter;

//

//Demo

//

thisControlsAdd(thislabel);

thisName=Demo;

thisSize=newSystemDrawingSize();

thisResumeLayout(false);

}

#endregion

}

}

此时编译项目可以生成HelloWorlddll将此dll拷贝到IIS的虚拟根目录下然后建立一个的文件html代码如下

<bodybgcolor=#>

<objectid=helloworldclassid=#HelloWorldDemoWidth=Height=VIEWASTEXT></object>

</body>

在IE地址栏中输入以下地址出现界面

如图控件已经成功在页面上显示了OK我们已经完成了第一步

但是问题到这里还没有解决不相信?你可以试试在另外一台机器上测试注意需要修改对应的html代码和URL地址你可以看到这个在原来显示控件的地方是一个红色的叉或者还会弹出一个对话框表示这个控件没有任何权限出现这个结果是微软的默认设置造成的作者必须在控件所在的控件的 AssemblyInfocs/vb 中执行一个安全声明声明这个控件必须使用赋予的权限才可以显示出界面我们在AssemblyInfocs中引用SystemSecurity命名空间并添加一句

[assembly:AllowPartiallyTrustedCallers()]

现在重新编译并且替换以前的dll界面又可以显示出来了

需要提醒的是到现在为止我们编写的还不是真正的ActiveX控件这个控件到现在为止还只是能够实现自身的显示并且不能实现更多的功能比如实现与脚本的交互或者操作客户端的注册表或者磁盘这是由于Net Framework的安全模型所限制的如果我们希望这个控件突破Net Framework安全模型的限制实现与脚本的交互或者操作客户端的注册表或者磁盘的话必须要让它成为真正的ActiveX控件下面我们把刚才的控件变成真正的ActiveX控件

首先使用 工具—〉创建GUID 生成一个GUID并修改UserControlcs文件首先增加引用SystemRuntimeInteropServices命名空间并在Demo前面加入一条语句

注意Guid中的字符串就是你生成的Guid字符串它是你所生成的ActiveX控件的唯一标识符然后修改项目属性如图

注意面板中的最后一项我们唯一需要修改的是将其值改为True

重新编译我们使用 工具—〉OLE/COM对象查看器 查看如图

可以看到我们写的HelloWorldDemo已经被正确识别为COM组件现在我们已经可以像使用其它ActiveX控件一样在网页中显示了在HelloWorldDemo点击鼠标右键如图

选择Copy HTML <object> Tag to Clipboard可以将代码拷入剪贴板

现在我们改写html代码如下

<bodybgcolor=#>

<objectid=helloworld

classid=clsid:BBCDDEAWidth=Height=>

</object>

</body>

使用IE查看我们的控件又可以在网页中显示了不过这个时候它已经不再是以前WinForm控件了而是货真价实的ActiveX控件了

我们在Demo中加入ShowMessage方法

publicvoidShowMessage(stringmsg)

{

if(msg!=null)

{

MessageBoxShow(msg);

}

}

我们重新编译在重新访问页面之前我们先来修改html代码

<bodybgcolor=#>

<objectid=helloworld

classid=clsid:BBCDDEAWidth=Height=

>

</object>

<br>

<inputtype=buttononclick=helloworldShowMessage(HelloWorld!)value=Click>

</body>

现在重新访问单击Click按钮应该可以实现交互了

但是结果却很遗憾我们发现IE跳出了对话框如图所示

单击确定之后我们发现JS报错根据提示我们判断可以通过修改IE的设置使控件运行打开IE的 工具——〉Internet选项——〉安全——〉本地Intranet——〉自定义级别——〉对没有标记为安全的ActiveX控件进行初始化和运行将其值设为启用我们刷新页面现在终于可以正确运行了

当然我们不能指望我们的客户和我们一样修改这个值毕竟一是操作麻烦二是给电脑带来了很大的安全风险在互联网上搜索之后发现必须要实现IObjectSafety接口把ActiveX控件标记为安全的ActiveX控件在搜索MSDN之后我找到了IObjectSafety接口的定义这就好办了首先我们自己用C#实现这个接口

[Guid(CBBDCCCFFFCD)InterfaceType(ComInterfaceTypeInterfaceIsIUnknown)]

publicinterfaceIObjectSafety

{

//methods

voidGetInterfacceSafyOptions(

SystemIntriid

outSystemIntpdwSupportedOptions

outSystemIntpdwEnabledOptions);

voidSetInterfaceSafetyOptions(

SystemIntriid

SystemIntdwOptionsSetMask

SystemIntdwEnabledOptions);

}

注意这个GUID是不能改的然后我们在Demo类里面实现这个接口增加一下代码

IObjectSafety成员#regionIObjectSafety成员

publicvoidGetInterfacceSafyOptions(IntriidoutIntpdwSupportedOptionsoutIntpdwEnabledOptions)

{

//TODO:添加WebCamControlGetInterfacceSafyOptions实现

pdwSupportedOptions=;

pdwEnabledOptions=;

}

publicvoidSetInterfaceSafetyOptions(IntriidIntdwOptionsSetMaskIntdwEnabledOptions)

{

//TODO:添加WebCamControlSetInterfaceSafetyOptions实现

}

#endregion

重新编译然后将IE里面的设置改回来现在我们发现和JS的交互已经没有问题了

在前面我们已经完成了ActiveX控件的开发接下来的就是发布它了

首先我们建立一个windows安装项目并将ActiveX控件的主输出添加到项目输出中然后改动ActiveX控件的主输出文件将其Register属性改为vsdrpCOM如图:

下一步我们改动项目属性将引导程序更改为 Web引导程序很遗憾的是在 Web引导程序设置 中的安装文件夹URL中必须使用绝对路径不能使用相对路径这意味着生成安装程序的时候就必须确定路径不是很方便在示例中我使用了localhost在发布中可以改为实际的域名

现在我们生成安装程序并把相应得程序拷贝到正确的目录中(本例中为默认网站目录下的ActiveX文件夹中)我们可以直接执行SetupExe文件以验证安装文件的正确性在我的机器上正确执行了成功了!

现在我们又要重新改动文件了修改后的结果如下

<body bgcolor=#>

<object id=helloworld

classid=clsid:BBCDDEA Width= Height= codebase=ActiveX/SetupExe

>

</object>

<br>

<input type=button onclick=helloworldShowMessage(Hello World!) value=Click>

</body>

注意我们在object块中加入了codebase属性这就是制定的下载控件的位置可以使用相对路径别忙我们现在还不能正确请求这个页面因为我们还没有对我们的控件进行签名签名可以采用两种方式一种是在上面生成安装程序的时候签名另一种是使用snexe签名推荐大家使用后者因为可以提供更多选项本人很懒就不多写了大家可以参考csdn上的文章《发布ActiveX》先给给大家提个醒在申请证书的时候选择 高级证书申请

               

上一篇:如果.Net架构网站遇到大表该怎么办?

下一篇:C#中路径的几种获取方法及其区别