activex控件:ActiveXControl控件开发
疯狂代码http://CrazyCoder.cn/?:http:/CrazyCoder.cn/DotNet/Article49166.html
要使用C#实现个ActiveXControl控件需要解决3个问题:
1.使.NET组件能够被COM
2.在客户机上注册后ActiveXControl控件能通过IE安全认证
3.未在客户机上注册时安装包能通过IE签名认证
本开发环境是.NETFramework3.5工具是VisualStudio.NET2008在安装.NETFramework3.5客户机上
通过测试
下面是实现步骤:
()创建可从COM访问集
首先实现个对COM可见集创建类库工程AssemblyInfo.cs应包含:
using.Runtime.InteropServices;
//使此集中类型对COM组件可见
[assembly:ComVisible(true)]
//如果此项目向COM公开则下列GUID用于类型库ID
[assembly:Guid("94882155-3B7C-48e3-B357-234D56D8F15E")]
加入以下代码到AssemblyInfo.cs确保集可访问性:
using.Security;
[assembly:AllowPartiallyTrustedCallers]
注意上面Guid如果集内部类未标注GuidCOM注册Guid是会新生成此处Guid没有作用
创建用户Control控件(自定义类待测)IdentityKey.cs加入:
using;
using.ComponentModel;
using.Windows.Forms;
using.Runtime.InteropServices;
KeyActiveX
{
[Guid("94882155-3B7C-48e3-B357-234D56D8F15E")]
publicpartialIdentityKey:UserControl
{
}
}
这里Guid和AssemblyInfo.cs样它会在COM注册中成为CLSID并被html以clsid
类库工程属性中选择生成勾选COM注册在html文件中加入
在IE中启用不安全Control控件查看html页面应能访问到Control控件现在个在发布时对COM注册集开发完
成了
使用OLE/COMObjectViewer(安装VC自带)可以在.NETCategories中查看组件和CLSID
(2)通过IE安全Control控件认证
如果客户机IE未开启访问非安全标记ActiveXControl控件通过IE浏览上面步骤开发出ActiveXControl控件
发现IE会给出警告:
此页上ActiveX对象可能不安全要允许它将化并通过脚本访问吗?
或禁止访问这是客户机IE安全规则设置我们应该在Control控件开发上解决IE安全认证问题首先我们要了解
IE是如何判断个ActiveXControl控件是不安全参见Microsoft帮助和支持文档:
HowInternetExplorerDeterminesIfActiveXControlsAreSafe
Therearetwowaystomarkacontrolassafeforscriptingandinitialization:
1.ImplementtheIObjectSafetyerface.
2.Providethefollowingregistrykeysforthecontrol''sCLSIDundertheImplementedCategories
section:
a.Thefollowingkeymarksthecontrolsafeforscripting:
{7DD95801-9882-11CF-9FA9-00AA006C42C4}
b.Thefollowingkeymarksthecontrolsafeforinitializationfrompersistentdata:
{7DD95802-9882-11CF-9FA9-00AA006C42C4}
MicrosoftrecommendsthatyouimplementIObjectSafetytomarkacontrolassafeorunsafe.
Thispreventsotherusersfromrepackagingyourcontrolandmarkingitassafewhenitisnot.
我决定实现IObjectSafety接口来向IE表明ActiveXControl控件安全标识以保证Control控件再次打包时
安全标识不会被被改写
IObjectSafety是个COM下接口对于C来说只需要实现它就行了而.NET的下没有这个接口在这种情况下我们
ActiveXControl控件就是个不带类型库COM组件必须使用C#代码重新定义COM接口
这里需要了解点COM接口知识接口是COM核心它区分了在客户和对象的间使用契约和实现COM接口有
3种类型:定制接口÷分派接口和双重接口.NETFramework使用ComInterfaceType对它进行了重定义:
.Runtime.InteropServices
{
//摘要:
//IdentieshowtoexposeanerfacetoCOM.
[Serializable]
[ComVisible(true)]
publicenumComInterfaceType
{
//摘要:
//IndicatestheerfaceisexposedtoCOMasadualerface,whichenables
//bothearlyandlatebinding..Runtime.InteropServices.ComInterfaceType.InterfaceIsDual
//isthedefaultvalue.
InterfaceIsDual=0,
//
//摘要:
//IndicatesanerfaceisexposedtoCOMasanIUnknown-derivederface,
//whichenablesonlyearlybinding.
InterfaceIsIUnknown=1,
//
//摘要:
//IndicatesanerfaceisexposedtoCOMasadisperface,whichenables
//latebindingonly.
InterfaceIsIDispatch=2,
}
}
有关3个接口具体描述可以参考C#高级编程第3版28.1.3接口
在MSDN上查找可以知道IObjectSafety继承自IUnknown是个定制接口;通过上章节可以发现向COM注
册时需要提供个Guid作为CLSID来标识集中C#类事实上在COM中接口和类型库都是带有Guid作为唯标识分别
为IID和typelibid
这样通过在C#编写接口标上需要COM接口IID就可以在注册是向COM表明接口身份了在Microsoft帮助上
查找IObjectSafety定义:
[
uuid(C67830E0-D11D-11cf-BD80-00AA00575603),
help("VBIObjectSafetyInterface"),
version(1.0)
]
libraryIObjectSafetyTLB
{
importlib("stdole2.tlb");
[
uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),
help("IObjectSafetyInterface"),
odl
]
erfaceIObjectSafety:IUnknown{
[help("GetInterfaceSafetyOptions")]
HRESULTGetInterfaceSafetyOptions(
[in]longriid,
[in]longpdwSupportedOptions,
[in]longpdwEnabledOptions);
[help("SetInterfaceSafetyOptions")]
HRESULTSetInterfaceSafetyOptions(
[in]longriid,
[in]longdwOptionsSetMask,
[in]longdwEnabledOptions);
}
}
其中uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064)就是需要接口IID
使用C#编写IObjectSafety:
using;
using.Runtime.InteropServices;
KeyActiveX
{
[ComImport,Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
publicerfaceIObjectSafety
{
[PreserveSig]
voidGetInterfacceSafyOptions(
riid,
outpdwSupportedOptions,
outpdwEnabledOptions);
[PreserveSig]
voidSetInterfaceSafetyOptions(
riid,
dwOptionsSetMask,
dwEnabledOptions);
}
}
InterfaceType中定要使用ComInterfaceType.InterfaceIsIUnknownIObjectSafety继承自IUnkown
接下来是KeyActiveX接口实现:
KeyActiveX
{
[Guid("94882155-3B7C-48e3-B357-234D56D8F15E")]
publicpartialIdentityKey:UserControl,IObjectSafety
{
#regionIObjectSafety成员
publicvoidGetInterfacceSafyOptions(riid,outpdwSupportedOptions,outpdwEnabledOptions)
{
pdwSupportedOptions=1;
pdwEnabledOptions=2;
}
publicvoidSetInterfaceSafetyOptions(riid,dwOptionsSetMask,dwEnabledOptions)
{
throwNotImplementedException;
}
#endregion
}
}
通过返回个已定值来告诉IEControl控件是安全具体参见
如何在VisualBasicControl控件实现IObjectSafety
(3)签名发布
C#开发ActiveXControl控件发布方式有3种:
制作客户端安装包分发给客户机安装;
制作在线安装包客户机联机安装;
使用html中objectcodebase指向安装包地址
前两个比较简单适合在局域网内实施生成安装包时需要装Register属性设置为vsdrpCOM;最后种方式需
要在安装包上进行数字签名以保证客户机安全信任受信任签名证书应该向证书提供商(如Versign)购买然后使用
签名工具对安装包进行签名
下面利用VisualStudio2008自带测试证书创建工具MakeCert和签名工具SignTool进行测试首先创建个
带有公司信息测试证书在VisualStudio命令提示符后输入:
makecert-skABC-n"CN=ABCCorporation"f:abccorptest.cer
在F盘上创建了测试证书然后输入
signtoolsignwizard
在SigningOptions页面上选择Custom定义证书文件位置再下步选择个加密算法(MD5或SHA1)指定应用
名称和描述URL确认
此时ActiveXControl控件安装包有了个被标记为未信任测试证书需要将IE设置为启用未信任安装在html中
引用
234D56D8F15E}"codebase="up.exe">
客户机安装的后就可以使用ActiveXControl控件了
2009-1-913:24:39
疯狂代码http://CrazyCoder.cn/
|
|