環境:.NET Framework 3.5 / VS 2008,客戶端已裝 .NET 3.5 驗證通過。
using System.Runtime.InteropServices;
using System.Security;
[assembly: ComVisible(true)]
[assembly: Guid("94882155-3B7C-48e3-B357-234D56D8F15E")] // 類型庫 ID
[assembly: AllowPartiallyTrustedCallers] // 允許部分信任呼叫者 (APTCA)
namespace KeyActiveX {
[Guid("94882155-3B7C-48e3-B357-234D56D8F15E")] // 與組件 Guid 一致 → 成為 CLSID
public partial class IdentityKey : UserControl {
// 控制項邏輯
}
}
專案屬性 → 建置 → 勾選 「登錄 COM Interop」。HTML 引用:
<object id="controlbyid" classid="clsid:{94882155-3B7C-48e3-B357-234D56D8F15E}"></object>
用 OLE/COM Object Viewer (oleview.exe) 驗證 `.NET Categories` 下出現組件與 CLSID。
IE 判斷 ActiveX 安全的兩條路徑:
IObjectSafety 介面 (Microsoft 推薦,防止重新封裝竄改)
using System.Runtime.InteropServices;
namespace KeyActiveX {
[ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] // 繼承 IUnknown
public interface IObjectSafety {
[PreserveSig]
void GetInterfaceSafetyOptions(
int riid,
out int pdwSupportedOptions,
out int pdwEnabledOptions);
[PreserveSig]
void SetInterfaceSafetyOptions(
int riid,
int dwOptionsSetMask,
int dwEnabledOptions);
}
}
public partial class IdentityKey : UserControl, IObjectSafety {
#region IObjectSafety Members
public void GetInterfaceSafetyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions) {
pdwSupportedOptions = 1; // INTERFACESAFE_FOR_UNTRUSTED_CALLER
pdwEnabledOptions = 2; // INTERFACESAFE_FOR_UNTRUSTED_DATA
}
public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions) {
// 可選擇實作,拋 NotImplementedException 亦可
throw new NotImplementedException();
}
#endregion
}
回傳固定值告知 IE「此控制項安全」。參考:How to implement IObjectSafety in Visual Basic controls。
| 方式 | 適用場景 | 簽章需求 |
|---|---|---|
| 客戶端安裝包 (MSI/ClickOnce) | 區域網、企業內部 | 測試憑證即可 |
| 線上安裝包 (ClickOnce/Web) | 區域網、需自動更新 | 測試憑證即可 |
HTML codebase 指向 CAB/EXE | 公網、無預先安裝 | 必須受信任 CA 簽章 (VeriSign 等) |
vsdrpCOM
# 1. 建立測試憑證
makecert -sk MyKey -n "CN=MyCorp" C:\mycorp.cer
# 2. 簽章嚮導 (GUI)
signtool signwizard
# 選 Custom → 指定 .cer → 選 SHA1 → 填應用程式名稱/描述 URL → 完成
HTML 引用:
<object id="ctrl" classid="clsid:{...}" codebase="setup.exe"></object>
IE 需啟用「允許未信任的發行者」 (僅測試環境)。正式上線必須購買受信任代碼簽章憑證。
掌握 ComVisible、`IObjectSafety`、簽章部署三部曲,即可打造企業級 ActiveX 控制項,滿足 IE 內嵌、自動安裝、安全合規全需求。