vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

时间:2022-05-24 12:47:30

在C#中,其实没有OCX控件一说,相对应的只是COM组件,编译后也是.DLL,而不是.ocx.所以在C#中,在创建项目时只能创建类库项目。

然后就是具体的代码开发。(略)

要使组件成为能被网页脚本调用的OCX控件,在开发时,要注意以下几点:

1、必须要为将发布OCX控件的主类设置GUID码。该码在创建类库时,C#会自动生成一个(你可以使用,也可以重新生成),并存储在AssemblyInfo.cs中。设置GUID的代码参照以下:

namespace xxxx

{

    [Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]//从AssemblyInfo.cs文件中直接复制过来

    public partial class RunData : UserControl, IObjectSafety

    {}

}  

2、必须要实现IObjectSafety接口。该接口需要手工创建一个接口类并让OCX组件实现。

完整的接口代码:(以下接口代码都是固定的,最好不要做其他改动)

using System;

using System.Collections.Generic;

using System.Text;

using System.Web.UI.WebControls.WebParts; //必须引用该包

using System.Security;

using System.Runtime.InteropServices;     //必须引用该包

namespace RunData

{

    /// <summary>

    /// 把控件发布成com组件时必须实现的接口.该接口的GUID是固定的,不能修改,否则组件发布不成功

    /// </summary>

    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IObjectSafety

    {

        // 方法定义

       void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);

       void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions);

    }

}

接口实现:

public void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions)

        {

            pdwSupportedOptions = 1;  //不要修改该代码

            pdwEnabledOptions = 2;    //不要修改该代码

            return;

        }

public  void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions)

        {

            return;

        }

3、对AssemblyInfo.cs进行编辑,修改相应的属性。包括以下属性及值:

    // 则将该类型上的 ComVisible 属性设置为 true。

    [assembly: ComVisible(true)] //将false更改为true,自动生成的注释也做了说明

    //新添加下面的属性。该属性要求引用System.Security

    [assembly: AllowPartiallyTrustedCallers()]

   // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID

   //[assembly: Guid("80c07fca-841c-43c9-bd34-e9f3a6e87a85")]  //注释掉该属性,此属性必须注释,最初我没有注释此属性,生成COM组件老是不成功,有警告,会影响最后的发布.试了N次才试出原因是没有注释此属性。

    要引用:using System.Runtime.InteropServices;

4、编辑工程属性。

   A、在[应用程序]页,输出类型必须指定为“类库”.

   B、在[生成]页,必须勾选“为Com Interop注册”选项。

作了以上修改,如果能编译成功,则表示你的COM组件已够在你本机发布成功了。也说明你的组件本身没什么问题了。

你可以写一个测试网页对你的COM组件进行引用了。

如果是IIS,可以直接使用DLL引用方式进行引用,格式:

<object ></object>

也可以使用clsid方式引用。

如果非IIS应用服务器,如tomcat等,则只能使用CLSID方式。格式:

<OBJECT ID="DataCtl" CLASSID="CLSID:8d7d8518-ca58-4863-b94d-3c616fda7b35"></OBJECT>

"8d7d8518-ca58-4863-b94d-3c616fda7b35"就是最开始提到的那个GUID码!

在本机上运行此网页应该不会出现问题了,因为在开发组件的过程中VS.NET会自动进行组件注册。

使用OLE查看器可以查看当前组件是否成功注册到本机,如果没有找到该组件,应该使用手工注册方式进行注册。

通常情况下手工注册OCX都是采用RegSvr32.exe,但注册C#编写的COM组件推荐使用.NET自带的注册工具RrgAsm.exe工具,而且使用的注册工具版本一定要与开发框架版本一起发布的版本。



继续写一下关于打包成exe

在项目中添加安装项目,把输出目录选中为做的activex,并将“主输出来自xxx(活动)”的属性中的Register属性改为:vsdrpCOM

设置安装目录属性中的安装url

设置安装URL
这里设置为:http://localhost/xxxx
这个目录必须是实际存在的,用来存放生成的安装文件,供客户端下载安装。

 生成项目
会生成两个文件,一个exe文件和一个msi文件,同时网站的html中写上<object classid="clsid:636B8CE1-7512-464C-B63C-FC75BDCA21DB"codebase="setup.exe" 

启动网站,确保访问setup.exe的目录与【安装项目】中的【安装URL】一致

cab 打包

1.下载CabArc.exe文件放到d盘下新建的cabCreate文件夹中

2.新建一个名为:cab.txt文件在中间加入:cabarc n sccincap.CAB cap.inf Activex控件名称.msi  修改扩展名为bat

3.新建一个Activex控件名称.inf文件 加入以下内容

[version]
signature="$CHICAGO$"
AdvancedINF=2.0 
[Setup Hooks]
hook1=hook1
[hook1]
run= msiexec /i "%EXTRACT_DIR%\Activex控件名称.msi" /qn

在cmd 中进入到d:\cabCreate目录,执行以下语句

d:\cabCreate\CabArc.Exe N d:\cabCreate\要生成的CAB名称.cab d:\cabCreate\Activex控件名称.msi d:\cabCreate\Activex控件名称.inf

执行成功会生成要生成的CAB名称的文件.

使用cab

在WEB页面中加入

 <object id="Cab控件ID" classid="clsid:加在用户控件前面的GUID号" width="600" height="750" codebase="存放路径/生成的Cab文件名.cab"></object>

这样就可以使用了.

数字签名制作:

制作数字签名需要的两个工具:

1    、"数字证书"制作软件 Makecert:

makecert.exe是一个微软出品的用来制作"数字签名"的软件,是命令行界面,利用它可以轻松地做出属于自己的个人"数字签名",当然自己做出来的这个数字签名是不属于受信任的证书的,但这并不太影响使用。

        Makecert,exe不用去website下载。直接start--程序----vs2008--visual studio tools ---- vs2008 命令提示,这样运行命令行。

2   、 数字签名软件Signcode

  我们可以使用signcode.exe和自己的"数字证书"签署自己的软件,给软件加上数字签名,使其可以在网页中运行

第一步:

打开makecert的命令行:直接start--程序----vs2008--visual studio tools ---- vs2008 命令提示,这样运行命令行。makecert的命令如下:

makecert -sv dsoframer.pvk -n "CN=钟德荣" -ss My -r -b 01/01/1900 -e 01/01/9999

其中

-sv dsoframer.pvk   意思是生成一个私匙文件dsoframer.pvk

-n "CN=尚极工作室" 其中的"尚极工作室"就是签名中显示的证书所有人的名字,记住要改为你自己的或你想要的名字呀!

-ss My      指定生成后的证书保存在个人证书中

-r        意思是说证书是自己颁发给自己的,呵呵

-b 01/01/2009   指定证书的有效期起始日期,格式为月/日/年,最低为1900年

-e 01/01/9999   指定证书的有效期终止日期,格式同上,我想 9999年你应该是活不到的^)^

至于其他命令暂时用不到,我也不多做介绍啦。

 

vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

在上面的界面中,不需要填私匙密码吧?直接点"无"按钮就可以拉,如果你喜欢麻烦就输入密码,并记住它。好啦!已经在目录下生成了你的私匙文件dsoframer.pvk,但证书在哪里?别急,打开IE 的"Internet选项",切换到"内容"标签,看到"证书"按钮没?点它!

 vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

图中上面那个截止日期为9999-1-1的"尚极工作室"就是刚才自己生成的证书,把它"导出"为dsoframer.cer,(其中的选项采用默认的编码格式)好啦,最重要的第一步已经完成!

第二步,为xxx.cab制作数字签名

运行signcode.exe,选择dsoframer.CAB,如下图:

 

 vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

"签名选项窗体"中的"签名类型"选定"自定义(C)",如下图:

 

vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

下一步,在“数字签名向导-签名证书”窗体中,点击"从文件中选择"按钮,选择上面第一步导出的证书文件dsoframer.cer,

 

 

 vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

再下一步的私匙选定第一步生成的dsoframer.pvk文件

 

 vs2008 使用c#写Activex插件,并在website中使用加载,并将cab制作为数字签名

!这样一个使用自己的"数字证书" 签署的具有"数字签名"可以在网页中运行的程序就做好啦!

第四步:当然就是把做好的程序嵌入到网页中,然后上传啦!

加入到网页中的代码如下:

                <objectclassid="clsid:00460182-9E5E-11D5-B7C8-B8269041DD57"id="FramerControl1"

 style="left: 0px; top: 0px; width: 100%; height: 16px"codebase="../DsoFramer/dsoFramer.CAB#V2,2,1,2">       

</object>


 

最后:值得注意的是,这样的数字签名是你在本机做的,根据微软的这套机制,比如网银的那些数字签名的cab都是经过微软验证的,所以在任何的机器的浏览器中都能加载,而本地自己制作的,只是在本机器可以验证而在其他的的客户端就不能被验证了,所以还会提示被阻止的情况。

  


结贴:祝好运