亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用C#開發ActiveX控件

2019-11-17 02:28:23
字體:
來源:轉載
供稿:網友
使用C#開發ActiveX控件

0. 前言

ActiveX控件以前也叫做OLE控件或OCX控件,它是一些軟件組件或對象,可以將其插入到WEB網頁或其它應用程序中。使用ActiveX插件,可以輕松方便的在 Web頁中插入多媒體效果、交互式對象以及復雜程序等等。

通常使用C++或VB開發ActiveX控件,本文探討一下在Visual Studio 2005環境中使用C#開發ActiveX控件的技術實現。

1. 問題場景

在C/S架構的系統中,客戶端要實現某些業務功能,可以通過安裝相關的應用程序集來方便的實現。同樣的需求,在B/S架構的系統里實現起來卻比較困難。因為所有的程序都放在服務器端,客戶端只是采用瀏覽器,通過HTTP協議來訪問服務器端。比較成熟的解決辦法是開發ActiveX控件安裝到客戶端,這樣客戶端的瀏覽器就可以訪問本地的ActiveX控件來執行相關的本地操作。本文將要談論的,就是使用C#開發一個ActiveX控件實現讀取并顯示客戶端的系統時間。

2. 開發環境

  • Windows xp
  • Visual Studio 2005
  • .NET Framework 2.0(C#)

3. 實現過程

3.1.ActiveX控件開發

在Visual Studio 2005開發環境中,可以使用Windows控件庫項目實現ActiveX控件的開發,但是需要對項目做一些必要的設置。下面就來看看如何使用Windows控件庫項目開發一個ActiveX控件。首先創建一個應用程序解決方案,并添加一個Windows控件庫項目:

clip_image002

更改“項目屬性-應用程序-程序集信息”設置,勾選“使程序集 COM 可見”:

clip_image004

更改“項目屬性-生成”設置,勾選“為 COM Interop 注冊”(注意,此處如果實在debug狀態下修改的,那在調到release狀態下還需要再設置一次):

clip_image006

修改AssemblyInfo.cs文件,添加[assembly: AllowPartiallyTrustedCallers()]項(需要引用System.Security名稱空間):

usingSystem.Reflection;usingSystem.Runtime.CompilerServices;usingSystem.Runtime.InteropServices;usingSystem.Security;[assembly:AssemblyTitle("Yilin.添加一個Windows用戶控件:

clip_image008

按照開發Windows用戶控件一樣的思路完成該控件的開發,本例中主要實現了兩個業務功能,一個是提供一個公共方法,用于讀取USBKey中保存的簽名證書,保存到本地C盤根目錄下,并返回操作信息;另一個業務功能提供UI界面,包括一個Button控件和一個Label控件,Button控件的Click事件調用前面提供的那個方法,并將返回信息顯示到Label控件上。這樣做可以達到兩個目的,其一,ActiveX控件提供公共方法供B/S程序直接調用,從后實現業務功能;其二,ActiveX控件可以提供B/S程序UI界面,通過響應B/S程序中對UI的操作事件實現業務功能。

完成控件開發后,為了使該用戶控件作為一個ActiveX控件進行使用,還需要做以下修改:首先,為控件類添加GUID,這個編號將用于B/S系統的客戶端調用時使用(可以使用 工具-創建GUID 菜單創建一個GUID):

Guid("4A44CF4E-F859-4328-AA22-3E9D7AFFF1AB")]publicpartialclassHello:UserControl{

其次,為了讓ActiveX控件獲得客戶端的信任,控件類還需要實現一個名為“IObjectSafety”的接口。先創建該接口(注意,不能修改該接口的GUID值):

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespacePreresearch.CSharpActiveX{[ComImport,GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]publicinterfaceIObjectSafety{[PreserveSig]intGetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]refintpdwSupportedOptions,[MarshalAs(UnmanagedType.U4)]refintpdwEnabledOptions);[PreserveSig()]intSetInterfaceSafetyOptions(refGuidriid,[MarshalAs(UnmanagedType.U4)]intdwOptionSetMask,[MarshalAs(UnmanagedType.U4)]intdwEnabledOptions);}}

然后在控件類中繼承并實現該接口:

#regionIObjectSafety成員privateconststring_IID_IDispatch="{00020400-0000-0000-C000-000000000046}";privateconststring_IID_IDispatchEx="{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";privateconststring_IID_IPersistStorage="{0000010A-0000-0000-C000-000000000046}";privateconststring_IID_IPersistStream="{00000109-0000-0000-C000-000000000046}";privateconststring_IID_IPersistPropertyBag="{37D84F60-42CB-11CE-8135-00AA004BB851}";privateconstintINTERFACESAFE_FOR_UNTRUSTED_CALLER=0x00000001;privateconstintINTERFACESAFE_FOR_UNTRUSTED_DATA=0x00000002;privateconstintS_OK=0;privateconstintE_FAIL=unchecked((int)0x80004005);privateconstintE_NOINTERFACE=unchecked((int)0x80004002);privatebool_fSafeForScripting=true;privatebool_fSafeForInitializing=true;publicintGetInterfaceSafetyOptions(refGuidriid,refintpdwSupportedOptions,refintpdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=riid.ToString("B");pdwSupportedOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA;switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForScripting==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_CALLER;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:Rslt=S_OK;pdwEnabledOptions=0;if(_fSafeForInitializing==true)pdwEnabledOptions=INTERFACESAFE_FOR_UNTRUSTED_DATA;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}publicintSetInterfaceSafetyOptions(refGuidriid,intdwOptionSetMask,intdwEnabledOptions){intRslt=E_FAIL;stringstrGUID=riid.ToString("B");switch(strGUID){case_IID_IDispatch:case_IID_IDispatchEx:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_CALLER)&&(_fSafeForScripting==true))Rslt=S_OK;break;case_IID_IPersistStorage:case_IID_IPersistStream:case_IID_IPersistPropertyBag:if(((dwEnabledOptions&dwOptionSetMask)==INTERFACESAFE_FOR_UNTRUSTED_DATA)&&(_fSafeForInitializing==true))Rslt=S_OK;break;default:Rslt=E_NOINTERFACE;break;}returnRslt;}#endregion

這樣,一個ActiveX控件就開發完成了。

3.2.ActiveX控件部署

ActiveX控件可以使用Visual Studio 2005的安裝項目進行部署。這與普通的Windows Form應用程序的部署幾乎一樣,只有一個地方需要注意,將前面創建的用戶控件項目作為主輸出項目,并設置其Register屬性為vsdrpCOM,如下圖所示:

clip_image009

3.3.測試

建立一個Web應用程序項目,在測試頁面的HTML代碼中添加對ActiveX控件的引用,并且可以通過javascript調用控件的公共成員(注意這里clsid后面的值即為前面為用戶控件類設置的GUID):

<objectid="csharpActiveX"classid="clsid:E5E0446C-8680-4444-9FC2-F837BC617ED9"></object><inputtype="button"onclick="alert(csharpActiveX.SayHello());"value="顯示當前時間"/>

將該Web應用程序項目發布到IIS。另外找一臺電腦作為客戶端測試環境,確保它與服務器端網絡連通,安裝.NET Framework 2.0和該ActiveX控件。安裝完成后,就可以用瀏覽器訪問服務器,進行測試了(你也可以在開發環境的系統中安裝該ActiveX控件,并直接在VS 2005中運行WebApp項目查看結果):

clip_image011

4. 總結

綜上所述,在Visual Studio 2005環境中使用C#開發ActiveX控件,技術實現上沒有什么難度,唯一的問題就是客戶端需要安裝.NET Framework。鑒于ActiveX控件一般都是實現一些簡單單一的功能,.NET Framework 2.0已經完全可以應付,所以建議在.NET Framework 2.0下開發。因為相對于.NET Framework 3.5兩百多兆的安裝包,.NET Framework 2.0安裝包只有20多兆,用戶相對容易接受一些。

5. FAQ

5.1.出現如下錯誤怎么解決?

clip_image012

經在網上查閱,該問題是Visual Studio 2005的一個Bug,并不是每次都發生。我的解決辦法是從Visual Studio 2008的安裝目錄里拷貝regcap.exe覆蓋Visual Studio 2005的對應文件,文件目錄一般為“~/Microsoft Visual Studio 8/Common7/Tools/Deployment/regcap.exe”。壓縮包中提供了該文件的Visual Studio 2008版本。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产在线看| 精品久久久香蕉免费精品视频| 中文字幕亚洲专区| 欧美日韩在线视频一区二区| 97在线视频免费看| 国产精品极品美女在线观看免费| 国产欧美一区二区三区久久人妖| 欧美高清视频免费观看| 日韩电影中文字幕一区| 色偷偷av一区二区三区| 九九久久精品一区| 国产精品免费一区豆花| 欧美日韩成人在线视频| 在线成人激情黄色| 日本中文字幕久久看| 亚洲欧美综合v| 色综合老司机第九色激情| 欧美电影在线免费观看网站| 欧美巨乳在线观看| 成人av番号网| 久久精品视频在线播放| 亚洲欧美日韩精品久久奇米色影视| 在线观看久久久久久| 在线观看精品自拍私拍| 久久人人爽国产| 欧美老女人bb| 69视频在线播放| 亚洲国产欧美精品| 亚洲色图18p| 国产精品国产三级国产aⅴ9色| 欧美一级淫片videoshd| 亚洲深夜福利在线| 97久久精品人人澡人人爽缅北| 国产不卡精品视男人的天堂| 一本一道久久a久久精品逆3p| 久久久久久久影院| 97视频在线观看免费| 亚洲综合中文字幕68页| 国产精品视频久久久久| 亚洲精品久久久久中文字幕欢迎你| 亚洲第一精品夜夜躁人人爽| 国产精品久久一区主播| 午夜伦理精品一区| 欧美日韩国产成人高清视频| 日韩在线视频一区| 日韩毛片中文字幕| 91国产美女在线观看| 国产成人在线亚洲欧美| 久久久亚洲欧洲日产国码aⅴ| 国产成人精品综合| 色午夜这里只有精品| 久久久久久亚洲精品中文字幕| 国产精品 欧美在线| 欧美高清视频免费观看| 中文字幕久热精品视频在线| 久久国产精品久久久久久| 亚洲影影院av| 日韩av片免费在线观看| 国产精品视频久久久久| 国产精品女主播视频| 亚洲性无码av在线| 欧美激情啊啊啊| 成人h片在线播放免费网站| 亚洲成年人在线| 精品国产依人香蕉在线精品| 国产精品国产福利国产秒拍| 久久精品青青大伊人av| 欧美电影在线免费观看网站| 久久免费少妇高潮久久精品99| 欧美福利在线观看| yw.139尤物在线精品视频| 亚洲第一免费播放区| 亚洲色图日韩av| 日韩中文字幕在线播放| 一区二区三区动漫| 国产精品久久一区主播| 欧美理论在线观看| 久久99青青精品免费观看| 色婷婷久久一区二区| 国产成人精品在线| 国产精品久久色| 久久av中文字幕| 一本色道久久88综合亚洲精品ⅰ| 26uuu另类亚洲欧美日本一| 亚洲国产日韩欧美在线动漫| 精品成人乱色一区二区| 日韩免费观看高清| 日韩视频免费在线观看| xxx成人少妇69| 主播福利视频一区| 91免费综合在线| 欧美自拍大量在线观看| 欧美国产日韩一区二区在线观看| 国产成人精品久久二区二区91| 美女久久久久久久久久久| 亚洲精品在线不卡| 亚洲精品国精品久久99热一| 日韩欧亚中文在线| 97免费在线视频| 久久久久久久999精品视频| 久久精品亚洲国产| 日韩av在线播放资源| 亚洲自拍偷拍视频| 福利二区91精品bt7086| 亚洲一区二区在线播放| 91在线视频导航| 欧美有码在线观看视频| 人妖精品videosex性欧美| 国产小视频91| 欧美国产精品人人做人人爱| 久久久免费精品| 国产精品pans私拍| 欧美激情一区二区三级高清视频| 国产精品偷伦一区二区| 91在线观看欧美日韩| 日韩av电影在线免费播放| 国产精品揄拍一区二区| 亚洲视频免费一区| 亚洲黄色片网站| 国产精品国产福利国产秒拍| 国产精品老牛影院在线观看| 欧美激情久久久久久| 91免费的视频在线播放| 亚洲欧美另类中文字幕| 色老头一区二区三区在线观看| 日韩免费在线视频| 欧美一级电影在线| 在线视频欧美日韩精品| 黑人巨大精品欧美一区二区免费| 久久久免费精品视频| 国产欧美日韩最新| 国产一区二区三区日韩欧美| 亚洲毛片在线观看| 8x海外华人永久免费日韩内陆视频| 欧美巨乳在线观看| 福利一区福利二区微拍刺激| www.欧美三级电影.com| 成人av.网址在线网站| 亚洲第一区在线观看| 日韩免费在线播放| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久中文字幕在线视频| 最近2019中文字幕第三页视频| 97视频免费在线观看| 精品欧美激情精品一区| 精品无人区乱码1区2区3区在线| 色噜噜亚洲精品中文字幕| 亚洲欧洲中文天堂| 亚洲成年网站在线观看| 成人免费视频网址| 亚洲最大的av网站| 亚洲精品电影网站| 狠狠爱在线视频一区| 午夜精品久久久久久久99热浪潮| 亚洲国产精品小视频| 欧美日韩国产中文精品字幕自在自线| 欧美日韩亚洲一区二区三区| 欧美性猛交xxxx黑人猛交| 久久亚洲一区二区三区四区五区高| 黑人巨大精品欧美一区二区一视频| 欧美色视频日本版| 亚洲国产精品电影在线观看| 91精品视频观看| 欧美成人精品在线播放|