前言:html
這段時間由於工做的須要,研究了一下ActiveX控件。總結以下:web
先說說ActiveX的基本概念。windows
根據微軟權威的軟件開發指南MSDN(Microsoft Developer Network)的定義,ActiveX插件之前也叫作OLE控件或OCX控件,它是一些軟件組件或對象,能夠將其插入到WEB網頁或其它應用程序中。瀏覽器
ActiveX是Microsoft對於一系列策略性面向對象程序技術和工具的稱呼,其中主要的技術是組件對象模型(COM)。在有目錄和其它支持的網絡中,COM變成了分佈式COM(DCOM)。在建立包括ActiveX程序時,主要的工做就是組件,一個能夠自足的在ActiveX網絡(如今的網絡主要包括Windows和Mac)中任意運行的程序。這個組件就是ActiveX近控件。ActiveX是Microsoft爲抗衡Sun Microsystems的JAVA技術而提出的,此控件的功能和JAVA applet功能相似。安全
目前支持ActiveX的主要是IE瀏覽器。網絡
之前ActiveX開發廣泛使用VC++或VB,隨着C#和.net的發佈,用C#開發ActiveX控件變得更方便、更簡單。但須要注意的是用C#開發 的ActiveX控件須要客戶機裝有.net framework,有點鬱悶。但是相對.net強大的功能良好的易用性,這點犧牲仍是值得的,何況如今好多計算機已經安裝有.net framework了。app
其實.net下的winform控件也是能夠直接嵌入到web網頁裏的,可是因爲.net安全性的限制,沒法在客戶端實現複雜的操做,好比磁盤空間操做和註冊表操做。由於ActiveX控件是以本地用戶的身份運行,能夠突破.net安全性的限制,因此開發ActiveX控件仍是很必要的。分佈式
C#寫ActiveX控件的原理很簡單,就是使用了.net平臺和COM的互操做性。修改項目屬性的目的就是將.net控件註冊爲com。這樣,你就能夠把這個控件徹底看成ActiveX控件來對待了。好比,可使用JS和VBS來調用,也可使用C++來調用。工具
下面一步步來實現C#寫ActiveX控件。post
第一部分:用vs2008製做一個winForm控件
用vs2008創建一個新的「windows窗體控件庫」命名爲「WindowsFormsControlLibrary1」以下圖
點擊肯定後,將UserControl1.cs改名爲demo.cs。向界面裏添加一個Labal、一個TextBox和一個Button,相應的修改控件屬性。以下圖:
爲button1添加Click事件,代碼以下:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = textBox1.Text;
}
在AssemblyInfo.cs中引用System.Security命名空間,並添加一句:
[assembly : AllowPartiallyTrustedCallers()]
好,如今編譯整個工程,生成\bin\Debug\WindowsFormsControlLibrary1.dll,咱們的winform控件就作好了。
下面在解決方案裏添加一個web應用程序的工程,名爲WebApplication1,用來測試咱們的控件。
將WindowsFormsControlLibrary1.dll拷貝到WebApplication1所在的目錄下。而後在Default.aspx 裏面加入「<object id="helloworld" classid='http://localhost:59639/WindowsFormsControlLibrary1.dll#WindowsFormsControlLibrary1.demo' width="184" height="96" >
</object>
ok,編譯運行後你將看到以下界面:
第二部分:把這個winForm控件轉換爲ActiveX控件
到目前爲止,咱們所實現的只是winform控件,還不是真正的ActiveX控件。
鼠標右鍵,打開WindowsFormsControlLibrary1的工程屬性,在「應用程序」裏點擊「程序集信息...」顯示以下界面:
選中「使程序集COM可見」,而後肯定。
進入「生成」頁面,以下圖:
選中「爲COM互操做註冊」。
從新編譯工程,這時WindowsFormsControlLibrary1.dll就變成了一個ActiveX控件。
咱們使用 工具—〉OLE/COM對象查看器查看,如圖:
WindowsFormsControlLibrary1.demo已經被正確識別爲COM組件。如今,咱們已經能夠像使用其它ActiveX控件同樣在 網頁中顯示了。在WindowsFormsControlLibrary1.demo點擊鼠標右鍵,選擇Copy HTML <object> Tag to Clipboard,能夠將代碼拷入剪貼板。
咱們在 Default.aspx 中粘貼剪貼板的內容,以下:
<object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F" width="184">
</object>
編譯運行整個工程,咱們會在網頁中看到以前的內容。好,如今咱們的控件已是貨真價實的ActiveX控件了。
第三部分:實現ActiveX控件與網頁的交互
咱們在Demo中加入s1屬性:
private string _s1;
public string s1
{
get
{
return _s1;
}
set
{
_s1 = value;
}
}
咱們在Demo中加入ShowMessage方法:
public void showMessage()
{
MessageBox.Show(_s1);
}
修改Default.aspx 中的內容:
<object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F"
width="184">
<param name="s1" value="用param傳遞控件屬性"/>
</object>
<input type='button' onclick='helloworld.ShowMessage()' value='用param傳遞控件屬性'/>
<input type='button' onclick='helloworld.s1="用js和控件交互"; helloworld.ShowMessage()' value='用js和控件交互'/>
好,編譯運行整個工程,顯示以下:
點擊單擊「用js和控件交互」按鈕,應該能夠實現交互了。
可是結果卻很遺憾,咱們發現IE跳出了對話框,如圖所示
這時咱們經過修改IE安全屬性「對沒有標記爲安全的ActiveX控件進行初始化和運行」能夠繞過這個問題,可是要真正解決須要實現IObjectSafety接口,把ActiveX控件標記爲安全的ActiveX控件。
首先在工程裏添加一個接口,命名爲IObjectSafety.cs,代碼以下:
using System;
using System.Runtime.InteropServices;
namespace WindowsFormsControlLibrary1
{
[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);
}
}
注意添加命名空間「using System.Runtime.InteropServices」,Guid必定不能搞錯。
而後在demo類裏添加繼承,以下:
public partial class demo : UserControl, WindowsFormsControlLibrary1.IObjectSafety
{...}
最後在demo類裏實現兩個特定方法:
public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TODO: 添加 WebCamControl.GetInterfacceSafyOptions 實現
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TODO: 添加 WebCamControl.SetInterfaceSafetyOptions 實現
}
從新編譯,而後將IE裏面的設置改回來。如今,咱們發現,和JS的交互已經沒有問題了。
在前面咱們已經完成了ActiveX控件的開發,接下來的就是發佈它了。
第四部分:製做安裝包
在解決方案了添加一個「安裝」項目,命名爲SetupActiveX。
在項目的「應用程序文件夾」裏添加「主輸出項目」WindowsFormsControlLibrary1
將主輸出項目」WindowsFormsControlLibrary1的Register屬性改成vsdrpCOM.如圖:
如今咱們生成安裝程序,並把相應得程序拷貝到正確的目錄中(本例中爲默認網站目錄下的跟文件夾中)。
如今咱們又要從新改動Default.aspx 文件了。修改後的結果以下:
<div>
<object id="helloworld" classid="clsid:A82F92E1-BA7F-3B32-B389-584E8AB4441F"
width="184"
codebase="Setup.exe">
<param name="s1" value="用param傳遞控件屬性"/>
</object>
<input type='button' onclick='helloworld.ShowMessage()' value='用param傳遞控件屬性'/>
<input type='button' onclick='helloworld.s1="用js和控件交互"; helloworld.ShowMessage()' value='用js和控件交互'/>
</div>
注意,咱們在object塊中加入了codebase屬性,這就是制定的下載控件的位置,可使用相對路徑。
可是,咱們如今還不能正確請求這個頁面,由於咱們尚未對咱們的控件進行簽名。爲了繞過這個問題,咱們能夠修改IE的安全屬性"對沒有標記爲安全的ActiveX控件進行初始化和腳本運行"和"下載未簽名的ActiveX控件"。
第五部分:給安裝包簽名
對於 Internet 應用程序的開發人員和用戶而言,代碼安全是一個主要問題。有下列風險:惡意的代碼、被篡改的代碼和來自未知站點或做者的代碼。
Internet 開發時有兩種保證安全的基本方法。第一種方法稱爲「沙箱」。在此方法中,應用程序只能訪問一組特定的API,而且被從潛在危險的 API(如文件 I/O,程序可能在此毀壞用戶計算機中的數據)中排除。第二種方法使用數字簽名來實現。此方法對 Internet 稱爲「收縮包裝」。使用私匙/公匙技術驗證和簽名代碼。在代碼運行以前,驗證其數字簽名,確保該代碼的來源是已知的而且通過驗證,而且自簽名後該代碼未被 更改過。
在第一種情形中,信任應用程序不會有任何損害,而且信任該應用程序的來源。在第二種情形中,使用數字簽名來驗證真僞。數字簽名是用於識別和提供關於代碼發行者的詳細資料的工業標準。其技術基於標準,包括 RSA 和 X.509。瀏覽器通常容許用戶選擇是否但願下載並運行來源未知的代碼。
給文件簽名首先要得到軟件發行證書。爲此,必須向證書頒發機構提出請求(好比微軟或其餘認證代理機構)。在申請期間,必須生成一個密匙對並向證書頒發機構提供標識信息(如名字、地址和公匙)。還必須做出在法律上具備約束力的保證,即保證您不能也不會分發您知道或本應知道含有病毒或將以其餘方式惡意損害用戶的計算機或代碼的軟件。固然,這種認證是收費的,通常在2——8KRMB不等。
這裏,咱們使用Microsoft.Net帶的MAKECERT和CERT2SPC實用工具生成測試的軟件發行證書。而後用這個測試證書經過 SignTool工具爲咱們的發行包簽名,固然,這對軟件發行是無效的,也就是說在Internet環境下仍是須要修改IE安全設置才能夠下載安裝。可是在局域網環境下能夠實現直接下載安裝,僅可用於測試代碼簽名。
MAKECERT.exe、CERT2SPC.exe和SignTool.exe三個工具在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin 目錄下。你能夠經過vs2008的「Visual Studio 2008 Command Prompt」 進入命令行狀態,這時系統會自動加載對應的Path參數,你在任何一個目錄下均可以直接運行着三個小工具了。
一、用MAKECERT.exe建立用於數字簽名的公鑰和私鑰對
在命令行下輸入「makecert -ss lwchome -n "CN=lwchome CRD公司" -sv d:\test\lwchomecert.pvk -r d:\test\wchomecert.cer」
其中ss-主題的證書存儲名稱, n-證書頒發對象,此名稱必須符合 X.500 標準。最簡單的方法是在雙引號中指定此名稱,並加上前綴 CN=;例如,"CN=myName"。注意這裏的CN必須大寫。-r-證書存儲位置,-sv 導出私鑰文件(爲了簽名使用)。注意:這個時候會讓輸入三次密碼,三次要徹底一致。
二、用Cert2Spc.exe生成spc發行者證書:cert2spc d:\test\lwchomecert.cer d:\test\lwchomecert.spc
三、用SignTool.exe對安裝包數字簽名
在命令行下輸入「signtool signwizard」,會彈出簽名工具界面以下:
點擊下一步,輸入安裝包的位置:
點擊下一步,選擇「自定義」
點擊下一步,從文件選擇:
選擇剛剛製做的證書d:\test\lwchomecert.spc,點擊下一步:
選擇磁盤上的私密鑰文件,選中剛剛生成的私密鑰d:\test\lwchomecert.pvk ,而後點擊下一步,輸入剛剛的密碼顯示以下界面:
選擇md5,點擊下一步:
此頁無需修改,直接點擊下一步:
輸入描述和web位置,點擊下一步:
添加時間戳http://timestamp.verisign.com/scripts/timstamp.dll,點擊下一步:
完成輸入剛剛的密碼便可。
這時,鼠標右擊安裝包文件「setup.exe」,能夠查看數字簽名信息:
若是是正式發行,請從微軟或代理機構申請正式證書和密鑰,而後用signtool工具加密你的發行包便可。
第六部分:部署
將簽名的setup.exe拷貝到網站目錄下,替換以前沒有簽名的安裝包。用iis發佈網站,注意「執行權限選擇純腳本」