1) 创建Visual Studio解决方案 "ActiveXSolution"。
2)在解决方案ActiveXSolution中添加 Windows窗体应用程序 “CSDemo”。
1. 在Windows窗体Form1添加代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace CSDemo { public partial class Form1 : Form { //返回给web的值 public string dialogResult = string.Empty; //获取从web中传过来的值 private string caption = string.Empty; private string text = string.Empty; public Form1() { InitializeComponent(); } public Form1(string caption, string text) { InitializeComponent(); this.caption = caption; this.text = text; } private void Form1_Load(object sender, EventArgs e) { Button btnTest = new Button(); btnTest.Text = "测试"; btnTest.Location = new Point(10, 10); btnTest.Click+=new EventHandler(btnTest_Click); this.Controls.Add(btnTest); } /// <summary> /// 显示从web传来的值 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnTest_Click(object sender, EventArgs e) { dialogResult = MessageBox.Show(text, caption, MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1).ToString(); this.Close(); } } }
3) 在解决方案ActiveXSolution中添加 Windows窗体控件库“ActiveXDemo”。
1. 在“ActiveXDemo”中添加接口“IObjectSafety.cs”代码如下:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace ActiveXDemo { [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { [PreserveSig] void GetInterfacceSafyOptions( int riid, out int pdwSupportedOptions, out int pdwEnabledOptions); [PreserveSig] void SetInterfaceSafetyOptions( int riid, int dwOptionsSetMask, int dwEnabledOptions); } }
2. 在“ActiveXDemo”中添加 用户控件“UserControl1.cs”代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace ActiveXDemo { [Guid("413f087e-95b4-4eb4-9941-da0610f71fef")] public partial class UserControl1 : UserControl, IObjectSafety { public UserControl1() { InitializeComponent(); } public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions) { pdwSupportedOptions = 1; pdwEnabledOptions = 2; } public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions) { throw new NotImplementedException(); } public string ShowForm(string caption, string text) { string dialogResult = string.Empty; //将web传过来的值传给winform CSDemo.Form1 frm = new CSDemo.Form1(caption, text); frm.ShowDialog(); //将winform传过来的值传给web dialogResult = frm.dialogResult; return dialogResult; } } }
3.右击“ActiveXDemo”—属性—生成—勾上为COM互操作注册。
4.打开“ActiveXDemo”—Properties—AssemblyInfo.cs将[assembly: ComVisible(false)]改成[assembly: ComVisible(true)]
4)在解决方案ActiveXSolution中创建安装项目“SetupDemo”
1. 右击安装项目“SetupDemo”—添加—项目输出—主输出“ActiveXDemo”
2. 安装“SetupDemo”
3. 单击:开始—所有程序—Microsoft Windows SDK v6.0A—Tools—OLE-COM Object Viewer,打开.NET Category可以看到ActiveXDemo.UserControl1
5)在解决方案ActiveXSolution中添加 ASP.NET Web应用程序 “BSDemo”
1.Default.aspx代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="BSDemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <script language="javascript" type="text/javascript"> function fun(caption, text) { //将参数传给winform,并获取winform返回的值 var dialogResult = document.getElementById('controlbyid').ShowForm(caption, text); alert(dialogResult); } </script> </head> <body> <form id="form1" runat="server"> <div> <object id="controlbyid" classid="clsid:413f087e-95b4-4eb4-9941-da0610f71fef" codebase="Resource/SetupDemo.cab"></object> <asp:Button ID="btnTest" runat="server" Text="Button" /> </div> </form> </body> </html>
2.Default.aspx.cs代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace BSDemo { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string caption = "a1"; string text = "b1"; this.btnTest.Attributes.Add("onclick", "fun('"+caption+"','"+text+"');"); } } } }
6)生成SetupDemo.cab
1.网上下载cabsdk.exe
2.解压csbsdk.exe,将SetupDemo.msi放到解压后文件的BIN下面。
3.在BIN中创建install.inf
代码如下:
[version]
signature="$CHICAGO$"
AdvancedINF=2.0
[Setup Hooks]
hook1=hook1
[hook1]
run=msiexec.exe /i "%EXTRACT_DIR%\SetupDemo.msi" /qn
4.开始-运行,输入“CMD”,在打开的命令提示符界面中,进入解压后文件的BIN目录,
输入:cabarc n SetupDemo.cab SetupDemo.msi install.inf
5.cab生成成功,将SetupDemo.cab放到“BSDemo”下面的Resource文件夹下。
6.启动网站,一般情况下,网页会弹出提示,是否安装ActiveX控件等,如果提示了也不能安装,需要将网站添加到信任站点,并允许下载不安全和未签名控件。关于控件的签名和认证,本文不做说明,需要的请自行搜索。
7)用VS创建证书。
1.开始—所有程序—Microsoft Visual Studio 2008—Visual Studio Tools—Visual Studio 2008 命令提示。
2.makecert -r -pe -n "CN=zhcao-demo" -ss My -sky exchange
3.查看证书:
打开ie—工具—Internet选项—内容—证书—我们将在个人中看到我们刚才创建的证书“zhcao-demo”。
8)给cab包添加证书
1.开始—所有程序—Microsoft Visual Studio 2008—Visual Studio Tools—Visual Studio 2008 命令提。
2.signtool signwizard—下一步—浏览获取我们前面创建的SetupDemo.cab—下一步—典型—从存储区选择—选择我们前面创建的证书“zhcao-demo”—确定—下一步—下一步—下一步—完成。