首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 開發 ActiveX 控制項完整指南:COM 可見、IE 安全認證、數位簽章部署

     編輯:關於C#

三大挑戰

  1. .NET 組件對 COM 可見
  2. 客戶端註冊後通過 IE 安全驗證
  3. 未註冊時安裝包通過 IE 簽章驗證

環境:.NET Framework 3.5 / VS 2008,客戶端已裝 .NET 3.5 驗證通過。

階段一:建立 COM 可見組件

1. 組件層級屬性


using System.Runtime.InteropServices;
using System.Security;

[assembly: ComVisible(true)]
[assembly: Guid("94882155-3B7C-48e3-B357-234D56D8F15E")] // 類型庫 ID
[assembly: AllowPartiallyTrustedCallers] // 允許部分信任呼叫者 (APTCA)

2. 控制項類別


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 安全認證 — 實作 IObjectSafety

IE 判斷 ActiveX 安全的兩條路徑:

  1. 實作 IObjectSafety 介面 (Microsoft 推薦,防止重新封裝竄改)
  2. 註冊表 `Implemented Categories` 寫入安全分類 GUID

IObjectSafety 介面定義 (C# 重新宣告)


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 等)

安裝包專案設定

  • 輸出專案 → 主輸出 → 內容 → `Register` 屬性設 vsdrpCOM

測試憑證建立與簽章 (Makecert + SignTool)


# 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 內嵌、自動安裝、安全合規全需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved