C#开发ActiveX控件在开发Web页面中是十分有用的下面提供了C#开发ActiveX控件操作指南供大家学习参考
前言
ActiveX控件以前也叫做OLE控件或OCX控件它是一些软件组件或对象可以将其插入到WEB网页或其它应用程序中使用ActiveX插件可以轻松方便的在 Web页中插入多媒体效果交互式对象以及复杂程序等等
通常使用C++或VB开发ActiveX控件本文探讨一下在Visual Studio 环境中使用C#开发ActiveX控件的技术实现
问题场景
在C/S架构的系统中客户端要实现某些业务功能可以通过安装相关的应用程序集来方便的实现同样的需求在B/S架构的系统里实现起来却比较困难因为所有的程序都放在服务器端客户端只是采用浏览器通过HTTP协议来访问服务器端比较成熟的解决办法是开发ActiveX控件安装到客户端这样客户端的浏览器就可以访问本地的ActiveX控件来执行相关的本地操作本文将要谈论的就是使用C#开发一个ActiveX控件实现读取并显示客户端的系统时间
开发环境
Windows XP
Visual Studio
NET Framework (C#)
实现过程
ActiveX控件开发
在Visual Studio 开发环境中可以使用Windows控件库项目实现ActiveX控件的开发但是需要对项目做一些必要的设置下面就来看看如何使用Windows控件库项目开发一个ActiveX控件首先创建一个应用程序解决方案并添加一个Windows控件库项目
)thisstylewidth=; border=>
更改项目属性应用程序程序集信息设置勾选使程序集 COM 可见
image onmousewheel=javascript:return big(this) title=使程序集COM可见 height= alt= hspace= src=http://imgeducitycn/img_///gif width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
更改项目属性生成设置勾选为 COM Interop 注册(注意此处如果实在debug状态下修改的那在调到release状态下还需要再设置一次)
image onmousewheel=javascript:return big(this) title=项目属性生成 height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
修改AssemblyInfocs文件添加[assembly: AllowPartiallyTrustedCallers()]项(需要引用SystemSecurity名称空间)
using SystemReflection;
using SystemRuntimeCompilerServices;
using SystemRuntimeInteropServices;
using SystemSecurity;
[assembly: AssemblyTitle(YilinPreresearchCSharpActiveX)]
[assembly: AssemblyDescription()]
[assembly: AssemblyConfiguration()]
[assembly: AssemblyCompany(BAR)]
[assembly: AssemblyProduct(YilinPreresearchCSharpActiveX)]
[assembly: AssemblyCopyright(Copyright ? BAR )]
[assembly: AssemblyTrademark()]
[assembly: AssemblyCulture()]
[assembly: AllowPartiallyTrustedCallers()]
[assembly: ComVisible(true)]
[assembly: Guid(dfcbacaecadcccaef)]
[assembly: AssemblyVersion()]
[assembly: AssemblyFileVersion()]
添加一个Windows用户控件
image onmousewheel=javascript:return big(this) title=添加一个Windows用户控件 height= alt= hspace= src=http://imgeducitycn/img_///gif width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
按照开发Windows用户控件一样的思路完成该控件的开发本例中主要实现了两个业务功能一个是提供一个公共方法用于读取USBKey中保存的签名证书保存到本地C盘根目录下并返回操作信息另一个业务功能提供UI界面包括一个Button控件和一个Label控件Button控件的Click事件调用前面提供的那个方法并将返回信息显示到Label控件上这样做可以达到两个目的其一ActiveX控件提供公共方法供B/S程序直接调用从后实现业务功能其二ActiveX控件可以提供B/S程序UI界面通过响应B/S程序中对UI的操作事件实现业务功能
完成控件开发后为了使该用户控件作为一个ActiveX控件进行使用还需要做以下修改
首先为控件类添加GUID这个编号将用于B/S系统的客户端调用时使用(可以使用 工具创建GUID 菜单创建一个GUID)
Guid(ACFEFAAEDAFFFAB)] public partial class Hello : UserControl
{
其次为了让ActiveX控件获得客户端的信任控件类还需要实现一个名为IObjectSafety的接口先创建该接口(注意不能修改该接口的GUID值)
using System;
using SystemCollectionsGeneric;
using SystemText;
using SystemRuntimeInteropServices;
namespace PreresearchCSharpActiveX
{
[ComImport GuidAttribute(CBBDCCCFFFCD)]
[InterfaceTypeAttribute(ComInterfaceTypeInterfaceIsIUnknown)]
public interface IObjectSafety
{
[PreserveSig]
int GetInterfaceSafetyOptions(ref Guid riid
[MarshalAs(UnmanagedTypeU)] ref int pdwSupportedOptions
[MarshalAs(UnmanagedTypeU)] ref int pdwEnabledOptions);
[PreserveSig()]
int SetInterfaceSafetyOptions(ref Guid riid [MarshalAs(UnmanagedTypeU)]
int dwOptionSetMask
[MarshalAs(UnmanagedTypeU)] int dwEnabledOptions);
}
}
然后在控件类中继承并实现该接口
#region IObjectSafety 成员
private const string _IID_IDispatch = {C};
private const string _IID_IDispatchEx = {aefcdacdcaa};
private const string _IID_IPersistStorage = {AC};
private const string _IID_IPersistStream = {C};
private const string _IID_IPersistPropertyBag = {DFCBCEAABB};
private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = x;
private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = x;
private const int S_OK = ;
private const int E_FAIL = unchecked((int)x);
private const int E_NOINTERFACE = unchecked((int)x);
private bool _fSafeForScripting = true;
private bool _fSafeForInitializing = true;
public int GetInterfaceSafetyOptions(ref Guid riid ref int pdwSupportedOptions
ref int pdwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riidToString(B);
pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
Rslt = S_OK;
pdwEnabledOptions = ;
if (_fSafeForScripting == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
Rslt = S_OK; pdwEnabledOptions = ;
if (_fSafeForInitializing == true)
pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
break;
default: Rslt = E_NOINTERFACE;
break;
}
return Rslt;
}
public int SetInterfaceSafetyOptions(ref Guid riid int dwOptionSetMask
int dwEnabledOptions)
{
int Rslt = E_FAIL;
string strGUID = riidToString(B);
switch (strGUID)
{
case _IID_IDispatch:
case _IID_IDispatchEx:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
Rslt = S_OK; break;
case _IID_IPersistStorage:
case _IID_IPersistStream:
case _IID_IPersistPropertyBag:
if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
Rslt = S_OK; break;
default: Rslt = E_NOINTERFACE;
break;
}
return Rslt;
}
#endregion 这样一个ActiveX控件就开发完成了
ActiveX控件部署
ActiveX控件可以使用Visual Studio 的安装项目进行部署这与普通的Windows Form应用程序的部署几乎一样只有一个地方需要注意将前面创建的用户控件项目作为主输出项目并设置其Register属性为vsdrpCOM如下图所示
image onmousewheel=javascript:return big(this) title=设置其Register属性为vsdrpCOM height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
测试
建立一个Web应用程序项目在测试页面的HTML代码中添加对ActiveX控件的引用并且可以通过Javascript调用控件的公共成员(注意这里clsid后面的值即为前面为用户控件类设置的GUID)
<object id=csharpActiveX classid=clsid:EECFCFBCED>
</object>
<input type=button onclick=alert(csharpActiveXSayHello()); value=显示当前时间 />
将该Web应用程序项目发布到IIS另外找一台电脑作为客户端测试环境确保它与服务器端网络连通安装NET Framework 和该ActiveX控件安装完成后就可以用浏览器访问服务器进行测试了(你也可以在开发环境的系统中安装该ActiveX控件并直接在VS 中运行WebApp项目查看结果)
image onmousewheel=javascript:return big(this) title=将该Web应用程序项目发布到IIS height= alt= hspace= src=http://imgeducitycn/img_///gif width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
总结
综上所述在Visual Studio 环境中使用C#开发ActiveX控件技术实现上没有什么难度唯一的问题就是客户端需要安装NET Framework鑒于ActiveX控件一般都是实现一些简单单一的功能NET Framework 已经完全可以应付所以建议在NET Framework 下开发因为相对于NET Framework 两百多兆的安装包NET Framework 安装包只有多兆用户相对容易接受一些
FAQ
出现如下错误怎么解决?
image onmousewheel=javascript:return big(this) title=错误 height= alt= hspace= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thisstylewidth=; border=>
经在网上查阅该问题是Visual Studio 的一个Bug并不是每次都发生我的解决办法是从Visual Studio 的安装目录里拷贝regcapexe覆盖Visual Studio 的对应文件文件目录一般为~\Microsoft Visual Studio \Common\Tools\Deployment\regcapexe压缩包中提供了该文件的Visual Studio 版本
读了本文应该对C#开发ActiveX控件的流程有个大致的了解了