天天看點

使用.net framework 2.0用c#編寫ActiveX控件(編寫,部署,更新更新)

  Net Framework已經越來越普及,不過在使用.net framework 2.0編寫ActiveX插件方面。相關的介紹比較少,而且因為net framework版本的原因,一些1.0 Framework的編寫方法并不适用于.net framework 2.0版本,筆者就在此簡單地介紹一下自己對.net framework2.0 編寫ActiveX控件的一些心得體會。本文包括了如何編寫,部署,還有更新ActiveX控件  首先提及一下本人參考的幾篇文章,國内廣為轉載的那篇介紹如何使用C#的程式的文章的出處就是:http://www.cnblogs.com/homer/archive/2005/04/01/86473.html(一共三篇)還有一個中文的說明http://www.dvpx.com/index_article_display.aspx?Fid=10&id=74筆者也是從這一個文章作為起點的。可是這篇文章在ActiveX包的釋出一部分說的不是很全面。而且更加關鍵的是不知道是因為.net framework版本的原因或是因為作者的疏忽。裡面關于一個Com口的聲明有錯誤。  首先指出錯誤的地方:在文章中IObjectSafety的聲明如下[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IObjectSafety { // methods void GetInterfacceSafyOptions( System.Int32 riid, out System.Int32 pdwSupportedOptions, out System.Int32 pdwEnabledOptions); void SetInterfaceSafetyOptions( System.Int32 riid, System.Int32 dwOptionsSetMask, System.Int32 dwEnabledOptions); }

  可是這樣的聲明并不能起到相應的作用。接口聲明出錯。正确的聲明見如下網頁http://www.pinvoke.net/default.aspx/Interfaces/IObjectSafety.html

  其次還有所一下關于CAB包部署方面的步驟

  其中文章裡面的[hook1]run= msiexec /i %EXTRACT_DIR%/ActiveXInstaller.msi /qn這個就是在Cab包解壓縮後自動運作的檔案。

  從網上查詢來看,絕大部分的ActiveX Cab包的部署都是通過C++所寫的Dll來作為示範的,而C#同C++寫成的Dll還是有所差別的。下面是一個我參考過的的關于部署的例子http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,df3f1be8-62bc-491c-935e-570ebfe53164.aspx

  現在說說我的想法

  我知道的部署方式有兩種。

  第一種比較麻煩,就是使用regasm指令來部署比較熟悉部署C++的ActiveX的人都知道regsvr32是注冊c++寫的ActiveX包的指令。而regasm則是注冊在.net Framework下編寫的ActiveX的指令。具體的步驟就是在上面的Cab1中文run= regasm/i %EXTRACT_DIR%/xxxx.dll /codebase (xxxx.dll為打包進入的dll檔案)(方式和部署C++寫的ActiveX的Dll差不多,隻是把regsvr32指令替換成為regasm)

  第二種也是比較好的(包括未來的更新)就是使用VS自帶的安裝程式進行安裝具體思路如下在ActiveX的Solution中加入一個Setup Project工程,添加一個Project OutPut把ActiveX的工程加入該Project OutPut中。之後Register屬性應該為True這個時候就可以生成一個安裝檔案。在打包CAB包中應該把Setup Project生成的打包裝入msi檔案打包放入Cab包中而且編寫其inf檔案

  注:關于如何制作CAB包可以參考以下文章http://blog.joycode.com/felix/articles/32905.aspx關于Cab包的格式可以參考以下文章http://msdn.microsoft.com/library/default.asp?url=/workshop/delivery/download/overview/infarchitecture.asp?frame=true

  接下來是更新。用C#寫的ActiveX的問題在于注冊後所看見的ActiveX版本号也正是.net Framework的版本号,而不是Dll檔案的版本号。是以用原來的ActiveX更新方式有問題。不過可以正好利用Setup Project的更新方式。進行更新。

  把Setup Project的RemovePreviousVersion屬性設定為True這樣。自動删除之前的版本。Setup Project是用一個GUID來标示是否是同一個SetUP Project。(注不是ActiveX的GUID)。是以在寫了新的版本的時候。需要更新用戶端的ActiveX可以使用如下步驟

  1.改變ActiveX的GUID(不是Setup Project)的GUID。

  2.提升Setup Project的版本号。

  3.改變網頁中的ActiveX的classid為新的ActiveX的ID

  這個時候。當使用者登陸網頁時就會因為發現了新的ActiveX控件提示下載下傳(GUID改變)。而下載下傳後的安裝程式使用Setup Project的GUID發現已經安裝了舊版本。先解除安裝舊的安裝版本。再解除安裝就安裝版本的時候。已經自動地把舊的ActiveX給登出了。