欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2011年05月11日 23:04:51   作者:  
最近做讀卡器的B/S應(yīng)用程序開發(fā),由于讀卡器廠商提供的手冊都是C/S版本的,而且只有一個(gè)原始的Dll包,并沒有web版的,那么就只好自己動(dòng)手,豐衣足食了
 要開發(fā)Web版的讀卡程序,大體思路如下:

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

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

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

4.  使用ActiveX控件。

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

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

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

ActiveX控件。

   開發(fā)ActiveX控件
     常見的一些ActiveX大部分是使用VB、Delphi、C++開發(fā),使用C#開發(fā)ActiveX要解決下面三個(gè)問題:
(1)使.NET組件可以被COM調(diào)用
(2)在客戶機(jī)上注冊后,ActiveX控件能通過IE的安全認(rèn)證 
(3)已在客戶機(jī)上注冊時(shí),安裝包能通過IE的簽名認(rèn)證
開發(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 
對Make Assembly Com-Visible選項(xiàng)劃鉤。
設(shè)置項(xiàng)目的編譯選項(xiàng),如圖2所示:
 
圖2
圖2中對Register for COM Interop選中,對COM組件進(jìn)行注冊。(注意,此處如果實(shí)在debug狀態(tài)下修改的,那在調(diào)到release狀態(tài)下還需要再設(shè)置一次。)

設(shè)置應(yīng)用程序的AssemblyInfo屬性,右擊項(xiàng)目的Properties,打開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. 開發(fā)讀卡器用戶控件,這個(gè)用戶控件包含三個(gè)部分:
一個(gè)TextBox,用以顯示讀出的卡號(hào)
一個(gè)Button,讀卡
一個(gè)Label,顯示錯(cuò)誤信息
編寫讀卡按鈕事件的代碼,完成控件開發(fā)后,為了使該用戶控件作為一個(gè)ActiveX控件進(jìn)行使用,還需要做以下修改:

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

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

 

 

圖3

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

圖4

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

其次,為了讓ActiveX控件獲得客戶端的信任,控件類還需要實(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. 修改控件類,使之繼承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控件開發(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所示:

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

添加完項(xiàng)目輸出以后,在Application Folder里已經(jīng)有了三個(gè)文件:CardReader.Controls.tlb、CardReader.Libary.dllPrimary Output From CardReader.Controls,同時(shí)將mwrf32.dll也打進(jìn)安裝包里,右擊添加文件,瀏覽到mwrf32.dll添加進(jìn)來即可。注意首先要將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所示:

 
 圖8

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

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

http://localhost:89/CardReader

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

這里的Setup.exe就是我們在使用ActiveX時(shí)的codebase文件。

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

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

   使用ActiveX
打包完成后,我們就可以在應(yīng)用程序中使用打包好的ActiveX控件了,創(chuàng)建一個(gè)web項(xiàng)目(CardReader.Web),在測試頁面的HTML代碼中添加對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的值是我們在開發(fā)ActiveX控件時(shí)的GUID。
運(yùn)行的效果圖下圖9所示:
 9

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

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

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

相關(guān)文章

  • C#中屬性和成員變量的區(qū)別說明

    C#中屬性和成員變量的區(qū)別說明

    本篇文章主要是對C#中屬性和成員變量的區(qū)別進(jìn)行了介紹說明。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • C#托管堆對象實(shí)例包含內(nèi)容分析

    C#托管堆對象實(shí)例包含內(nèi)容分析

    這篇文章主要介紹了C#托管堆對象實(shí)例包含內(nèi)容,實(shí)例展示了托管對象的結(jié)構(gòu)及運(yùn)行原理,需要的朋友可以參考下
    2014-09-09
  • 帶你復(fù)習(xí)c# 托管和非托管資源

    帶你復(fù)習(xí)c# 托管和非托管資源

    這篇文章主要介紹了c# 托管和非托管資源的相關(guān)資料,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • c# 適配器模式

    c# 適配器模式

    適配器模式:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,Adapter使原本由于接口不兼容而不能一起工作的那些類可以一起工作
    2012-10-10
  • 使用遞歸實(shí)現(xiàn)數(shù)組求和示例分享

    使用遞歸實(shí)現(xiàn)數(shù)組求和示例分享

    這篇文章主要介紹了使用遞歸實(shí)現(xiàn)數(shù)組求和示例,思路是給定一個(gè)含有n個(gè)元素的整型數(shù)組a,求a中所有元素的和,需要的朋友可以參考下
    2014-03-03
  • C#?重寫Notification提示窗口的示例代碼

    C#?重寫Notification提示窗口的示例代碼

    本文主要介紹了C#?重寫Notification提示窗口的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#中#define后面只加一個(gè)參數(shù)的解釋

    C#中#define后面只加一個(gè)參數(shù)的解釋

    今天小編就為大家分享一篇關(guān)于C#中#define后面只加一個(gè)參數(shù)的解釋,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • c#中Linq to Sql 增刪除的實(shí)例

    c#中Linq to Sql 增刪除的實(shí)例

    c#中Linq to Sql 增刪除的實(shí)例,需要的朋友可以參考一下
    2013-05-05
  • Entity?Framework代碼優(yōu)先(Code?First)模式

    Entity?Framework代碼優(yōu)先(Code?First)模式

    這篇文章介紹了Entity?Framework代碼優(yōu)先(Code?First)模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#12中的Collection expressions集合表達(dá)式語法糖詳解

    C#12中的Collection expressions集合表達(dá)式語法糖詳解

    C#12中引入了新的語法糖來創(chuàng)建常見的集合,并且可以使用..來解構(gòu)集合,將其內(nèi)聯(lián)到另一個(gè)集合中,下面就跟隨小編一起學(xué)習(xí)一下C#12中這些語法糖的使用吧
    2023-11-11

最新評論