代码改变世界

如何发布.Net窗体应用为ActiveX控件

2011-12-23 15:15 贼寇在何方 阅读(...) 评论(...) 编辑 收藏

系统环境

Windows 7 专业版,32位,中文版
Visual Studio 2008 with SP1 TS版,英文版
IE 8.0 / 9.0,32位
IIS 7.5

1、创建项目

创建一个Windows Form Control Library(Windows窗体控件库),我给的项目名是ActiveXTest。给控件该个名字ActiveXControl,随便加上一种底色区别于网页的白色背景。

2、更改项目设置

在项目属性->生成选项卡中,Configuration(配置)改为“Release”,勾选“Register for COMinterop(为COM互操作注册)”,保存。

打开AssemblyInfo.cs,添加一行:

[assembly: AllowPartiallyTrustedCallers()]

并修改ComVisible为true:

[assembly: ComVisible(true)]


3、为控件创建Guid

在工具菜单中找到Create Guid,创建第四种格式的Guid,并为控件添加Guid特性:

using System.Runtime.InteropServices;

namespace ActiveXTest
{
[Guid("A9A69EC9-51FC-4d2a-B287-964225809175")]
public partial class ActiveXControl : UserControl
{
public ActiveXControl()
{
InitializeComponent();
}
}
}

 

4、创建安装项目

在同一个解决方案下创建Setup Project(安装项目),我给出的项目名称为ActiveXSetupTest
进入Application Folder(应用程序文件夹),添加Project Output…(项目输出…)。选择ActiveXTest这个项目,Configuration选“Release Any CPU”,确定。


5、生成项目

切换到Release模式,生成ActiveXSetupTest。
生成过程中可能会报一个警告,“Unable to create registration information for file named 'ActiveXTest.tlb'”。这个警告不是大问题,把ActiveXTest.tlb排除即可。

6、创建网页

在IIS某个站点的目录(例如C:\inetpub\wwwroot)下,创建一个页面(例如index.html),修改内容如下:

<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试</title>
</head>
<body>
<object classid="" codebase="ActiveXSetupTest.cab"
Width
="600px" Height="400px">
</object>
</body>
</html>

打开OLE-COM Object Viewer(Windows SDK自带的工具),在.Net分类下找到我们创建的控件库。

右键,复制HTML <object> Tag,并用其中的classid的值,替换index .html中对应值:

classid="clsid:FFE39B26-4C21-4FA0-94E7-4EAAC79291EA"

 

7、使用Cab打包

把安装项目生成的ActiveXSetupTest.msi复制到目录(C:\inetpub\wwwroot)下。

创建配置文件install.inf,内容如下:

[version]
Signature="$CHICAGO$"
AdvancedINF=2.0

[setup hooks]
hook=hook

[hook]
run=msiexec /i "%EXTRACT_DIR%\ActiveXSetupTest.msi" /qn


创建配置文件config.inf,设置需要打包的文件以及打包后的文件名,内容如下:

.OPTION EXPLICIT ; Generate errors
.Set CabinetNameTemplate=ActiveXSetupTest.CAB
.Set DiskDirectory1=.
ActiveXSetupTest.msi
install.inf
;

在命令行下执行命令:

cd /d C:\inetpub\wwwroot
makecab /f config.inf


执行完成后可以在目录下看到ActiveXSetupTest.cab。

8、清理注册表

清理注册表中的两项,才可以在IE中看到弹出询问ActiveX安装的对话框:

# ActiveXTest:项目名 + ActiveXControl:控件名
reg delete HKEY_CLASSES_ROOT\ActiveXTest.ActiveXControl /f

# 控件的Guid,是第三步手动生成的
reg delete HKEY_CLASSES_ROOT\CLSID\{A9A69EC9-51FC-4d2a-B287-964225809175} /f


反复试验的时候,可能ActiveXSetupTest.msi已经安装,这时候需要去控制面板中删除程序。

9、设置IE的安全选项

在本机和其他机器上用IE访问index.html。缺省设置下,未签名的ActiveX会被直接拦截。此处需要一些设置:
打开“Internet选项”,“安全”标签页,选择“受信任的站点”,添加当前网站。并将该区域的安全级别设为低。

刷新页面后,可以看到如下警告,点击安装后,ActiveX控件运行成功。

运行效果:

 

参考链接

C#开发ActiveX控件及制作CAB包

使用C#开发ActiveX控件