a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > C# > 正文

使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)

2019-10-29 21:48:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
最近做讀卡器的B/S應(yīng)用程序開(kāi)發(fā),由于讀卡器廠(chǎng)商提供的手冊(cè)都是C/S版本的,而且只有一個(gè)原始的Dll包,并沒(méi)有web版的,那么就只好自己動(dòng)手,豐衣足食了
 
 
 要開(kāi)發(fā)Web版的讀卡程序,大體思路如下:

1.       使用C#對(duì)原始的Dll進(jìn)行封裝,這里要封裝兩部分內(nèi)容,一部分是串口通信的功能,一部分是對(duì)卡讀寫(xiě)的功能。

2.       開(kāi)發(fā)ActiveX控件調(diào)用封裝后的Dll,使用串口通信來(lái)對(duì)卡進(jìn)行讀寫(xiě)。

3.       打包并發(fā)布ActiveX控件。

4.  使用ActiveX控件。

思路1中封裝代碼有2個(gè)類(lèi)SerialInterfaceHelper,串口通信的幫助類(lèi),MifareOneHelperM1卡的讀寫(xiě)幫助類(lèi),我們放在了項(xiàng)目CardReader.Library中。

由于本文的重點(diǎn)是使用VS 2010C#)進(jìn)行ActiveX控件的開(kāi)發(fā),因此思路1中的內(nèi)容就不進(jìn)行詳述了,后面會(huì)直接給出類(lèi)庫(kù)可以參考。本文的實(shí)例中演示C#開(kāi)發(fā)

一個(gè)ActiveX讀卡器控件,實(shí)現(xiàn)讀取卡號(hào)并顯示出卡號(hào)或異常信息的功能,分成三個(gè)大的步驟來(lái)實(shí)現(xiàn):開(kāi)發(fā)ActiveX控件、打包并發(fā)布ActiveX控件和使用

ActiveX控件。

   開(kāi)發(fā)ActiveX控件
     常見(jiàn)的一些ActiveX大部分是使用VB、Delphi、C++開(kāi)發(fā),使用C#開(kāi)發(fā)ActiveX要解決下面三個(gè)問(wèn)題:
(1)使.NET組件可以被COM調(diào)用
(2)在客戶(hù)機(jī)上注冊(cè)后,ActiveX控件能通過(guò)IE的安全認(rèn)證 
(3)已在客戶(hù)機(jī)上注冊(cè)時(shí),安裝包能通過(guò)IE的簽名認(rèn)證
開(kāi)發(fā)ActiveX步驟:
1. 創(chuàng)建Windows Forms Control Library項(xiàng)目CardReader.Controls,設(shè)置項(xiàng)目屬性能夠被COM調(diào)用。
右擊CardReader.Controls,選擇屬性,設(shè)置項(xiàng)目的Assembly屬性,如下圖1所示:
	
使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
圖1 
對(duì)Make Assembly Com-Visible選項(xiàng)劃鉤。
設(shè)置項(xiàng)目的編譯選項(xiàng),如圖2所示:
 
使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
圖2
圖2中對(duì)Register for COM Interop選中,對(duì)COM組件進(jìn)行注冊(cè)。(注意,此處如果實(shí)在debug狀態(tài)下修改的,那在調(diào)到release狀態(tài)下還需要再設(shè)置一次。)

設(shè)置應(yīng)用程序的AssemblyInfo屬性,右擊項(xiàng)目的Properties,打開(kāi)AssemblyInfo文件,AssemblyAllowPartiallyTrustedCallers,注意添加引用System.Security,代碼如下:

復(fù)制代碼代碼如下:

using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 
using System.Security; 
// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information 
// associated with an assembly. 
[assembly: AssemblyTitle("CardReader.Controls")] 
[assembly: AssemblyDescription("")] 
[assembly: AssemblyConfiguration("")] 
[assembly: AssemblyCompany("Microsoft")] 
[assembly: AssemblyProduct("CardReader.Controls")] 
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] 
[assembly: AssemblyTrademark("")] 
[assembly: AssemblyCulture("")] 

[assembly:AllowPartiallyTrustedCallers()] 
// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(true)] 

// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("15493d85-ec9e-4c75-a237-9009a997b780")] 

// Version information for an assembly consists of the following four values: 
// 
// Major Version 
// Minor Version 
// Build Number 
// Revision 
// 
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below: 
// [assembly: AssemblyVersion("1.0.*")] 
[assembly: AssemblyVersion("1.0.0.0")] 
[assembly: AssemblyFileVersion("1.0.0.0")] 

 

2. 開(kāi)發(fā)讀卡器用戶(hù)控件,這個(gè)用戶(hù)控件包含三個(gè)部分:
一個(gè)TextBox,用以顯示讀出的卡號(hào)
一個(gè)Button,讀卡
一個(gè)Label,顯示錯(cuò)誤信息
編寫(xiě)讀卡按鈕事件的代碼,完成控件開(kāi)發(fā)后,為了使該用戶(hù)控件作為一個(gè)ActiveX控件進(jìn)行使用,還需要做以下修改:

首先,為控件類(lèi)創(chuàng)建一個(gè)唯一的GUID,這個(gè)編號(hào)將用于B/S系統(tǒng)的客戶(hù)端調(diào)用時(shí)使用,注意這里的GUID不能和AssemblyInf中的GUID相同,生成GUID的方法如下,

在開(kāi)始-》程序中打開(kāi)Microsoft Windows SDK Tools,如下圖3所示: 

 

 

使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)

 

 

圖3

點(diǎn)擊GUID Generator,生成GUID,如下圖4所示:

 

使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)

圖4

COPY生成的GUID到記事本,再拷貝GUID的字符串到控件類(lèi),代碼如下所示:[Guid("E395359C-86F2-4D7B-A91A-5A64B9E3BA6C")]
public partial class ReadCardControl : UserControl

其次,為了讓ActiveX控件獲得客戶(hù)端的信任,控件類(lèi)還需要實(shí)現(xiàn)一個(gè)名為“IObjectSafety”的接口,要?jiǎng)?chuàng)建該接口(注意,不能修改該接口的GUID值),
IObjectSafety代碼如下:

    [ComImportGuid("1D9AD540-F2C9-4368-8697-C4AAFCCE9C55")]
    [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);
    }

注意這里要添加引用:using System.Runtime.InteropServices;
 
3. 修改控件類(lèi),使之繼承IObjectSafety接口,代碼清單如下:

[Guid("E395359C-86F2-4D7B-A91A-5A64B9E3BA6C")]
    public partial class ReadCardControl : UserControl,IObjectSafety
    {
        public int icdev; // 
通訊設(shè)備標(biāo)識(shí)符
        public Int16 st;
        public int sec;

        public ReadCardControl()
        {
            InitializeComponent();
        }
        #region IObjectSafety 
成員

        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();
        }

        #endregion
}

 
   打包并發(fā)布ActiveX

         ActiveX控件開(kāi)發(fā)完成后,我們要講ActiveX控件打包和發(fā)布。ActiveX控件可以使用VS 2010的安裝項(xiàng)目進(jìn)行部署,使用VS 2010創(chuàng)建Windows Form的安裝工程就可以將ActiveXdll進(jìn)行打包。在打包時(shí)注意將ActiveX控件項(xiàng)目作為主輸出項(xiàng)目,并設(shè)置其Register屬性為vsdrpCOM,創(chuàng)建打包項(xiàng)目如下圖5所示:

 
使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
圖5
創(chuàng)建一個(gè)Windows 安裝項(xiàng)目,并給項(xiàng)目添加項(xiàng)目輸出,如下圖6所示:
 
使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
圖6
在添加項(xiàng)目輸出時(shí),我們將ActiveX項(xiàng)目添加進(jìn)來(lái),在項(xiàng)目中選擇ActiveX控件項(xiàng)目(CardReader.Controls),Primary Out(基本輸出),如下圖7所示:
		使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
圖7

添加完項(xiàng)目輸出以后,在Application Folder里已經(jīng)有了三個(gè)文件:CardReader.Controls.tlbCardReader.Libary.dllPrimary Output From CardReader.Controls,同時(shí)將mwrf32.dll也打進(jìn)安裝包里,右擊添加文件,瀏覽到mwrf32.dll添加進(jìn)來(lái)即可。注意首先要將mwrf32.dll拷貝到ActiveX控件

項(xiàng)目中的Bin中,添加文件時(shí)瀏覽到//CardReader/CardReader.Controls/bin/Debug中的mwrf32.dll打包進(jìn)去,否則會(huì)出現(xiàn)找不到mwrf32.dll的錯(cuò)誤。

添加完文件后,設(shè)置Primary Output From CardReader.ControlsRegister屬性為vsdrpCOM。設(shè)置完成后右擊安裝工程SetupCardReader

修改其屬性,如下圖8所示:

		使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
 圖8

         在上圖中可以設(shè)置輸出的文件名,這個(gè)文件名就是打包后安裝文件.MSI的文件名。設(shè)置包文件、壓縮方式,CAB size,這三項(xiàng)均選擇默認(rèn)值即可。

最后設(shè)置安裝URL,這里的安裝URL是用來(lái)發(fā)布或者測(cè)試ActiveXURL地址的。上圖中我們將在89端口下進(jìn)行測(cè)試,因此URL設(shè)置為:

http://localhost:89/CardReader

這樣打包文件就生成了,我們可以打開(kāi)//CardReader/SetupCardReader/Debug看到生成了2個(gè)文件,一個(gè)是setup.exe,一個(gè)是SetupCardReader.msi

這里的Setup.exe就是我們?cè)谑褂?/span>ActiveX時(shí)的codebase文件。

打包成exe文件以后,我們可以進(jìn)一步對(duì)安裝文件進(jìn)行打包成.cab文件,安裝隱藏了msi 安裝界面,類(lèi)似于cabarc 打包ocx 的效果

(點(diǎn)擊install 之后其他的都后臺(tái)做了),本文中暫不討論,感興趣的讀者可以使用CAB SDK 中的工具CABARC.EXE (下載地址 http://support.microsoft.com/kb/310618 )來(lái)進(jìn)行。

   使用ActiveX
打包完成后,我們就可以在應(yīng)用程序中使用打包好的ActiveX控件了,創(chuàng)建一個(gè)web項(xiàng)目(CardReader.Web),在測(cè)試頁(yè)面的HTML代碼中添加對(duì)ActiveX控件
的引用修改default.aspx的代碼如下:

    <object id="cardReader1" classid="clsid:E395359C-86F2-4D7B-A91A-5A64B9E3BA6C" 
        width="500"
        height="100" 
        codebase="CardReader/SetupCardReader/Debug/Setup.exe">
    </object>

注意這里的clsid:E395359C-86F2-4D7B-A91A-5A64B9E3BA6C的值是我們?cè)陂_(kāi)發(fā)ActiveX控件時(shí)的GUID
運(yùn)行的效果圖下圖9所示:
	
使用VS2010 C#開(kāi)發(fā)ActiveX控件(上)
 9

         9中,我們演示了不調(diào)用串口通信和讀卡程序下的效果,至于要調(diào)用串口通信和讀卡程序,我將在另一篇帖子里進(jìn)行詳細(xì)說(shuō)明。

         至此,使用VS 2010開(kāi)發(fā)ActiveX控件的大部分功能已經(jīng)完成了,在VS 2010環(huán)境中使用C#開(kāi)發(fā)ActiveX控件,技術(shù)并不太困難,但是要求客戶(hù)端需要安裝.NET Framework。鑒于ActiveX控件一般都是實(shí)現(xiàn)一些簡(jiǎn)單單一的功能,所以建議使用.NET Framework 2.0/.NET Framework 4.0下開(kāi)發(fā),

本實(shí)例中我們使用了.NET Framework 4.0


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产成人综合一区二区三区 | 在线色网 | 日韩视频精品 | 天堂中文av在线 | 精品一区二区电影 | 欧美一二三区在线观看 | 国产精品女同一区二区 | 毛片网站在线观看 | 国产欧美精品一区二区色综合 | 亚洲成人在线视频观看 | 91亚洲免费 | 中文字幕亚洲一区二区三区 | 99动漫 | 精品亚洲一区二区 | 精品中文久久 | 欧美a v在线播放 | 成人免费视频在线观看 | 国产三区在线成人av | 日韩在线无 | 国产欧美精品一区aⅴ影院 日韩精品区 | jizz在线观看 | 久久久免费av | 99re6热在线精品视频播放 | 国产精品无码久久久久 | 午夜免费电影 | 国产欧美精品一区二区三区四区 | 久久精品国产一区二区电影 | 日韩一区二区黄色片 | 中文字幕爱爱视频 | 国产精品一区二区三区四区 | 久久久久亚洲av毛片大全 | 国产91在线视频 | 超碰97在线人人 | 久久伊人在 | 精品一区二区网站 | 成人在线视频观看 | av黄色在线看 | 综合久久网 | 日韩中文字幕一区 | 中文字幕国产 | 天天干狠狠干 |