首先
建立一個WinForm控件項目HelloWorld
並拖入一個Label控件
文字設為HelloWorld
如圖
UserControlcs內容如下
using System;
using System
Collections;
using System
ComponentModel;
using System
Drawing;
using System
Data;
using System
Windows
Forms;
namespace HelloWorld
{
/**//// <summary>
/// UserControl
的摘要說明
/// </summary>
public class Demo : System
Windows
Forms
UserControl
{
private System
Windows
Forms
Label label
;
/**//// <summary>
/// 必需的設計器變量
/// </summary>
private System
ComponentModel
Container components = null;
public Demo()
{
// 該調用是 Windows
Forms 窗體設計器所必需的
InitializeComponent();
// TODO: 在 InitComponent 調用後添加任何初始化
}
/**//// <summary>
/// 清理所有正在使用的資源
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components
Dispose();
}
base
Dispose( disposing );
}
組件設計器生成的代碼#region 組件設計器生成的代碼
/**//// <summary>
/// 設計器支持所需的方法
不要使用代碼編輯器
/// 修改此方法的內容
/// </summary>
private void InitializeComponent()
{
this
label
= new System
Windows
Forms
Label();
this
SuspendLayout();
//
// label
//
this
label
Location = new System
Drawing
Point(
);
this
label
Name =
label
;
this
label
Size = new System
Drawing
Size(
);
this
label
TabIndex =
;
this
label
Text =
HelloWorld
;
this
label
TextAlign = System
Drawing
ContentAlignment
MiddleCenter;
//
// Demo
//
this
Controls
Add(this
label
);
this
Name =
Demo
;
this
Size = new System
Drawing
Size(
);
this
ResumeLayout(false);
}
#endregion
}
}
此時編譯項目可以生成HelloWorlddll將此dll拷貝到IIS的虛擬根目錄下然後建立一個的文件html代碼如下
<body bgcolor=
#
>
<object id=
helloworld
classid=
#HelloWorld
Demo
Width=
Height=
VIEWASTEXT> </object>
</body>
在IE地址欄中輸入以下地址出現界面
如圖控件已經成功在頁面上顯示了OK我們已經完成了第一步
但是問題到這裡還沒有解決不相信?你可以試試在另外一台機器上測試注意需要修改對應的html代碼和URL地址你可以看到這個在原來顯示控件的地方是一個紅色的叉或者還會彈出一個對話框表示這個控件沒有任何權限出現這個結果是微軟的默認設置造成的作者必須在控件所在的控件的 AssemblyInfocs/vb 中執行一個安全聲明聲明這個控件必須使用賦予的權限才可以顯示出界面我們在AssemblyInfocs中引用SystemSecurity命名空間並添加一句
[assembly : AllowPartiallyTrustedCallers()]
現在重新編譯並且替換以前的dll界面又可以顯示出來了
需要提醒的是到現在為止我們編寫的還不是真正的ActiveX控件這個控件到現在為止還只是能夠實現自身的顯示並且不能實現更多的功能比如實現與腳本的交互或者操作客戶端的注冊表或者磁盤這是由於Net Framework的安全模型所限制的如果我們希望這個控件突破Net Framework安全模型的限制實現與腳本的交互或者操作客戶端的注冊表或者磁盤的話必須要讓它成為真正的ActiveX控件下面我們把剛才的控件變成真正的ActiveX控件
首先使用 工具—〉創建GUID 生成一個GUID並修改UserControlcs文件首先增加引用SystemRuntimeInteropServices命名空間並在Demo前面加入一條語句
注意Guid中的字符串就是你生成的Guid字符串它是你所生成的ActiveX控件的唯一標識符然後修改項目屬性如圖
注意面板中的最後一項我們唯一需要修改的是將其值改為True
重新編譯我們使用 工具—〉OLE/COM對象查看器 查看如圖
可以看到我們寫的HelloWorldDemo已經被正確識別為COM組件現在我們已經可以像使用其它ActiveX控件一樣在網頁中顯示了在HelloWorldDemo點擊鼠標右鍵如圖
選擇Copy HTML <object> Tag to Clipboard可以將代碼拷入剪貼板
現在我們改寫html代碼如下
<body bgcolor=
#
>
<object id=
helloworld
classid=
clsid:
B
B
C
D
D
E
A
Width=
Height=
>
</object>
</body>
使用IE查看我們的控件又可以在網頁中顯示了不過這個時候它已經不再是以前 WinForm控件了而是貨真價實的ActiveX控件了
我們在Demo中加入ShowMessage方法
public void ShowMessage(string msg)
{
if(msg != null)
{
MessageBox
Show(msg);
}
}
我們重新編譯
在重新訪問頁面之前
我們先來修改html代碼
<body bgcolor=
#
>
<object id=
helloworld
classid=
clsid:
B
B
C
D
D
E
A
Width=
Height=
>
</object>
<br>
<input type=
button
onclick=
helloworld
ShowMessage(
Hello World!
)
value=
Click
>
</body>
現在
重新訪問
單擊Click按鈕
應該可以實現交互了
但是結果卻很遺憾
我們發現IE跳出了對話框
如圖所示
單擊確定之後
我們發現JS報錯
根據提示
我們判斷可以通過修改IE的設置使控件運行
打開IE的 工具——〉Internet選項——〉安全——〉本地Intranet——〉自定義級別——〉對沒有標記為安全的ActiveX控件進行初始化和運行
將其值設為啟用
我們刷新頁面
現在終於可以正確運行了
當然
我們不能指望我們的客戶和我們一樣修改這個值
畢竟
一是操作麻煩
二是給電腦帶來了很大的安全風險
在互聯網上搜索之後
發現必須要實現IObjectSafety接口
把ActiveX控件標記為安全的ActiveX控件
在搜索MSDN之後
我找到了IObjectSafety接口的定義
這就好辦了
首先我們自己用C#實現這個接口
[Guid(
CB
BDC
C
CF
F
F
CD
)
InterfaceType(ComInterfaceType
InterfaceIsIUnknown)]
public interface IObjectSafety
{
// methods
void GetInterfacceSafyOptions(
System
Int
riid
out System
Int
pdwSupportedOptions
out System
Int
pdwEnabledOptions);
void SetInterfaceSafetyOptions(
System
Int
riid
System
Int
dwOptionsSetMask
System
Int
dwEnabledOptions);
}
注意
這個GUID是不能改的
然後
我們在Demo類裡面實現這個接口
增加一下代碼
IObjectSafety 成員#region IObjectSafety 成員
public void GetInterfacceSafyOptions(Int
riid
out Int
pdwSupportedOptions
out Int
pdwEnabledOptions)
{
// TODO: 添加 WebCamControl
GetInterfacceSafyOptions 實現
pdwSupportedOptions =
;
pdwEnabledOptions =
;
}
public void SetInterfaceSafetyOptions(Int
riid
Int
dwOptionsSetMask
Int
dwEnabledOptions)
{
// TODO: 添加 WebCamControl
SetInterfaceSafetyOptions 實現
}
#endregion
重新編譯然後將IE裡面的設置改回來現在我們發現和JS的交互已經沒有問題了
在前面我們已經完成了ActiveX控件的開發接下來的就是發布它了
首先我們建立一個windows安裝項目並將ActiveX控件的主輸出添加到項目輸出中然後改動ActiveX控件的主輸出文件將其Register屬性改為vsdrpCOM如圖:
下一步我們改動項目屬性將引導程序更改為 Web引導程序很遺憾的是在 Web引導程序設置 中的安裝文件夾URL中必須使用絕對路徑不能使用相對路徑這意味著生成安裝程序的時候就必須確定路徑不是很方便在示例中我使用了localhost在發布中可以改為實際的域名
現在我們生成安裝程序並把相應得程序拷貝到正確的目錄中(本例中為默認網站目錄下的ActiveX文件夾中)我們可以直接執行SetupExe文件以驗證安裝文件的正確性在我的機器上正確執行了成功了!
現在我們又要重新改動文件了修改後的結果如下
<body bgcolor=#>
<object id=helloworld
classid=clsid:BBCDDEA Width= Height= codebase=ActiveX/SetupExe
>
</object>
<br>
<input type=button onclick=helloworldShowMessage(Hello World!) value=Click>
</body>
注意我們在object塊中加入了codebase屬性這就是制定的下載控件的位置可以使用相對路徑別忙我們現在還不能正確請求這個頁面因為我們還沒有對我們的控件進行簽名簽名可以采用兩種方式一種是在上面生成安裝程序的時候簽名另一種是使用snexe簽名推薦大家使用後者因為可以提供更多選項本人很懶就不多寫了大家可以參考csdn上的文章《發布ActiveX》先給給大家提個醒在申請證書的時候選擇 高級證書申請
From:http://tw.wingwit.com/Article/program/net/201311/13684.html