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

C# 開發 ActiveX 控制項(一):從 WinForms UserControl 到 COM 元件的完整入門

     編輯:關於C語言

前言

ActiveX 控制項曾是 Web 應用擴展瀏覽器功能的主流技術(特別在 IE 環境)。雖然現代 Web 標準已轉向 HTML5/JS/WebAssembly,但在企業內部舊系統維護、特定硬體整合、簽章掃描等場景,ActiveX 仍有剛性需求。本系列將示範如何用熟悉的 C# 與 WinForms 開發真正可在網頁載入的 ActiveX 控制項。

建立基礎 WinForms 控制項專案

  1. Visual Studio → New Project → Windows Forms Control Library(專案名:HelloWorld)。
  2. 工具箱拖入 Label,設定 Text="HelloWorld"、AutoSize=true。
  3. 預設類別名為 UserControl1,重命名為 Demo.cs(類別名同步改為 Demo)。

關鍵設定:允許部分信任呼叫者 (APTCA)

預設 .NET 組件不允許來自網頁(部分信任)的呼叫。必須在 AssemblyInfo.cs 加入:

using System.Security;
[assembly: AllowPartiallyTrustedCallers()]

否則在非開發機器瀏覽網頁時會出現紅叉或權限錯誤。

轉換為真正的 COM/ActiveX 控制項

1. 指定 GUID 與 ComVisible


using System.Runtime.InteropServices;

[Guid("9551B223-6188-4387-B293-C7D9D8173E3A")] // 使用 VS「工具」→「建立 GUID」產生
[ComVisible(true)]
public class Demo : UserControl
{
    // ...
}

GUID 必須固定,它是控制項在登錄表與網頁 classid 的唯一識別碼。

2. 專案屬性:註冊為 COM Interop

  • 專案右鍵 → Properties → Build → 勾選 Register for COM interop。
  • 此設定會在建置時自動執行 regasm /codebase 註冊組件至登錄表(需管理員權限)。

專案屬性 Register for COM interop

驗證 COM 註冊與產生 HTML 標籤

  1. 建置專案(產生 HelloWorld.dll)。
  2. 開啟 OLE/COM Object Viewer (oleview.exe),展開 All Objects,搜尋 HelloWorld.Demo,確認顯示為 COM 物件。
  3. 右鍵該物件 → Copy HTML <object> Tag to Clipboard,貼上即得標準標籤:
<object id="helloworld" classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" width="184" height="96"></object>

網頁測試:兩種載入方式

方式一:直接引用 DLL(僅限開發/內網測試)

<object id="helloworld" classid="https://localhost/HelloWorld.dll#HelloWorld.Demo" width="184" height="96"></object>

此方式需將 DLL 放在 IIS 虛擬目錄,且不支援跨網域/正式部署。

方式二:標準 classid(正式部署必須)

<object id="helloworld" classid="clsid:9551B223-6188-4387-B293-C7D9D8173E3A" width="184" height="96"></object>

瀏覽器依 CLSID 查詢登錄表,找到對應 DLL 載入。此為標準 ActiveX 載入機制。

常見問題排查

  • 紅叉/不顯示:
    ① 未勾選「Register for COM interop」或未以管理員身分建置。
    ② 缺少 [assembly: AllowPartiallyTrustedCallers()]。
    ③ 用戶端未安裝 .NET Framework 對應版本。
  • 跨機器測試失敗:必須在目標機器執行 regasm /codebase HelloWorld.dll(或執行安裝程式)完成註冊。
  • 安全性警告:參考下一篇《實作 IObjectSafety 標記安全》解決。

總結

本文完成了 C# ActiveX 控制項的「最小可行產品」:WinForms UserControl → APTCA → Guid+ComVisible → COM Interop 註冊 → classid 網頁載入。此為後續擴充功能(JS 互動、檔案/登錄存取、自動部署、代碼簽章)的基石。

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