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),MifareOneHelper,M1卡的讀寫(xiě)幫助類(lèi),我們放在了項(xiàng)目CardReader.Library中。
由于本文的重點(diǎn)是使用VS 2010(C#)進(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所示:
圖1
對(duì)Make Assembly Com-Visible選項(xiàng)劃鉤。
設(shè)置項(xiàng)目的編譯選項(xiàng),如圖2所示:
圖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文件,Assembly:AllowPartiallyTrustedCallers,注意添加引用System.Security,代碼如下:
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所示:
圖3
點(diǎn)擊GUID Generator,生成GUID,如下圖4所示:
圖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代碼如下:
[ComImport, Guid("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的安裝工程就可以將ActiveX的dll進(jìn)行打包。在打包時(shí)注意將ActiveX控件項(xiàng)目作為主輸出項(xiàng)目,并設(shè)置其Register屬性為vsdrpCOM,創(chuàng)建打包項(xiàng)目如下圖5所示:
圖5
創(chuàng)建一個(gè)Windows 安裝項(xiàng)目,并給項(xiàng)目添加項(xiàng)目輸出,如下圖6所示:
圖6
在添加項(xiàng)目輸出時(shí),我們將ActiveX項(xiàng)目添加進(jìn)來(lái),在項(xiàng)目中選擇ActiveX控件項(xiàng)目(CardReader.Controls),Primary Out(基本輸出),如下圖7所示:
圖7
添加完項(xiàng)目輸出以后,在Application Folder里已經(jīng)有了三個(gè)文件:CardReader.Controls.tlb、CardReader.Libary.dll、Primary 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.Controls的Register屬性為vsdrpCOM。設(shè)置完成后右擊安裝工程SetupCardReader,
修改其屬性,如下圖8所示:
圖8
在上圖中可以設(shè)置輸出的文件名,這個(gè)文件名就是打包后安裝文件.MSI的文件名。設(shè)置包文件、壓縮方式,CAB size,這三項(xiàng)均選擇默認(rèn)值即可。
最后設(shè)置安裝URL,這里的安裝URL是用來(lái)發(fā)布或者測(cè)試ActiveX的URL地址的。上圖中我們將在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所示:
圖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。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注