利用雙休的時(shí)間研究了一下c#開(kāi)發(fā)ActiveX控件。由于我用Vs2010開(kāi)發(fā),參考的文章不是Vs2010和Win7的環(huán)境下開(kāi)發(fā)的,中間遇到許多問(wèn)題,不過(guò)總算學(xué)到點(diǎn)東西。
我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、中站ssl等。為超過(guò)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的中站網(wǎng)站制作公司
一. 建立ActiveX控件(暫時(shí)稱為ActiveX控件,其實(shí)是winform下的用戶控件)。
1.打開(kāi)vs2010,新建空年方案。方案名稱自己取。
然后,新建項(xiàng)目->Visual C#->Windows->類(lèi)庫(kù),名稱為HelloWorld。
2. 刪除自動(dòng)創(chuàng)建的Class1.cs文件,然后在HelloWorld上右鍵->添加->新建項(xiàng),在彈出的窗口中選擇“用戶控件”,名稱為Demo,此時(shí)會(huì)出現(xiàn)一個(gè)類(lèi)似于winform設(shè)計(jì)界面,我們?cè)谏厦鎻墓ぞ呦渲型蟿?dòng)一個(gè)Label在上面,并設(shè)定Label的Text為"HelloWorld"。
此時(shí)編譯項(xiàng)目,可以生成HelloWorld.dll。 將此dll拷貝到IIS的虛擬根目錄下,然后在虛擬目錄的物理目錄下建立一個(gè)helloworld.htm的文件,html代碼如下:
body bgcolor='#223344'>
object id="helloworld" classid=’http://localhost/HelloWorld.dll#HelloWorld.Demo’ Width="184" Height="96" VIEWASTEXT> object>
body>
注:我們可以在Object的classid中使用“http://localhost/類(lèi).dll#命名空間.類(lèi)名”這樣的方式使用未注冊(cè)的控件(此時(shí)還不能稱為ActiveX)。
3、測(cè)試:在IE地址欄中輸入以下地址:http://localhost/helloworld.htm,出現(xiàn)下圖界面,控件已經(jīng)成功在頁(yè)面上顯示了。OK,我們已經(jīng)完成了第一步。
但是問(wèn)題到這里還沒(méi)有解決。不相信?你可以試試在另外一臺(tái)機(jī)器上測(cè)試,注意需要修改對(duì)應(yīng)的html代碼和URL地址。你可以看到這個(gè)在原來(lái)顯示控件的地方是一個(gè)紅色的叉,或者還會(huì)彈出一個(gè)對(duì)話框,表示這個(gè)控件沒(méi)有任何權(quán)限。出現(xiàn)這個(gè)結(jié)果是微軟的默認(rèn)設(shè)置造成的,必須在控件項(xiàng)項(xiàng)目中Properties下AssemblyInfo.cs中增加一個(gè)安全聲明,聲明這個(gè)控件必須使用賦予的權(quán)限,才可以顯示出界面。添加語(yǔ)句如下:
//設(shè)置控件的權(quán)限
[assembly: System.Security.AllowPartiallyTrustedCallers()]
現(xiàn)在重新編譯,并且替換以前的dll,界面又可以顯示出來(lái)了。
到現(xiàn)在為止,我們編寫(xiě)的還不是真正的ActiveX控件。這個(gè)控件只是能夠?qū)崿F(xiàn)自身的顯示,并且不能實(shí)現(xiàn)更多的功能,比如實(shí)現(xiàn)與腳本的交互或者操作客戶端的注冊(cè)表或者磁盤(pán)。這如果我們希望這個(gè)控件突破.Net Framework安全模型的限制,實(shí)現(xiàn)與腳本的交互或者操作客戶端的注冊(cè)表或者磁盤(pán)的話,必須要讓它成為真正的ActiveX控件。
二. 將用戶控件變成Com可見(jiàn)
1.在HelloWorld(用戶控件)項(xiàng)目上點(diǎn)擊右鍵,選擇屬性,將打開(kāi)項(xiàng)目屬性面板,選擇應(yīng)用程序標(biāo)簽頁(yè),點(diǎn)擊“程序集信息”按鈕,在彈出的窗口中勾選“使程序集COM可見(jiàn)”(下圖為別人的圖片,僅供參考)
2.切換到生成標(biāo)簽頁(yè),然后勾選“為Com互操作注冊(cè)”,在該頁(yè)面的最上面,有一個(gè)配置選項(xiàng),切換到realse,并再次勾選“為Com互操作注冊(cè)”。這樣無(wú)論是在debug還是在release狀態(tài)下,都可以把用戶控件當(dāng)做com接口使用。如下圖。(如果不使用realse模式,realse可以不設(shè)置。)
注意:在Win7中,溝選“為Com互操作注冊(cè)”后,如果不是Administrtor用戶,編譯項(xiàng)目會(huì)出錯(cuò)。所以一定要記得在Administrator下編寫(xiě)代碼。
3、修改用戶控件后臺(tái)代碼,代碼如下,
using System.Runtime.InteropServices;
namespace HelloWorld
{
[Guid("F3F99F87-276D-4F7C-96F9-85F5261773CD")]
public partial class Demo: UserControl
{
public Demo()
{
InitializeComponent();
}
}
}
注:創(chuàng)建Guid的方法如下:
在vs2010中,工具->創(chuàng)建GUID,在彈出的窗口中,在GUID格式中選擇第五個(gè),點(diǎn)擊新建GUID,然后點(diǎn)擊復(fù)制,然后在點(diǎn)擊退出,此時(shí)返回到VS2010中,在相應(yīng)位置粘貼即可。
重新編譯,使用VS2010編譯后,此控件會(huì)自動(dòng)被注冊(cè)在系統(tǒng)中。我們只需要在“OLE/COM對(duì)象查看器”中點(diǎn)Grouped by Component Category->.Net Category->點(diǎn)擊你編寫(xiě)的類(lèi)庫(kù)名.用戶控件類(lèi)查看。如下圖。“OLE/COM對(duì)象查看器”位于開(kāi)始菜單->Vs2010安裝目錄->Microsoft Windows SDK Tools中。
可以看到,我們寫(xiě)的HelloWorld.Demo已經(jīng)被正確識(shí)別為COM組件?,F(xiàn)在,我們已經(jīng)可以像使用其它ActiveX控件一樣在網(wǎng)頁(yè)中顯示了。在HelloWorld.Demo點(diǎn)擊鼠標(biāo)右鍵,如圖:
選擇Copy HTML Tag to Clipboard,可以將代碼拷入剪貼板。
現(xiàn)在,我們改寫(xiě)helloworld.htm,html代碼如下:
body bgcolor='#223344'>
="helloworld"
classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" Width="184" Height="96">
object>
body>
使用IE查看,我們的控件又可以在網(wǎng)頁(yè)中顯示了。不過(guò),這個(gè)時(shí)候它已經(jīng)不再是以前的.net WinForm控件了,而是貨真價(jià)實(shí)的ActiveX控件了。
不過(guò),編寫(xiě)ActiveX控件的任務(wù)還沒(méi)有完成。我們還沒(méi)有實(shí)現(xiàn)腳本互動(dòng)或者讀寫(xiě)I/O,也沒(méi)有實(shí)現(xiàn)ActiveX控件的自動(dòng)分發(fā)。
三. 實(shí)現(xiàn)與Js交互
我們?cè)贒emo中加入ShowMessage方法:
public void ShowMessage(string msg)
{
if(msg != null)
{
MessageBox.Show(msg);
}
}
我們重新編譯。在重新訪問(wèn)頁(yè)面之前,我們先來(lái)修改html代碼:
body bgcolor='#223344'>
="helloworld"
classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" Width="184" Height="96"
>
object>
br>
input type='button' onclick='helloworld.ShowMessage(“Hello World!”)' value='Click'>
>
現(xiàn)在,重新訪問(wèn)http://localhost/helloworld.htm,單擊Click按鈕,應(yīng)該可以實(shí)現(xiàn)交互了。
但是結(jié)果卻很遺憾,我們發(fā)現(xiàn)IE跳出了對(duì)話框,(注,我在編寫(xiě)此項(xiàng)目時(shí),好像沒(méi)有跳出這個(gè)提示。)如圖所示:
單擊確定之后,我們發(fā)現(xiàn)JS報(bào)錯(cuò)。根據(jù)提示,我們判斷可以通過(guò)修改IE的設(shè)置使控件運(yùn)行。打開(kāi)IE的 工具——〉Internet選項(xiàng)——〉安全——〉
本地Intranet——〉自定義級(jí)別——〉對(duì)沒(méi)有標(biāo)記為安全的ActiveX控件進(jìn)行初始化和運(yùn)行,將其值設(shè)為啟用。我們刷新頁(yè)面,現(xiàn)在終于可以正確運(yùn)行了。
當(dāng)然,我們不能指望我們的客戶和我們一樣修改這個(gè)值。畢竟,一是操作麻煩,二是給電腦帶來(lái)了很大的安全風(fēng)險(xiǎn)。所以需要自義IObjectSafety接口,并讓UserControl實(shí)現(xiàn)接口。
首先我們自己用C#定義這個(gè)接口,此接口必須與下邊接口代碼相同,包括Guid值都要一樣。
using System.Runtime.InteropServices;
namespace HelloWorld
{
[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);
}
public class CLsObjectSafety
{
public const System.Int32 INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
public const System.Int32 INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
}
}
在UserControl后臺(tái)實(shí)現(xiàn)接口,代碼如下。
using System.Runtime.InteropServices;
namespace HelloWorld
{
[Guid("F3F99F87-276D-4F7C-96F9-85F5261773CD")]
public partial class Demo: UserControl,IObjectSafety
{
public Demo()
{
InitializeComponent();
}
public void ShowMessage(string msg)
{
if (msg != null)
{
MessageBox.Show(msg);
}
}
public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TODO: 添加WebCamControl.GetInterfacceSafyOptions 實(shí)現(xiàn)
pdwSupportedOptions = CLsObjectSafety.INTERFACESAFE_FOR_UNTRUSTED_CALLER;
pdwEnabledOptions = CLsObjectSafety.INTERFACESAFE_FOR_UNTRUSTED_DATA;
}
public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TODO: 添加WebCamControl.SetInterfaceSafetyOptions 實(shí)現(xiàn)
}
}
}
重新編譯,然后將IE里面的設(shè)置改回來(lái)。現(xiàn)在,我們發(fā)現(xiàn),和JS的交互已經(jīng)沒(méi)有問(wèn)題了。
這樣,一個(gè)最基本的ActiveX控件已經(jīng)寫(xiě)好了。你可以在這個(gè)控件的基礎(chǔ)上增加任何你需要的功能。到這里,編寫(xiě)控件的任務(wù)已經(jīng)完成了。
四.打包并發(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)目如下圖所示:
創(chuàng)建一個(gè)Windows 安裝項(xiàng)目,并給項(xiàng)目添加項(xiàng)目輸出,如下圖所示:
在添加項(xiàng)目輸出時(shí),我們將ActiveX項(xiàng)目添加進(jìn)來(lái),在項(xiàng)目中選擇ActiveX控件項(xiàng)目(CardReader.Controls),Primary Out(基本輸出),如下圖所示:
添加完文件后,設(shè)置Primary Output From CardReader.Controls的Register屬性為vsdrpCOM。
設(shè)置完成后右擊安裝工程,修改安裝工程屬性,如下圖所示:
在上圖中可以設(shè)置輸出的文件名,這個(gè)文件名就是打包后安裝文件.MSI的文件名。設(shè)置包文件、壓縮方式,CAB size,這三項(xiàng)均選擇默認(rèn)值即可。
最后設(shè)置安裝URL,這里的安裝URL是用來(lái)發(fā)布或者使用ActiveX的URL地址的。(此處我沒(méi)弄明白這個(gè)地址到底有什么用?)
注:打包成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)行。
這樣打包文件就生成了,將生成后的安裝文件(exe和msi)拷貝到(本例中為默認(rèn)網(wǎng)站目錄下的ActiveX文件夾中),現(xiàn)在我們又要重新改動(dòng)helloworld.htm文件了。修改后的結(jié)果如下:
body bgcolor='#223344'>
object id="helloworld"
classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" Width="184" Height="96" codebase="Setup.exe">
object>
br>
input type='button' onclick='helloworld.ShowMessage("Hello World!")' value='Click'>
body>
注意,我們?cè)趏bject塊中加入了codebase屬性,這就是制定的下載控件的位置,可以使用相對(duì)路徑。當(dāng)使用codebase進(jìn)行安裝時(shí),Ie仍然會(huì)攔截,不允許安裝。需要將當(dāng)前網(wǎng)站添加到信任站點(diǎn)中。如果這樣的話,可以直接給個(gè)鏈接讓用戶自已下載安裝。對(duì)于這兩種方法需要待觀察。
別忙,我們現(xiàn)在還不能正確請(qǐng)求這個(gè)頁(yè)面,因?yàn)槲覀冞€沒(méi)有對(duì)我們的控件進(jìn)行簽名。
簽名可以采用兩種方式,一種是在上面生成安裝程序的時(shí)候簽名,另一種是使用sn.exe簽名。推薦大家使用后者。
網(wǎng)站題目:C#編寫(xiě)ActiveX控件
URL鏈接:http://chinadenli.net/article14/gphcge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、移動(dòng)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)